R语言回归分析

回归分析可以说是统计学的核心,它其实是一个广义的概念,通指那些用一个或多个预测变量(也称自变量或解释变量)来预测响应变量(也称因变量、效标变量或结果变量)的方法。通常,回归分析可以用来挑选与响应变量相关的解释变量,可以描述两者的关系,也可以生成一个等式,通过解释变量来预测响应变量。
最小二乘法回归是通过预测变量的加权和来预测量化的因变量,其中权重是通过数据估计而得的参数,目标是通过减少响应变量的真实值与预测值的差值来获得模型参数(截距项和斜率),具体而言,即使得残差平方和最小。下面将通过几篇博客介绍回归分析,这是第五篇:选择最佳模型。

1、模型比较

1.1 anova()函数

用基础安装中的 anova() 函数可以比较两个嵌套模型的拟合优度。所谓嵌套模型,即它的一些项完全包含在另一个模型中。

states <- as.data.frame(state.x77[,c("Murder", "Population",
"Illiteracy", "Income", "Frost")])
fit1 <- lm(Murder ~ Population + Illiteracy + Income + Frost,
data=states)
fit2 <- lm(Murder ~ Population + Illiteracy, data=states)
anova(fit2, fit1) #结果显示不需要加入两个变量

1.2 AIC()函数

AIC(Akaike Information Criterion,赤池信息准则)也可以用来比较模型,它考虑了模型的统计拟合度以及用来拟合的参数数目。AIC值较小的模型要优先选择,它说明模型用较少的参数获得了足够的拟合度。

fit1 <- lm(Murder ~ Population + Illiteracy + Income + Frost,
data=states)
fit2 <- lm(Murder ~ Population + Illiteracy, data=states)
AIC(fit1,fit2)

2、变量选择

从大量候选变量中选择最终的预测变量有以下两种流行的方法:逐步回归法(stepwise method)和全子集回归(all-subsets regression)

2.1 逐步回归

逐步回归中,模型会一次添加或者删除一个变量,直到达到某个判停准则为止。

  • 向前逐步回归(forward stepwise regression)每次添加一个预测变量到模型中,直到添加变量不会使模型有所改进为止。
  • 向后逐步回归(backward stepwise regression)从模型包含所有预测变量开始,一次删除一个变量直到会降低模型质量为止。
  • 向前向后逐步回归(stepwise stepwise regression),结合了向前逐步回归和向后逐步回归的方法,变量每次进入一个,但是每一步中,变量都会被重新评价,对模型没有贡献的变量将会被删除,预测变量可能会被添加、删除好几次,直到获得最优模型为止。

MASS 包中的 stepAIC() 函数可以实现逐步回归模型(向前、向后和向前向后),依据的是精确AIC准则。

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")
fit1 <- lm(Murder ~ Population + Illiteracy + Income + Frost,data=states)
stepAIC(fit1,direction = "both")

逐步回归法其实存在争议,虽然它可能会找到一个好的模型,但是不能保证模型就是最佳模型,因为不是每一个可能的模型都被评价了,为克服这个限制,便有了全子集回归法。

全子集回归

全子集回归是指所有可能的模型都会被检验。分析员可以选择展示所有可能的结果,也可以展示n个不同子集大小(一个、两个或多个预测变量)的最佳模型。

全子集回归可用 leaps 包中的 regsubsets() 函数实现。可以通过R平方、调整R平方或allows Cp统计量等准则来选择“最佳”模型。

library(leaps)
states <- as.data.frame(state.x77[,c("Murder", "Population",
"Illiteracy", "Income", "Frost")])
leaps <-regsubsets(Murder ~ Population + Illiteracy + Income +
Frost, data=states, nbest=4)
plot(leaps, scale="adjr2")
library(car)
subsets(leaps, statistic="cp",
main="Cp Plot for All Subsets Regression")
abline(1,1,lty=2,col="red")

大部分情况中,全子集回归要优于逐步回归,因为考虑了更多模型。但是,当有大量预测变量时,全子集回归会很慢。