有四种方法可以处理违背回归假设的问题
1,删除观测点
2,变量变换
3,添加或删除变量
4,使用其他回归方法
8.5.1 删除观测点
删除离群点通常可以提高数据集对于正态假设的拟合度,而强影响点会干扰结果,通常也会被删除。
删除最大的离群点或者强影响点后,模型需要重新拟合。若离群点或强影响点仍然存在,重复以上过程
如果是因为数据记录错误,或没有遵守规程,或是受式对象误解指导说明这种数据本身是错误的可以删除,
但是在数据正确的情况下这些异常点有助于你更深刻的研究主题,或者发现其他你可能没有想过的问
8.5.2变量变换
当模型不符合正态性,线性或者同方差性假设时,一个或多个变量的变换通常可以改善或调整模型效果
当模型违反正态假设时,通常可以对响应变量尝试某种变换
car包中的powerTransform()函数通过λ的最大似然估计来正态或变量X^λ。
library(car)
载入需要的程辑包:carData
> states <- as.data.frame(state.x77[,c("Murder","Population","Illiteracy","Income","Frost")])
> summary(powerTransform(states$Murder))
bcPower Transformation to Normality
Est Power Rounded Pwr Wald Lwr Bnd Wald Upr Bnd
states$Murder 0.6055 1 0.0884 1.1227
Likelihood ratio test that transformation parameter is equal to 0
(log transformation)
LRT df pval
LR test, lambda = (0) 5.665991 1 0.017297
Likelihood ratio test that no transformation is needed
LRT df pval
LR test, lambda = (1) 2.122763 1 0.14512
>
结果表明可以使用Murder^0.6来正态化变量Murder。,但在本例中,λ=1的假设也无法拒绝(p=0.145)因此没有强有力的证据表明本例需要进行变量变换。
当违反了线性假设时,对预测变量进行变换常常会比较有用。
例子:
library(car)
> states <- as.data.frame(state.x77[,c("Murder","Population","Illiteracy","Income","Frost")])
> boxTidwell(Murder~Population + Illiteracy,data=states)
MLE of lambda Score Statistic (z) Pr(>|z|)
Population 0.86939 -0.3228 0.7468
Illiteracy 1.35812 0.6194 0.5357
iterations = 19
>
结果表明,使用Population0.87和Illiteracy1.36能够改善线性关系。但是对Population(p=0.75)和Illiteracy(p=0.54)的计分检验又表明变量不需要变换。
这些结果与成分残差图是一致的
响应变量变换还能改善异方差性
注意如果变换得有意义,比如收入的对数变换,距离的逆变换,解释起来就会容易得多,但是如果变换得没有意义,就应该避免这样做
8.5.3增删变量
删除变量在处理多重共线性时是一种非常重要的方法
如果你仅仅做预测,那么多重共线性并不构成问题,但是如果还要对每个预测变量进行解释,那么就必须解决这个问题。
最常见的方法就是删除某个存在多重共线性的变量,另外一个可用的方法就是岭回归–多元回归的变体,专门用来处理多重共线性的问题
8.5.4 其他方法
使用不同的方法进行拟合
如果存在多重共线性可以使用岭回归模型
如果存在离群点和或强影响点,可以使用稳健回归模型替代OLS回归。
如果违背了正态性假设,可以使用非参数回归模型。
如果存在显著的非线性,可以尝试非线性回归模型。
如果违背了误差独立性假设,可以使用专门研究误差结构的模型。
8.6 选择最佳的回归模型
用基础安装中的anova()函数可以比较两个嵌套模型的拟合优度。所谓嵌套模型,即它的一些项完全包含在另一个模型中。
在states的多元回归模型中,我们发现Income和Frost的回归系数不显著,此时你可以检验不含这两个变量的模型与包含着两项的模型预测效果是否一样好
代码清单
states <- as.data.frame(state.x77[,c("Murder","Population","Illiteracy","Income","Frost")])
> fit1 <- lm(Murder~.,data=states)
> fit2 <- lm(Murder~Population+Illiteracy,data=states)
> anova(fit2,fit1)
Analysis of Variance Table
Model 1: Murder ~ Population + Illiteracy
Model 2: Murder ~ Population + Illiteracy + Income + Frost
Res.Df RSS Df Sum of Sq F Pr(>F)
1 47 289.25
2 45 289.17 2 0.078505 0.0061 0.9939
>
此处,模型1嵌套在模型2中,anova()函数同时还对应是否应该添加Income和Frost到线性模型中进行检验,
由于检验不显著(p=0.994),我们可以得出结论,不需要将这两个变量添加到线性模型中。
AIC也可以用来比较模型,它考虑了模型的统计拟合度以及用来拟合的参数数目。
AIC值较小的模型要优先选择,它说明模型用较少的参数获得了足够的拟合度。
代码示例
states <- as.data.frame(state.x77[,c("Murder","Population","Illiteracy","Income","Frost")])
> fit1 <- lm(Murder~.,data=states)
> fit2 <- lm(Murder~Population+Illiteracy,data=states)
> AIC(fit2,fit1)
df AIC
fit2 4 237.6565
fit1 6 241.6429
此处AIC值表明没有Income和Frost的模型更佳。
注意,ANOVA需要嵌套模型,而AIC方法不需要。
8.6.2变量选择
从大量候选变量中选择最终的预测变量有一下两种流行的方法:逐步回归法和全子集回归
1,逐步回归法
逐步回归法的实现依据增删变量的准则不同而不同。
Mass包中的stepAIC()函数可以实现逐步回归模型,依据的是精确的AIC准则
代码示例
library(MASS)
> states <- as.data.frame(state.x77[,c("Murder","Population","Illiteracy","Income","Frost")])
> fit <- lm(Murder~.,data=states)
> #direction = "backward"表明使用向后回归的方法
> stepAIC(fit,direction = "backward")
Start: AIC=97.75
Murder ~ Population + Illiteracy + Income + Frost
Df Sum of Sq RSS AIC
- Frost 1 0.021 289.19 95.753
- Income 1 0.057 289.22 95.759
<none> 289.17 97.749
- Population 1 39.238 328.41 102.111
- Illiteracy 1 144.264 433.43 115.986
Step: AIC=95.75
Murder ~ Population + Illiteracy + Income
Df Sum of Sq RSS AIC
- Income 1 0.057 289.25 93.763
<none> 289.19 95.753
- Population 1 43.658 332.85 100.783
- Illiteracy 1 236.196 525.38 123.605
Step: AIC=93.76
Murder ~ Population + Illiteracy
Df Sum of Sq RSS AIC
<none> 289.25 93.763
- Population 1 48.517 337.76 99.516
- Illiteracy 1 299.646 588.89 127.311
Call:
lm(formula = Murder ~ Population + Illiteracy, data = states)
Coefficients:
(Intercept) Population Illiteracy
1.6515497 0.0002242 4.0807366
开始时模型包含4个预测变量,然后每一步中,AIC列提供了删除一个行中变量后模型的AIC值,中的AIC值表示没有变量被删除时模型的AIC
每一步都选择AIC值最小的模型,继续回归知道中的AIC值为最小就是我们要的模型
2.全子集回归
顾名思义,全子集回归是指所有可能的模型都会被检验。
参数nbest=n,是展示n个不同子集大小的最佳模型,首先展示n个最佳的单预测变量模型,然后展示n个双预测变量模型,以此类推,直到包含所有的预测变量
全子集回归可用leaps包中的regsubsets()函数实现,可以通过R平方,调整R平方或Mallows Cp统计量等准则来选择最佳模型
R平方含义是预测变量解释响应变量的程度,但是R平方总会随着变量数目的增加而增加
调整R平方与R平方类似是更为真实的P平方估计
Mallows Cp统计量也用来作为逐步回归的判停规则。广泛研究表明,对于一个好的模型,它的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")
第一行中(图底部开始),可以看到含intercept(截距项)和Income的模型调整R平方为0.033,含intercept和Population的模型调整R平方为0.1.跳到12行,可以看到含intercept,Population,Illiteracy,Income的模型调整R平方值为0.54,而仅含intercept,Population,Illiteracy的模型调整R平方为0.55.图形表名双预测模型是最佳模型
此图越好的模型离截距项和斜率均为1的直线越近。
大部分情况下,全子集回归要优于逐步回归模型,因为考虑了更多的模型,但是当有大量预测变量时,全子集回归会很慢。一般来说自动选择应该被看做是对模型选择的一种辅助方法而不是直接方法。主题背景知识的理解才能最终指引你获得理想模型。
深层次分析
1,交叉验证
交叉验证即将一定比例的数据挑选出来作为训练样本,另外的样本作为保留样本,先在训练样本上获取回归方程,然后在保留样本上做预测。 由于保留样本不涉及模型及参数的选择,该样本可获得比新数据更为精确的估计。
k重交叉难中,样本被分为k个子样本,轮流将k-1个子样本组合作为训练集,另外1个子样本作为保留集,这样会获得k个预测方程,记录k个保留样本的预测表现结果,然后求其平均值。【当n是观测总数目,k为n时,该方法又称作刀切法(jackknifing)】
bootstrap包中的crossval()函数可实现k重交叉验证
library(bootstrap)
> shrinkage<-function(fit,k=10){
+ require(bootstrap)
+ theta.fit<-function(x,y){lsfit(x,y)}
+ theta.predict<-function(fit,x){cbind(1,x)%*%fit$coef}
+ x<-fit$model[,2:ncol(fit$model)]
+ y<-fit$model[,1]
+ results<-crossval(x,y,theta.fit,theta.predict,ngroup=k)
+ r2<-cor(y,fit$fitted.values)^2
+ r2cv<-cor(y,results$cv.fit)^2
+ cat("Original R-square=",r2,"\n")
+ cat(k,"Fold Cross-Validated R-square=",r2cv,"\n")
+ cat("Change=",r2-r2cv,"\n")
+ }
> fit<-lm(Murder~Population+Income+Illiteracy+Frost,data=states)
> shrinkage(fit)
Original R-square= 0.5669502
10 Fold Cross-Validated R-square= 0.4541713
Change= 0.112779
可以看到,基于初始样本的R平方(0.567)过于乐观了,对新数据更好的方差解释率估计是交叉验证后的R平方(0.454)(注意,观测被随机分配到K个群组中因此每次预测结果都有少许不同)
2,相对重要性
如果我们想知道哪些便利是最重要的,如果预测变量不相关,可以根据预测变量与响应变量的相关系数来进行排序。
但是如果预测变量之间有一定的相关性,可以通过比较标准化的回归系数,它表示当其他预测变量不变时,该预测变量的一个标准差的变化可引起响应变量的预测变化(以标准差单位度量)
在进行回归分析前,可以用scale()函数将数据标准为均值为0,标准差为1的数据集。这样用R回归即可获得标准化的回归系数。(注意scale()函数返回的是一个矩阵,而lm()函数要求一个数据框,需要转换一下)
代码示例
states <- as.data.frame(state.x77[,c("Murder","Population","Illiteracy","Income","Frost")])
> zstates<-as.data.frame(scale(states))
> zfit<-lm(Murder~Population+Income+Illiteracy+Frost,data=zstates)
> coef(zfit)
(Intercept) Population Income Illiteracy Frost
-2.054026e-16 2.705095e-01 1.072372e-02 6.840496e-01 8.185407e-03
>
从此处可以看出,当其他因素不变时,文盲率一个标准差的变化将增加0.68个标准差的谋杀率。根据标准化的回归系数,可以认为Illiteracy是最重要的预测变量
小结:
本节包含当模型违反正态假设时,通常可以对响应变量尝试某种变换,使用car包中的powerTransform()函数,
当违反了线性假设时,对预测变量进行变换常常会比较有用,可以使用car包中的boxTidwell()函数
使用anova()函数或者AIC()函数来比较两个模型的效果,相对于AIC()函数anova()函数要求两个模型为嵌套关系。
可以通过逐步回归法和全子集回归法来从大量候选变量中选择最终的预测变量,从效果上来说全子集回归效果更好,但是它的计算量更大如果变量比较多的时候可能会很慢。
如果想要知道模型真正的效果可以使用交叉验证来验证模型的效果。
若果想知道自变量的重要性可以使用标准化的回归系数来比较多个自变量的相对重要性。