在R中进行三维样条插值

4

我想对一些值进行曲面拟合:

x = 1:10
y = 10:1
z = sample(1:10,10)

我想要实现类似于 spline_function(z ~ x + y) 的功能。在R中,实际的样条函数似乎只接受 xy 参数,因此我不能使用二维x坐标。有什么方法可以在R中实现这一点?我知道可以使用 loess 来进行局部多项式拟合,但我真正需要的是样条函数。


这个问题可能会回答你的疑问...?https://dev59.com/vFrUa4cB1Zd3GeqPkX0- - Frank
1个回答

12

一个不错的选择是 R 软件包中自带的 mgcv 包。它通过 s() 实现了两个或更多变量的各向同性惩罚回归样条,通过张量积和 te() 实现了两个或更多变量的各向异性惩罚回归样条。

如果您不想使用惩罚回归样条,可以使用参数 fx = TRUE 来固定已知自由度的样条。

以下是来自 ?te 的示例:

# following shows how tensor pruduct deals nicely with 
# badly scaled covariates (range of x 5% of range of z )
require(mgcv)
test1 <- function(x, z ,sx=0.3, sz=0.4) { 
  x <- x*20
  (pi ** sx * sz) * (1.2 * exp(-(x - 0.2)^2 / sx^2 - ( z - 0.3)^2 / sz^2) +
  0.8 * exp(-(x - 0.7)^2 / sx^2 -(z - 0.8)^2 / sz^2))
}
n <- 500

old.par<-par(mfrow=c(2,2))
x <- runif(n) / 20
z<-runif(n)
xs <- seq(0, 1, length=30) / 20
zs <- seq(0, 1, length=30)
pr <- data.frame(x=rep(xs, 30), z=rep(zs, rep(30, 30)))
truth <- matrix(test1(pr$x, pr$z), 30, 30)
f <- test1(x, z)
y <- f + rnorm(n) * 0.2

## model 1 with s() smooths
b1 <- gam(y ~ s(x,z))
persp(xs, zs, truth)
title("truth")
vis.gam(b1)
title("t.p.r.s")

## model 2 with te() smooths
b2 <- gam(y ~ te(x, z))
vis.gam(b2)
title("tensor product")

## model 3 te() smooths specifying margin bases
b3 <- gam(y ~ te(x, z, bs=c("tp", "tp")))
vis.gam(b3)
title("tensor product")
par(old.par)

在此输入图片描述


我想知道是否有更好的选择,我已经实现了这个函数的一个想法,它与显示的函数形状非常相似,但在边界附近性能非常差。 这在这个例子中也发生在x~0附近。 - Batato

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接