0

我从掌握如何使用样条线插入一维函数开始。

model = spline(bdp[,4]~bdp[,1])

然后我可以使用

predict(model, c(0))

预测点 0 的函数值。

然后我在互联网上搜索了一些可以对 3 维数据进行样条分析的东西,我在 stackoverflow 上找到了一个答案,表明mgcv::gam是最好的选择。

所以我尝试了:

model=gam(bdp[,4]~s(bdp[,1],bdp[,2],bdp[,3]))

然后我做了:

predict(model, newdata=c(0,0,0), type="response")

希望它将返回点(0,0,0)的样条插值值。它计算了一段时间,返回了很多我看不懂的多维数据。

我一定做错了什么。我该怎么做才能从 gam 对象接收单个点的值?而且,可以肯定的是,您是否同意/不同意 gam 是为 3D 数据插入样条曲线的正确选择,还是您会提出其他建议?

我正在添加一个可重现的示例。

这是一个数据文件(请在 c:/r/ 中解压)https://www.sendspace.com/file/b4mazl

# install.packages("mgcv")

library(mgcv)

bdp = read.table("c:/r/temp_bdp.csv")
bdg=gam(bdp[,4]~s(bdp[,1],bdp[,2],bdp[,3]))

#this returns lots of data, not just function value that I wanted.
predict(bdg, newdata=data.frame(0,0,0,0), type="response")

最小的可重现示例:

tmp = t(matrix(runif(4*200),4))
tmpgam=gam(tmp[,4]~s(tmp[,1],tmp[,2],tmp[,3]))
predict(tmpgam, newdata=data.frame(0,0,0,0), type="response")

对于预测(bdg, newdata=data.frame(0,0,0,0), type="response")

它返回很多数字任何警告newdata没有足够的数据

为了

predict(bdg, c(0,0,0,0), type="response")

它什么也不返回,也同样发出警告。

4

1 回答 1

3

因此,对于您适合的几乎所有类型的模型,如果您打算使用该predict函数,最好使用带有列名的“正确”公式,而不是使用 matrix/data.frame 切片。原因是当 predict 运行时,它newdata使用两者中的名称将值匹配到模型中,因此它们应该匹配相同。当您像这样索引 data.frame 时,它​​会在模型​​中创建奇怪的名称。做拟合模型和预测的最佳方法是

bdg <- gam(V4~s(V1,V2,V3), data=bdp)
predict(bdg, newdata=data.frame(V1=0, V2=0, V3=0))
#           1 
# 85431440244 

这是假设

names(bdp)
# [1] "V1" "V2" "V3" "V4"

所以在这里我们适合 "V1","V2","V3" 并且newdata有 "V1","V2" 和 "V3" 列

所以我只关注 R 编码部分。至于这是否是一个适当的分析更适合https://stats.stackexchange.com/的问题

于 2014-07-01T18:51:01.197 回答