拟合多元自然三次样条


17

注:用了一个月后,没有正确的答案,我要重新发布SO

背景

我有一个模型f,其中Y=f(X)

是来自 m个参数的样本的 n × m矩阵, Y是模型输出的 n × 1向量。Xn×mmYn×1

是计算密集型的,因此我想使用多变量三次样条曲线通过X Y 点来近似 f,以便可以在更多点上评估 Y。ff(X,Y)Y

是否有R函数可以计算X和Y之间的任意关系?

具体来说,我正在寻找该splinefun函数的多元版本,该版本针对单变量情况生成样条函数。

例如这是 splinefun单变量情况下的工作方式

x <- 1:10
y <- runif(10)
foo <- splinefun(x,y)
foo(1:10) #returns y, as example
all(y == foo(1:10))
## TRUE

我尝试过的

我已经审查了mda软件包,并且似乎应该可以进行以下操作:

library(mda)
x   <- data.frame(a = 1:10, b = 1:10/2, c = 1:10*2)
y   <- runif(10)
foo <- mars(x,y)
predict(foo, x) #all the same value
all(y == predict(foo,x))
## FALSE

但我找不到任何方法来实现三次样条 mars

自提供赏金以来进行了更新,我更改了标题-如果没有R函数,我将按照偏好的顺序接受:输出高斯过程函数的R函数,或通过设计点的另一个多元插值函数,最好在R中,否则在Matlab中。


尝试gam()函数,它允许三次样条
曲线的

Answers:


11

本文在UseR上发表!2009年似乎解决了类似的问题

http://www.r-project.org/conferences/useR-2009/slides/Roustant+Ginsbourger+Deville.pdf

它建议使用DiceKriging软件包http://cran.r-project.org/web/packages/DiceKriging/index.html

特别是,检查功能km并进行预测。

这是三维插值的示例。看起来很简单。

x <- c(0, 0.4, 0.6, 0.8, 1)
y <- c(0, 0.2, 0.3, 0.4, 0.5)
z <- c(0, 0.3, 0.4, 0.6, 0.8)

model <- function(param){
2*param[1] + 3*param[2] +4*param[3]
}


model.in <- expand.grid(x,y,z)
names(model.in) <- c('x','y','z')

model.out <- apply(model.in, 1, model)

# fit a kriging model 
m.1 <- km(design=model.in, response=model.out, covtype="matern5_2")

# estimate a response 
interp <- predict(m.1, newdata=data.frame(x=0.5, y=0.5, z=0.5), type="UK",    se.compute=FALSE)
# check against model output
interp$mean
# [1]  4.498902
model(c(0.5,0.5,0.5))
# [1] 4.5

# check we get back what we put in
interp <- predict(m.1, newdata=model.in, type="UK", se.compute=FALSE)
all.equal(model.out, interp$mean)
# TRUE

6

您需要更多数据才能进行样条拟合。mgcv确实是一个不错的选择。对于您的特定请求,您需要将三次样条设置为基本函数bs ='cr',并且也不要将其用fx = TRUE进行惩罚。这两个选项均设置为由s()设置的平滑项。预测按预期工作。

library(mgcv)
x <- data.frame(a = 1:100, b = 1:100/2, c = 1:100*2)
y <- runif(100)
foo <- gam(y~a+b+s(c,bs="cr",fx=TRUE),data=x)
plot(foo)
predict(foo,x)

谢谢您的帮助,但是如果这是三次样条,我是否应该predict(foo,x)返回y
David LeBauer

抱歉,没有注意到您想要完美的近似值。那么显然mgcv是没有太大的帮助:停止(“基础只处理1D润滑肌肤”)(从svn.r-project.org/R-packages/trunk/mgcv/R/smooth.r
亚历克斯

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.