尝试这个:
#Fake data
library(mgcv)
x <- runif(10000, 0, 10)
y <- log(x) + sin((x^2)/10)+rnorm(10000)
plot(x,y)
使用默认的“结位置”尝试三种不同的基函数
plot(gam(y~s(x, bs = 'ps')))
plot(gam(y~s(x, bs = 'cr')))
plot(gam(y~s(x, bs = 'ts')))
它们基本相同。现在是相同的,每个都有 40 节。
plot(gam(y~s(x, bs = 'ps', k = 40)))
plot(gam(y~s(x, bs = 'cr', k = 40)))
plot(gam(y~s(x, bs = 'ts', k = 40)))
...有点过度摇摆,但实际上并没有那么不同。
现在 futz 使用平滑参数,你会看到动作在哪里:
plot(gam(y~s(x, sp = 0)))
plot(gam(y~s(x, sp = 1e6)))
plot(gam(y~s(x))) #default smoothing parameter, estimated by generalized cross-validation
因此,总而言之,当您指定比您可能需要的更多节点时,节点位置并不重要,然后通过脊惩罚来惩罚它们。
如果您不知道我在说什么脊罚,请阅读 Simon Wood 关于 GAM 的书。请注意,作者是编写 R 包的同一个人。