为 GAM 选择结

机器算法验证 r 广义加法模型 样条
2022-03-20 01:09:55

在为 GAM 选择适当数量的结时,可能需要考虑 x 轴上的数据数量和增量。

如果我们在 x 轴上有 100 个增量,每个增量有 1000 个数据点会怎样。

这里的信息说:

如果未提供它们,则样条的结均匀地放置在该术语所指的协变量值中:例如,如果用 x 的 11 个结样条拟合 101 个数据,则每 10 个(有序)就有一个结x 值。

那么在这个例子中,一个基本的开始应该是 9 节?我只是不确定什么样的结范围适合这个数据集,因为它可能适合非常小到非常大的数字。

set.seed(1)
dat <- data.frame(y = rnorm(10000), x = 100)

library(ggplot)
ggplot(dat, aes(x = x, y = y)) + 
              geom_point(size= 0.5) +                      
stat_smooth(method = "gam", 
            formula = y ~ s(x, bs = "cs"),k=9, col = "black")

如果 k=25 提供了有用的拟合,那么该数据是否合理?

2个回答

GCV 会自动选择节数的想法来自哪里?节点数(即基本尺寸)是固定的,在模型拟合期间不能更改。正如 Ira S 所说,函数 gam() 中的 GCV 分数“自动”所做的不是选择基维度 k,而是通过在最小化器或拟合目标中引入摆动惩罚来选择每个基样条的平滑水平。要选择结数 k,您应该使用一个大于您期望的自由度数的值。引用choose.k的帮助:“k的精确选择通常不是关键的:它应该选择得足够大,以便您有理由确信有足够的自由度来合理地表示潜在的'真相',但又足够小保持合理的计算效率”。因此,例如,基本上以大的步长增加 k,直到您看不到绘图中的任何变化。总结:正如 Ira S 所说,没有什么比 k 的“自动”选择更好的了,用户应该始终选择 ak 值作为模型设计的一部分。否则你很可能不适合你的模型!

更新如果您是像我这样的统计新手,这个答案可能就足够了。如果您想要更正确的答案,请参阅 Nukimov 的答案。

一个更好的选择是使用 mgcv 包中的 gam() 来拟合您的模型,该包包含一种称为广义交叉验证 (GCV) 的方法。GCV 将自动为您的模型选择结数,以便在简单性与解释力之间取得平衡。在 mgcv 中使用 gam() 时,通过将 k 设置为 -1 来打开 GCV。

像这样:

set.seed(1)
dat <- data.frame(y = rnorm(10000), x = rnorm(10000))

library(mgcv)
G1 <- gam(y ~ s(x, k = -1, bs = "cs"), data = dat)
summary(G1) # check the significance of your smooth term
gam.check(G1) # inspect your residuals to evaluate if the degree of smoothing is good

要绘制平滑线,您必须提取模型拟合。这应该可以解决问题:

plot(y~x, data = dat, cex = .1)
G1pred <- predict(G1)
I1 <- order(dat$y)
lines(dat$x, G1pred)

你也可以手动调整k,看看多少k让你最接近GCV自动设置的k值。