在R中是否有一种方法可以自动选择GAM的变量,类似于step?我已经阅读了step.gam
和selection.gam
的文档,但是我还没有看到一个答案,也没有看到可以工作的代码。另外,我尝试了method= "REML"
和select = TRUE
,但是都没有从模型中删除不重要的变量。
我已经建立了一个理论,我可以创建一个步骤模型,然后使用这些变量来创建GAM,但这似乎在计算上效率不高。
示例:
library(mgcv)
set.seed(0)
dat <- data.frame(rsp = rnorm(100, 0, 1),
pred1 = rnorm(100, 10, 1),
pred2 = rnorm(100, 0, 1),
pred3 = rnorm(100, 0, 1),
pred4 = rnorm(100, 0, 1))
model <- gam(rsp ~ s(pred1) + s(pred2) + s(pred3) + s(pred4),
data = dat, method = "REML", select = TRUE)
summary(model)
#Family: gaussian
#Link function: identity
#Formula:
#rsp ~ s(pred1) + s(pred2) + s(pred3) + s(pred4)
#Parametric coefficients:
# Estimate Std. Error t value Pr(>|t|)
#(Intercept) 0.02267 0.08426 0.269 0.788
#Approximate significance of smooth terms:
# edf Ref.df F p-value
#s(pred1) 0.8770 9 0.212 0.1174
#s(pred2) 1.8613 9 0.638 0.0374 *
#s(pred3) 0.5439 9 0.133 0.1406
#s(pred4) 0.4504 9 0.091 0.1775
---
#Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#R-sq.(adj) = 0.0887 Deviance explained = 12.3%
#-REML = 129.06 Scale est. = 0.70996 n = 100
2条答案
按热度按时间qnyhuwrf1#
Marra和Wood(2011年,计算统计和数据分析55;2372-2387)比较了GAM中的各种特征选择方法。他们得出结论,平滑度选择过程中的附加惩罚项给出了最佳结果。这可以在mgcv::gam()中通过使用
select = TRUE
参数/设置或以下任何变体来激活:2uluyalo2#
除了在调用函数
gam
时指定select = TRUE
之外,还可以增加参数gamma
的值以获得更强的惩罚,例如,我们生成了一些数据:我们用“标准”惩罚和变量选择拟合GAM:
我们用更强的惩罚和变量选择来拟合GAM:
根据文档,增加
gamma
的值会生成更平滑的模型,因为它会增加GCV或UBRE/AIC准则中的有效自由度。因此,一个可能的不利因素是,* 所有 * 非线性效应将向线性效应收缩,而 * 所有 * 线性效应将向零收缩。这也是我们在上面的图和输出中观察到的:随着
gamma
值的升高,一些效应实际上被抵消(edf
值接近0,F值为0),而其他效应更接近线性(edf
值更接近1)。