参考资料:R语言实战【第2版】
尝试获取一个回归方程时,实际上你就面对着从众多可能的模型中做选择的问题。是不是所有的变量都要包括?还是去掉那个对预测贡献不显著的变量?是否需要添加多项式项和/或交互项来提高拟合度?最终回归模型的选择总是会涉及预测精度(模型尽可能地拟合数据)与模型简洁度(一个简单且能复制的模型)的调和问题。如果有两个几乎相同预测精度的模型,你肯定喜欢简单的那个。本文讨论的就是如何在候选模型中进行筛选。注意,“最佳”是打引号的,因为没有评价的唯一标准,最终的决定需要调查者的评判。
1、模型比较
(1)anova()函数
用R语言基础安装的anova()函数可以比较两个嵌套模型的拟合优度。所谓嵌套模型,即它的一些项完全包含在另一个模型中。用states的多元回归模型,进行具体分析,如下:
# 设置数据为数据框格式
states<-as.data.frame(state.x77[,c("Murder","Population","Illiteracy",
"Income","Frost")])
# 多元回归拟合
fit1<-lm(Murder~Population+Illiteracy+Income+Frost,
data=states).
# 查看拟合结果
summary(fit1)
# 由结果可知Income和Frost两个变量的回归系数是不显著的
# 重新拟合回归方程
fit2<-lm(Murder~Population+Illiteracy,data=states)
# 查看拟合结果
summary(fit2)
# 对两个拟合方程进行比较分析
anova(fit2,fit1)
这里,模型1是嵌套在模型2中的,anova()函数是对Income和Frost变量是否应该添加到线性模型中进行检验。检验结果显示p=0.994,即这fit2和fit1这两个模型间差异不显著,保留fit2模型即可。
(2)AIC(Akaike Information Criterion,赤池信息准则)
AIC也可以用来比较模型,它考虑了模型的统计拟合度以及用来拟合的参数数目。AIC值较小的模型要优先选择,它说明模型用较少的参数获得足够的拟合度。如下:
# AIC模型比较
AIC(fit1,fit2)
由结果可知,fit2的AIC值比fIt1要小,说明fit2模型要优于fit1。
注意:anova()函数需要用嵌套模型,而AIC()函数则不需要。
2、变量选择
当从大量候选变量中选择最终的预测变量有以下两种方法:逐步回归法(stepwise method)和全子集回归法(all-subsets regression)。
(1)逐步回归
逐步回归中,模型会一次添加或删除一个变量,直到达到某个判停标准为止。
向前逐步回归(forward stepwise regression)每次添加一个预测变量到模型中,直到添加变量不会使模型有所改进为止。
向后逐步回归(backward stepwise regression)从模型包含所有预测变量开始,一次删除一个变量直到会降低模型质量为止。
向前向后逐步回归(stepwise stepwise regression,通常称作逐步回归)结合了向前逐步回归和向后逐步回归的方法,变量每次进入一个,但是每一步中,变量都会被重新评价,对模型没有贡献的变量将会被删除,预测变量可能会被添加、删除多次,直到获得最优模型位置。
逐步回归法的实现依据增删变量的准则不同而不同。MASS包中的stepAIC()函数可以实现逐步回归模型(向前、向后、向前向后),依据的是精确AIC准则。如下:
# 加载MASS包
library(MASS)
# 设置数据为数据框格式
states<-as.data.frame(state.x77[,c("Murder","Population","Illiteracy",
"Income","Frost")])
# 多元回归拟合
fit<-lm(Murder~Population+Illiteracy+Income+Frost,
data=states)
# 向后逐步回归
stepAIC(fit,direction="backward")
本例中,开始时模型中包含4个(全部)预测变量,然后每一步中,AIC提供了删除一个行中变量后模型的AIC值。<none>中的AIC值表示没有变量被删除时模型的AIC。向后逐步回归模型计算步骤如下:第一步,Frost被删除,AIC从97.75降至95.75;第二步,Income被删除,AIC继续下降为93.76;第三步,再删除变量将会增加AIC,因此终止选择过程。
逐步归回法其实存在争议,虽然它可能会找到一个好的模型,但不能保证模型就是最佳模型,因为不是每一个可能的模型都被评估了。为了克服这个限制,便有了全子集回归法。
(2)全子集回归
全子集回归是指所有可能的模型都会被检验。我们可以选择展示所有可能的结果,也可以选择n个不同子集大小(一个、两个或多个预测变量)的最佳模型。例如,若nbest=2,表示先展示两个最佳的单预测变量模型,然后展示两个最佳的双预测变量模型,以此类推,直到包含所有的预测变量。
全子集回归可以用leaps包中的regsubsets()函数实现。我们可以通过R平方、调整R平方或Mallows Cp统计量等准则来选择最佳模型。
R平方含义是预测变量解释响应变量的程度。R平方会随着变量数目的增加而增加,当与样本量相比,预测变量数目很大时,容易导致过拟合。R平方很可能会丢失数据的偶然变异信息。
调整R平方与R平方类似,但考虑了模型的参数数目。调整R平方提供了更为真实的R平方估计。
Mallows Cp统计量也可以作为逐步回归的判停规则。研究表明,对于一个好的模型,它的Cp统计量非常接近于模型的参数数目(包括截距项)。
全子集回归操作如下:
# 加载leaps包
library(leaps)
# 设置数据为数据框格式
states<-as.data.frame(state.x77[,c("Murder","Population","Illiteracy",
"Income","Frost")])
# 用regsubsets()函数进行全子集回归
leaps<-regsubsets(Murder~Population+Illiteracy+Income+Frost,
data=states,nbest=4)
# 结果展示,标准是调整R平方
plot(leaps,scale="adjr2")
# 结果的另一种展示方式
# 加载car包
library(car)
# 结果展示,标准为Cp统计量
subsets(leaps,statistic = 'cp',
main="Cp Plot for All Subsets Regression")
abline(1,1,lty=2,col="red")
第一行中(图底部开始),可以看到含intercept(截距项)和Income的模型调整R平方为0.33,含intercept和Population的模型调整R平方为0.1。跳至第12行,你会看到含intercept、 Population、 Illiteracy和Income的模型调整R平方值为0.54,而仅含intercept、 Population
和Illiteracy的模型调整R平方为0.55。此处,我们会发现含预测变量越少的模型调整R平方越大(对
于非调整的R平方,这是不可能的)。图形表明,双预测变量模型( Population和Illiteracy)是最佳模型。
越好的模型离截距项和斜率均为1的直线越近。上图中我们可以选择这几个模型:含Population和Illiteracy的双变量模型;含Population、Illiteracy和Frost的三变量模型或Population、 Illiteracy和Income的三变量模型(它们在图形上重叠了,不易分辨);含Population、 Illiteracy、 Income和Frost的四变量模型。
大部分情况下,全子集回归要优于逐步回归,因为考虑了更多模型。但是当有大量预测变量时全子集回归会运行很慢。一般来说,变量自动选择应该被看作是对模型选择的一种辅助方法,而不是直接方法。拟合效果佳但没有意义的模型对我们来说毫无帮助,研究课题的背景知识的理解才能最终指引我们获得理想的模型。