多项式回归与 GAM

机器算法验证 回归 广义加法模型
2022-04-10 02:37:40

使用 GAM 与使用多项式回归有何不同?它们似乎产生了相同的结果。lm()下面我使用with运行多项式回归

w一个Ge=β0+β一个Ge一个Ge+β一个Ge2一个Ge2+β是的e一个r是的e一个r+β是的e一个r2是的e一个r2

然后我做同样的事情gam()并比较使用anova(). 两者的 RSS 是相同的。同样使用样条曲线是的e一个r一个Ge.

如果我试图探索响应和预测变量之间的非线性程度,我将如何以不同的方式使用gam()gam()为了更容易将二次模型与三次模型进行比较?谢谢你。

library(ISLR) # for Wage dataset
library(gam)

lm.wage.poly <- lm(wage ~ poly(age, 2, raw = TRUE) + poly(year, 2, raw = TRUE), data = Wage)
lm.wage.gam <- gam(wage ~ poly(age, 2, raw = TRUE) + poly(year, 2, raw = TRUE), data = Wage)
anova(lm.wage.poly, lm.wage.gam)
## Model 1: wage ~ poly(age, 2, raw = TRUE) + poly(year, 2, raw = TRUE)
## Model 2: wage ~ poly(age, 2, raw = TRUE) + poly(year, 2, raw = TRUE)

##   Res.Df     RSS Df Sum of Sq F Pr(>F)

## 1   2995 4771710                  
## 2   2995 4771710  0         0 

library(splines)
# Using cubic splines for age and year
lm.wage.poly.spline <- lm(wage ~ bs(age) + bs(year), data = Wage)
lm.wage.gam.spline <- gam(wage ~ bs(age) + bs(year), data = Wage)
anova(lm.wage.poly.spline, lm.wage.gam.spline)

## Model 1: wage ~ bs(age) + bs(year)

## Model 2: wage ~ bs(age) + bs(year)

##   Res.Df     RSS Df Sum of Sq F Pr(>F)
## 1   2993 4754108    
## 2   2993 4754108  0         0  
2个回答

您安装的两个模型完全相同(直到实现细节)。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

如果我们在 中使用los基展开gam,我们会看到差异。这是演示:

使用无基展开式和多项式,gamlm一样的。

> library(gam)
> anova(lm(mpg~wt,data=mtcars),gam(mpg~wt,data=mtcars))
Analysis of Variance Table

Model 1: mpg ~ wt
Model 2: mpg ~ wt
  Res.Df    RSS Df  Sum of Sq F Pr(>F)
1     30 278.32                       
2     30 278.32  0 5.6843e-14         
> anova(lm(mpg~poly(wt,2,raw = T),data=mtcars),gam(mpg~poly(wt,2,raw = T),data=mtcars))
Analysis of Variance Table

Model 1: mpg ~ poly(wt, 2, raw = T)
Model 2: mpg ~ poly(wt, 2, raw = T)
  Res.Df    RSS Df Sum of Sq F Pr(>F)
1     29 203.75                      
2     29 203.75  0         0         

使用los扩展,gamlm不同的。

> anova(lm(mpg~lo(wt),data=mtcars), gam(mpg~lo(wt),data=mtcars))
Analysis of Variance Table

Model 1: mpg ~ lo(wt)
Model 2: mpg ~ lo(wt)
  Res.Df    RSS  Df Sum of Sq      F   Pr(>F)   
1   30.0 278.32                                 
2   26.6 177.47 3.4    100.86 4.4462 0.009422 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
> anova(lm(mpg~s(wt),data=mtcars), gam(mpg~s(wt),data=mtcars))
Analysis of Variance Table

Model 1: mpg ~ s(wt)
Model 2: mpg ~ s(wt)
  Res.Df    RSS Df Sum of Sq      F  Pr(>F)  
1     30 278.32                              
2     27 190.00  3    88.321 4.1837 0.01483 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1