转载

如何检测异方差并纠正它?

线性回归一个重要的假设就是残差没有异方差性。简单来说就是残差的方差不会随着响应变量的拟合值而增加。在本篇文章,我会解释为什么检测异方差性是重要的?如何检测模型的异方差性?如果存在,如何通过R代码来纠正这个问题。这个过程有时也被称为残差分析。

为什么检测异方差很重要?

一旦你建立线性回归模型,通常都要检测残差的异方差性。原因是我们想要检测建立的模型能否解释响应变量Y的一些模式,而它最终是显示在残差上的。如果存在异方差,得到的回归模型是低效并且不稳定的,后面就有可能会得到奇怪的预测结果。

如何检测异方差?

下面通过R内置的cars数据集得到的一个回归模型来做说明。首先通过lm()函数来建立模型: lmMod <- lm(dist ~ speed, data=cars) # initial model 现在,模型已经准备好了。下面通过两种方式来检测异方差: 1.图形法 2.统计检验

图形法 par(mfrow=c(2,2)) # init 4 charts in 1 panel plot(lmMod) 图形如下: 如何检测异方差并纠正它? 我们感兴趣的是左上角和左下角的两幅图。左上角是残差对拟合值作图。而左下角是标准化残差对拟合值作图。如果完全没有异方差,你应该会看到一个完全随机的,点在整个X轴范围内是均匀分布的,并且得到的是一条平坦的红线。

但在这个案例中,从左上图可以看出红线稍微有些弯曲,残差似乎随着拟合值的增大而上升。因此,推测异方差是存在的。

统计检验

有时你可能需要一个算法来检测异方差。以便自动的量化它的存在并作出修改。这里有两种检验方法来判断异方差是否存在—Breush-Pagan检验和NCV检验。

Breush Pagan 检验 lmtest::bptest(lmMod) # Breusch-Pagan test studentized Breusch-Pagan test

data: lmMod BP = 3.2149, df = 1, p-value = 0.07297 NCV检验 car::ncvTest(lmMod) # Breusch-Pagan test Non-constant Variance Score Test Variance formula: ~ fitted.values Chisquare = 4.650233 Df = 1 p = 0.03104933在给定显著性水平0.05的情况下,这两个检验的P值都很小。因此我们可以拒绝残差的方差是恒定的零假设,并推断出异方差确实是存在的,从而证实了上面的图形推断。

如何纠正异方差?

重新构建预测模型

变量变换,如Box-Cox变换

Box-Cox变换

Box-Cox变换是一种将变量转化为近似正态分布的数学变换。通常情况下,对Y变量做Box-Cox变换可以解决这个问题,这正是我要做的。 library(caret) distBCMod <- caret::BoxCoxTrans(cars$dist) print(distBCMod) Box-Cox Transformation

50 data points used to estimate Lambda

Input 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 cars head(cars) # view the top 6 rows speed dist dist_new 1 4 2 0.8284271 2 4 10 4.3245553 3 7 4 2.0000000 4 7 22 7.3808315 5 8 16 6.0000000 6 9 10 4.3245553 针对新的回归模型,变换后的数据已经有了。现在开始创建模型并检查异方差。 lmMod_bc <- lm(dist_new ~ speed, data=cars) bptest(lmMod_bc) studentized Breusch-Pagan test

data: lmMod_bc BP = 0.011192, df = 1, p-value = 0.9157 对于P值为0.91,我们不能拒绝零假设(残差的方差是恒定的)。因此推断残差的方差是相同的。同样地,用图形来检查下异方差。 plot(lmMod_bc) 图形如下: 如何检测异方差并纠正它? 左上图的线更加扁平并且残差是均匀分布的。因此,异方差的问题已经解决了。

本文由雪晴数据网负责翻译整理,原文请参考How to detect heteroscedasticity and rectify it?作者Selva Prabhakaran。转载请注明原文链接http://www.xueqing.cc/cms/article/113

原文  http://www.ituring.com.cn/article/210875
正文到此结束
Loading...