线性回归一个重要的假设就是残差没有异方差性。简单来说就是残差的方差不会随着响应变量的拟合值而增加。在本篇文章,我会解释为什么检测异方差性是重要的?如何检测模型的异方差性?如果存在,如何通过R代码来纠正这个问题。这个过程有时也被称为残差分析。
为什么检测异方差很重要?
一旦你,通常都要检测残差的异方差性。原因是我们想要检测建立的模型能否解释响应变量Y的一些模式,而它最终是显示在残差上的。如果存在异方差,得到的回归模型是低效并且不稳定的,后面就有可能会得到奇怪的预测结果。
如何检测异方差?
下面通过R内置的cars
数据集得到的一个回归模型来做说明。首先通过lm()
函数来建立模型:
lmMod <- lm(dist ~ speed, data=cars) # initial model
现在,模型已经准备好了。下面通过两种方式来检测异方差:
图形法
统计检验
图形法
par(mfrow=c(2,2)) # init 4 charts in 1 panelplot(lmMod)
图形如下:
我们感兴趣的是左上角和左下角的两幅图。左上角是残差对拟合值作图。而左下角是标准化残差对拟合值作图。如果完全没有异方差,你应该会看到一个完全随机的,点在整个X轴范围内是均匀分布的,并且得到的是一条平坦的红线。
但在这个案例中,从左上图可以看出红线稍微有些弯曲,残差似乎随着拟合值的增大而上升。因此,推测异方差是存在的。
统计检验
有时你可能需要一个算法来检测异方差。以便自动的量化它的存在并作出修改。这里有两种检验方法来判断异方差是否存在—Breush-Pagan检验和NCV检验。
Breush Pagan 检验
lmtest::bptest(lmMod) # Breusch-Pagan test studentized Breusch-Pagan testdata: lmModBP = 3.2149, df = 1, p-value = 0.07297
NCV检验
car::ncvTest(lmMod) # Breusch-Pagan testNon-constant Variance Score Test Variance formula: ~ fitted.values Chisquare = 4.650233 Df = 1 p = 0.03104933
在给定显著性水平0.05的情况下,这两个检验的P值都很小。因此我们可以拒绝残差的方差是恒定的零假设,并推断出异方差确实是存在的,从而证实了上面的图形推断。
如何纠正异方差?
重新构建预测模型
变量变换,如Box-Cox变换
Box-Cox变换
是一种将变量转化为近似正态分布的数学变换。通常情况下,对Y变量做Box-Cox变换可以解决这个问题,这正是我要做的。
library(caret)distBCMod <- caret::BoxCoxTrans(cars$dist)print(distBCMod)Box-Cox Transformation50 data points used to estimate LambdaInput data summary: Min. 1st Qu. Median Mean 3rd Qu. Max. 2.00 26.00 36.00 42.98 56.00 120.00 Largest/Smallest: 60 Sample Skewness: 0.759 Estimated Lambda: 0.5
由Box-Cox变换得到的模型对象已经有了,现在把它应用到car$dist
上并添加到一个新的数据框。
cars <- cbind(cars, dist_new=predict(distBCMod, cars$dist)) # append the transformed variable to carshead(cars) # view the top 6 rows speed dist dist_new1 4 2 0.82842712 4 10 4.32455533 7 4 2.00000004 7 22 7.38083155 8 16 6.00000006 9 10 4.3245553
针对新的回归模型,变换后的数据已经有了。现在开始创建模型并检查异方差。
lmMod_bc <- lm(dist_new ~ speed, data=cars)bptest(lmMod_bc) studentized Breusch-Pagan testdata: lmMod_bcBP = 0.011192, df = 1, p-value = 0.9157
对于P值为0.91,我们不能拒绝零假设(残差的方差是恒定的)。因此推断残差的方差是相同的。同样地,用图形来检查下异方差。
plot(lmMod_bc)
图形如下:
左上图的线更加扁平并且残差是均匀分布的。因此,异方差的问题已经解决了。
本文由雪晴数据网负责翻译整理,原文请参考作者Selva Prabhakaran。转载请注明原文链接