0

我正在使用 R 中的 mgcv 包将 GAM 模型拟合到数据。我的一些预测变量是圆形的,所以我使用的是周期性平滑器。我在交叉验证中遇到了一个问题,我的保留数据集可能包含训练数据范围之外的值。由于 gam 包自动为平滑选择结,这会导致错误(请参阅我的相关问题-感谢@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 更好,我们深表歉意。

4

1 回答 1

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 

我在测试此代码时了解到,'k' 参数s()需要匹配 'x'-seq()传递给的值中的 'len' 参数knots()。我错误地认为节点参数会传递给s().

于 2012-08-01T16:25:54.757 回答