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

发布时间: 2016-01-15 阅读数: 2730

线性回归一个重要的假设就是残差没有异方差性。简单来说就是残差的方差不会随着响应变量的拟合值而增加。在本篇文章,我会解释为什么检测异方差性是重要的?如何检测模型的异方差性?如果存在,如何通过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.tv/cms/article/113

分享到:
热门文章

REmap发布,用R绘制百度迁徙图

2015年07月23日更新 21085次阅读

学习R语言,一篇文章让你从懵圈到入

2016年05月09日更新 14670次阅读

清华大学教授:大数据时代 统计学依

2015年08月07日更新 11291次阅读

在R中填充缺失数据—mice包

2015年12月31日更新 10743次阅读

精通 R plot—第一部分:颜色

2016年01月20日更新 9549次阅读

非统计学专业的人该如何学习 R 语

2015年07月24日更新 8107次阅读
热门课程

R语言初级课程

2015年02月20日发布 3231名学员

R语言高效数据清理工具包dplyr

2015年08月30日发布 1690名学员

R语言数据分析入门

2016年05月10日发布 1566名学员

如何用R做数据预处理

2016年06月03日发布 1160名学员

全栈数据工程师养成攻略

2016年11月08日发布 1019名学员

R语言大规模数据分析实战

2015年12月17日发布 952名学员
登录 注册