我使用R中的mgcv包将GAM模型拟合到数据。我的一些预测器是圆形的,所以我使用的是周期性的平滑器。我在交叉验证中遇到了一个问题,我的保持数据集可以包含训练数据范围之外的值。由于gam包会自动为平滑选择结,这会导致错误(请参阅我的相关问题here - 感谢@nograpes和@DWin对错误的解释)。
如何以周期性平滑手动指定外部结?
示例代码
第一个块生成一些数据。
library(mgcv)
set.seed(223) # produces error.
# set.seed(123) # no error.
# generate data:
x <- runif(100,min=-pi,max=pi)
linPred <- 2*cos(x) # value of the linear predictor
theta <- 1 / (1 + exp(-linPred)) #
y <- rbinom(100,1,theta)
plot(x,theta)
df <- data.frame(x=x,y=y)
下一个块适合GAM模型,周期性平滑:
gamFit <- gam(y ~ s(x,bs="cc",k=5),data=df,family=binomial())
summary(gamFit)
plot(gamFit)
它会在更平滑的术语s(x,bs="cc",k=5)
的规范中某处,我确信你能够设置一些结,但在gam
的帮助下,这对我来说并不明显。或者谷歌搜索。
如果您按如上所示设置种子,此块将适合一些保留数据并产生错误:
# predict y values for new data:
x.2 <- runif(100,min=-pi,max=pi)
df.2 <- data.frame(x=x.2)
predict(gamFit,newdata=df.2)
理想情况下,我只会设置外部结,然后让gam
选择其余部分。
如果CrossValidated这个问题比SO更好,那么道歉。
答案 0 :(得分:3)
试试这个:
gamFit <- gam(y ~ s(x,bs="cc",k=5),
knots=list( x=seq(-pi,pi, len=5) ),
data=df, family=binomial())
您将在以下网址找到一个有用的例子:
?smooth.construct.cr.smooth.spec
我在测试此代码时了解到,s()
中的'k'参数需要匹配传递给seq()
的'x' - knots()
值中的'len'参数。我错误地认为knots参数会传递给s()
。