R语言|广义相加模型(GAM)

转自个人微信公粽号【易学统计】的统计学习笔记:R软件:广义相加模型(GAM)

01解决何种问题

前面一期和大家分享如何运用样条回归处理遇到的非线性问题,但这适合处理单个因变量Y对应一个自变量X的问题,而现实情况是,我们常常要处理多个自变量和一个因变量之间的关系,除此以外,虽然通过做散点图能发现非线性关系,但很难归属它的形式,广义线性模型中的多项式回归,由于其不好解释的系数,降低了模型实用性。

因此本章分享的广义相加模型提供了一种优选方案,它可以研究多个自变量与一个因变量之间关系,同时不需要预先知晓因变量和自变量的关系,而使用非线性平滑项来拟合模型。

02GAM模型说明

广义相加模型(GAM:Generalized Additive Model),它模型公式如下:有p个自变量,其中X1与y是线性关系,其他变量与y是非线性关系,我们可以对每个变量与y拟合不同关系,对X2可以拟合局部回归,X3采用光滑样条,不必采用统一的关系,而最终结果‘加’在一起就可以了。


公式1.png
  1. 该函数有两个组成部分,β0+β1X1部分属于参数部分,后半部分属于非参数平滑部分,因此该模型又称为半参数模型。参数部分等同于线性项或广义线性项,非参数平滑部分,则是广义相加模型的关键部分。模型的左侧与广义线性模型一样,可以是因变量本身,也可以是对因变量进行变换后的结果。

  2. 什么是非参数平滑项?
    经样条函数变化后的自变量也被称作非参数平滑项,常见的样条函数如:光滑样条(可参见前述内容)、自然样条和局部样条等。总结起来,为了尽可能多地捕捉回归模型中的非线性因素对因变量的影响,我们采用样条函数来灵活地将自变量拟合为平滑的曲线;同时又相对不那么“灵活”,能有效防止过度拟合。

  3. 关于样条函数,需要确定多少个节点合适?怎么选取合适的函数?
    节点的个数直接和函数中自由度df挂钩,函数中的自由度df=节点数+4,通常可以通过1)AIC,根据AIC最小确定自由度;2)广义交叉验证;3)根据残差独立原则,最小化残差自相关确定自由度。

3.1 AIC法:GAM的比较可以用aov(model1,model2,test="Chisq")或者AIC(model1,model2)来比较。通过比较选出最优节点数量。该法还可以通过观察模型中非参数平滑函数的自由度改变对解释变量的影响大小来评判模型是否稳健。
3.2 广义交叉验证(GCV:Generalized Cross Validation)。这种方法的基本思路是,a)取出一部分数据;b)用某一数量的节点使样条拟合剩下的这些数据;c)用样条拟合之前取出的数据;d)重复a)~c),直到每个观察值都被取出过一次,计算整个交叉验证过程的均方根误差(RMSE:Root Mean Square Error);e)针对不同数量的节点重复a)~d),最后选择最小RMSE时的节点数量。一般可以分成10份重复此过程
3.3样条函数是具有m-1个连续导数的m阶分段多项式,例如三次样条函数指的就是具有连续性、且一阶和二阶连续的三阶分段多项式。在实际研究中,我们一般使用三次样条函数;除此之外,也可选择自然三次样条函数(增加了三次样条函数在边界区域的平滑性)、薄板样条函数(可同时平滑多个变量,因此一般在研究多个变量的交互作用时使用)等。

03R代码及解读

第一部分:结局是连续变量

library(ISLR)
library(splines)
library(gam)
data(Wage)
gam2 <- gam(wage ~ s(age,5) + s(year,4) +  education,data=Wage)
gam3 <- gam(wage ~ s(age,5) + year+ education,data=Wage)
plot(gam2,se=T,col=c('blue'))
###
gam5 <- gam(wage ~ s(age,5) + lo(year,span=0.7) +  education,data=Wage)
1.jpg
2.jpg

结果说明:
1)采用summary(gam2),查看模型结果,该结果分为参数部分和非参数部分,其中非参数中的year变量,p值大于0.05,说明该变量不适合做非线性拟合,而education这个变量没有做非线性拟合,因为在非参数部分没有其结果。将year这个变量采用线性回归拟合,其拟合结果是显著的,感兴趣的小伙伴可以跑下模型。
2)采用plot()可以将模型画出来,图一的图横坐标为自变量X,纵坐标为因变量Y,表示随着年龄的变量,收入是先增长,然后降低的。图二中间的图意思是随着年份的增加,收入一直呈增长状态,中间有两年下降了,图三则是随着教育程度的升高,收入越来越高。其他的图解释以此类推。
3)s()是样条函数,括号里面的数字是定义的自由度,除了使用回归样条,还能使用局部样条lo()函数,得到的结果与上面的结果十分类似。

第二部分:结局是分类变量

当Y是分类变量时,GAM同样适用。比如:

gam4 <- gam(I(wage>250) ~ ns(age,5) + year + education,data=Wage,family = binomial)
plot(gam4,se=T,col=c('blue'))
3.jpg

结果说明:
1)采用I(),将wage变量处理成二分类变量,模型的写法和第一部分稍有变化。
2)采用plot()可以将模型画出来,上图横坐标为自变量X,纵坐标表示概率,这个跟第一部分不太一样,小伙伴注意区分,上图第一个表的解释是:随着年龄的增加,收入超过250的可能性先增加后降低,其他的图解释以此类推。
各位小伙伴儿,码了这么多字,期望能够帮助各位更好的理解和使用这些模型。

04总结

GAM模型存在的缺点:
1.由于模型是可加的,这在很大程度上限制了模型的灵活性,变量间的相互作用常被忽略,虽然模型本身可以考察交互作用。
2.由于是基于非线性的模型,因此GAM模型的系数依然难以准确解释和描述。
如果您觉得有用,请点赞,转发哦~

更多统计小知识,请关看 公粽号 易学统计

更多阅读
R语言:多水平统计模型
R语言:广义估计方程(GEE)
R语言|两因素重复测量方差分析
R语言|基于Cox模型pec包深度验证
R语言|中位生存时间列线图绘制
R语言|Cox模型校准度曲线绘制
R语言|中位生存时间列线图绘制
基于Lasso回归筛选变量构建Cox模型并绘制Nomogram
R语言Logistic回归模型验证及Nomogram绘制
如何进行高维变量筛选和特征选择(一)?Lasso回归

你可能感兴趣的:(R语言|广义相加模型(GAM))