如何手动指定外部结以使gam更平滑(mgcv包)

时间:2012-08-01 14:44:55

标签: r gam

我使用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更好,那么道歉。

1 个答案:

答案 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()