注意:最初于2011年7月26日在Cross Validated (stats SE)发布,但没有正确答案。
背景
我有一个模型 f ,其中 Y = f( X )
X 是来自 m 参数和 Y 的 nxm 样本矩阵是模型输出的 nx 1 向量。
f 是计算密集型的,因此我想通过( X ,Y)使用多元三次样条逼近 f 点,这样我就可以在更多的点上评估 Y 。
问题
是否有一个R函数可以计算 X 和 Y 之间的任意关系?
具体来说,我正在寻找splinefun
函数的多变量版本,它为单变量情况生成样条函数。
e.g。这就是splinefun
对单变量情况的作用
x <- 1:100
y <- runif(100)
foo <- splinefun(x,y, method = "monoH.FC")
foo(x) #returns y, as example
函数通过点精确插值的测试成功:
all(y == foo(1:100))
## TRUE
我尝试了什么
我已经审核了mda包,似乎以下内容应该有效:
library(mda)
x <- data.frame(a = 1:100, b = 1:100/2, c = 1:100*2)
y <- runif(100)
foo <- mars(x,y)
predict(foo, x) #all the same value
但是该函数没有完全插入设计点:
all(y == predict(foo,x))
## FALSE
我也找不到在gam
,marss
或earth
包中实现三次样条的方法。
答案 0 :(得分:4)
实际上有几个包可以做到。我使用的是具有rcs
的“rms”包,但是生存包还有pspline
,splines包具有ns
函数{}。 “自然样条”(用ns构造)也是三次样条。您需要在多变量公式中使用'*'运算符形成多变量拟合函数,从而创建“交叉”样条项。
你提供的例子不够丰富。
我想我很困惑,你想要完全适合。 R是一个统计包。近似估计是目标。通常,精确拟合更多是一个问题,因为它们会导致多重共线性。
答案 1 :(得分:1)
我不确定这是否正是您正在寻找的,但您可以在R包字段中尝试Tps()。它用于对空间数据进行薄板样条插值(2D等效三次样条),但最多需要四个协变量,尽管它会期望它们是欧几里得x,y,z +时间,所以你需要清楚您正在为特定情况选择正确的选项。如果要插值,请将平滑参数lambda设置为零。您也可以尝试R包polspline中的函数polymars()。
答案 2 :(得分:1)
看看为开展此类任务而开发的DiceKriging软件包。 http://cran.r-project.org/web/packages/DiceKriging/index.html
我已经提供了一个示例应用程序 https://stats.stackexchange.com/questions/13510/fitting-multivariate-natural-cubic-spline/65012#65012