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

如何检测异方差并纠正它?雪晴数据网线性回归一个重要的假设就是残差没有异方差性

雪晴数据网

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

图形如下:

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

左上图的线更加扁平并且残差是均匀分布的。因此,异方差的问题已经解决了。

今天的文章如何检测异方差并纠正它?分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/67709.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注