R 如何手动指定gam中更平滑的外部结(mgcv包)

R 如何手动指定gam中更平滑的外部结(mgcv包),r,gam,R,Gam,我使用R中的mgcv包将GAM模型拟合到数据中。我的一些预测值是圆形的,因此我使用周期平滑器。我在交叉验证中遇到了一个问题,我的保持数据集可能包含超出训练数据范围的值。由于gam包自动为平滑选择结,因此会导致错误(请参阅我的相关问题——感谢@nograps和@DWin对错误的解释) 如何在周期平滑中手动指定外部结 示例代码 第一个块生成一些数据 library(mgcv) set.seed(223) # produces error. # set.seed(123) # no error.

我使用R中的mgcv包将GAM模型拟合到数据中。我的一些预测值是圆形的,因此我使用周期平滑器。我在交叉验证中遇到了一个问题,我的保持数据集可能包含超出训练数据范围的值。由于gam包自动为平滑选择结,因此会导致错误(请参阅我的相关问题——感谢@nograps和@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
拾取其余节点

如果这个问题对CrossValidated更有利,请道歉。

试试这个:

gamFit <- gam(y ~ s(x,bs="cc",k=5), 
              knots=list( x=seq(-pi,pi, len=5) ), 
              data=df, family=binomial())
在测试这段代码时,我了解到
s()
中的'k'参数需要与传递给
knots()的'x'-
seq()
值中的'len'参数匹配。我错误地认为knots参数会传递到
s()

尝试以下操作:

gamFit <- gam(y ~ s(x,bs="cc",k=5), 
              knots=list( x=seq(-pi,pi, len=5) ), 
              data=df, family=binomial())

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

,这太完美了,谢谢DWin。对不起,这个没用的问题;有时R帮助很难在包含大量嵌套函数的包中导航。这太完美了,谢谢。对不起,这个没用的问题;有时R帮助很难在包含大量嵌套函数的包中导航。
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