您安装的两个模型完全相同(直到实现细节)。GAM 框架的优点是您不限于协变量的全局基础扩展。相反,您可以使用一系列可能更好地适应数据的惩罚样条基,而不是像使用多项式模型那样强加特定的函数形式。
我也不会使用gam包。在 R 附带的mgcv包中实现的 Simon Wood 的惩罚样条方法比 Hastie 和 Tibshirani 的原始方法有用得多。
s()在这里,我将您的示例修改为通过函数(平滑)在 GAM 中使用(薄板)样条曲线,而不是poly()在lm(). 我限制了这两个术语的基本维度,但出于技术原因将它们设置为大于多项式(如果真实曲线是 2 次多项式,即在样条可以表示的函数集的边缘,并且平滑度选择可能无法识别它们——我稍后会回到基础维度大小的问题)。这里样条曲线使用最大 4 个自由度,k = 5但由于可识别性约束,我们每个都松散了 1 个 df,以适应模型截距。
library("ISLR") # for Wage dataset
data(Wage)
library("mgcv")
lm.wage.poly <- lm(wage ~ poly(age, 2, raw = TRUE) + poly(year, 2, raw = TRUE), data = Wage)
lm.wage.gam <- gam(wage ~ s(age, k = 5) + s(year, k = 5), data = Wage)
anova(lm.wage.poly, lm.wage.gam)
这给出了:
> anova(lm.wage.poly, lm.wage.gam)
Analysis of Variance Table
Model 1: wage ~ poly(age, 2, raw = TRUE) + poly(year, 2, raw = TRUE)
Model 2: wage ~ s(age, k = 5) + s(year, k = 5)
Res.Df RSS Df Sum of Sq F Pr(>F)
1 2995.0 4771710
2 2994.2 4745169 0.84022 26541 19.932 3.083e-05 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
这表明 GAM 使用的自由度比多项式模型稍多,但在一定程度上改进了拟合。
如果我们看一下模型摘要
> summary(lm.wage.gam)
Family: gaussian
Link function: identity
Formula:
wage ~ s(age, k = 5) + s(year, k = 5)
Parametric coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 111.7036 0.7268 153.7 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Approximate significance of smooth terms:
edf Ref.df F p-value
s(age) 3.84 3.984 70.97 < 2e-16 ***
s(year) 1.00 1.000 13.58 0.000232 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
R-sq.(adj) = 0.0899 Deviance explained = 9.13%
GCV = 1587.9 Scale est. = 1584.8 n = 3000
我们注意到gam()选择了一个线性函数year(它使用 1 个有效自由度 == EDF)。一个~4 EDF 项被拟合到age。这与多项式模型形成对比,多项式模型无论如何都使用每个协变量 2 个 DF。
我们应该检查指定的基本尺寸(k = 5)是否足够大:
> gam.check(lm.wage.gam)
Method: GCV Optimizer: magic
Smoothing parameter selection converged after 9 iterations.
The RMS GCV score gradient at convergence was 0.0001096254 .
The Hessian was positive definite.
Model rank = 9 / 9
Basis dimension (k) checking results. Low p-value (k-index<1) may
indicate that k is too low, especially if edf is close to k'.
k' edf k-index p-value
s(age) 4.00 3.84 0.98 0.09 .
s(year) 4.00 1.00 1.01 0.72
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
测试s(age)是微不足道的,我们会被建议增加k和改装。在这里,我增加了两个术语的基础维度,但year只有几个独特的值,所以我们不能超越k = 7那个术语。
m2 <- gam(wage ~ s(age, k = 10) + s(year, k = 7), data = Wage)
现在平滑度选择建议age应该比以前更强烈地非线性:
> summary(m2)
Family: gaussian
Link function: identity
Formula:
wage ~ s(age, k = 10) + s(year, k = 7)
Parametric coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 111.7036 0.7266 153.7 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Approximate significance of smooth terms:
edf Ref.df F p-value
s(age) 5.462 6.568 43.51 < 2e-16 ***
s(year) 1.000 1.000 14.18 0.000169 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
R-sq.(adj) = 0.0905 Deviance explained = 9.24%
GCV = 1587.7 Scale est. = 1583.7 n = 3000
拟合的平滑现在是:
GAM中使用的多项式基扩展和样条基扩展在概念上的区别在于前者是全局的;20 岁时的数据有助于拟合age80 岁时的二次函数。由于这种全局性质,多项式对于许多非线性关系而言可能过于僵化。由于样条基是局部的,例如,特定age示例的拟合主要受相同响应的值支配age。