雪晴数据网
线性回归一个重要的假设就是残差没有异方差性。简单来说就是残差的方差不会随着响应变量的拟合值而增加。在本篇文章,我会解释为什么检测异方差性是重要的?如何检测模型的异方差性?如果存在,如何通过R代码来纠正这个问题。这个过程有时也被称为残差分析。
为什么检测异方差很重要?
一旦你建立线性回归模型,通常都要检测残差的异方差性。原因是我们想要检测建立的模型能否解释响应变量Y的一些模式,而它最终是显示在残差上的。如果存在异方差,得到的回归模型是低效并且不稳定的,后面就有可能会得到奇怪的预测结果。
如何检测异方差?
下面通过R内置的cars
数据集得到的一个回归模型来做说明。首先通过lm()
函数来建立模型:
lmMod <- lm(dist ~ speed, data=cars) # initial model
现在,模型已经准备好了。下面通过两种方式来检测异方差:
- 图形法
- 统计检验
图形法
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