楼主: hubifeng?
29178 2

[R] 异方差检验及解决方法的R实现 [推广有奖]

已卖:1075份资源

副教授

68%

还不是VIP/贵宾

-

威望
0
论坛币
10579 个
通用积分
132.3199
学术水平
87 点
热心指数
86 点
信用等级
62 点
经验
486 点
帖子
661
精华
0
在线时间
1064 小时
注册时间
2010-12-7
最后登录
2025-10-28

楼主
hubifeng? 学生认证  发表于 2015-2-12 15:17:45 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

简介+案例+检验方法+解决方法+异方差代码



      关于异方差我们必须注意到这样一个事实:即便误差具有一致的方差,最小二乘残差仍有不等的方差。我们可以通过对学生残差(主要是排除一些异常值,让数据平稳一些)根据拟合值绘制散点图来辨别之。当然我们也有统计的办法如Breusch-Pagan检验。

      在R中,扩展包lmtest中的Breusch-Pagan检验。或者利用car包中的ncv.test()函数。二者工作的原理都是相同的。在回归之后,我们可以对拟合的模型采用bptest()函数


  1. unrestricted<-lm(z~x)
  2. bptest(unrestricted)
复制代码



      这将得到检验的“学生化的”(studentized)结果。如果为了保持与其他软件结论的一致性(包括ncv.test()),我们可以设置studentize=FALSE


1、案例



我们来看一个例子:以下数据取自伍德里奇的《计量经济学导论》均保留原数据名
  1. library(foreign)
  2. B<-read.dta("D:/R/data/SAVING.dta")#导入数据
  3. library(lmtest)
  4. result2<-lm(sav~inc+size+educ+age+black,data=B)
  5. bptest(result2)
  6.         studentized Breusch-Pagan test
  7. data:  result2
  8. BP =5.5756, df = 5, p-value = 0.3497 #从这里看得出数据是不具有异方差性的

  9. C<-read.dta("D:/R/data/SMOKE.dta")
  10. result3<-lm(cigs~log(income)+cigpric+educ+age+restaurn,data=C)
  11. bptest(result3)
  12.         studentized Breusch-Pagan test
  13. data:  result3
  14. BP =11.0583, df = 5, p-value = 0.05024#这里可以认为数据有异方差性,但表现的不是特别强烈
  15. 如果去掉“学生化”我们可以得到:
  16. >result3<-lm(cigs~log(income)+cigpric+educ+age+restaurn,data=C)
  17. >bptest(result3,studentize=FALSE)
  18.         Breusch-Pagan test
  19. data:  result3
  20. BP =24.6376, df = 5, p-value = 0.0001637#这里可以看出异方差性是很明显的。
  21. 这也说明了学生化对异方差的修正作用。
复制代码




2、异方差检验方法



方法1
残差图

方法2
ncvTest生成计分检验,原假设为误差方差不变,备择假设为误差方差随拟合值水平的变化而变化
library(car)
ncvTest(fit) #This test is often called the Breusch-Pagan test
spreadLevelPlot创建标准化残差绝对值与拟合值的散点图;若输出结果建议幂次变换(suggested power transformation)接近1,则异方差不明显,即不需要进行变换;若幂次变换为0.5,则用根号y代替y;若幂次变换为0,则用对数变换。
spreadLevelPlot(fit)

方法3

  1. library(lmtest)
  2. lmtest的Breusch-Pagan Test
  3. bptest(fit,studentize=FALSE)
  4. bptest(fit) #输出学生化(studentized)的残差结果,学生化具有修正异方差的作用
复制代码



方法4

  1. lmtest的Goldfeld-Quandt Test
  2. gqtest(fit)
复制代码




其他方法
bartlett.test
LiMcLeod{portes}可以进行多元的Portmanteau Q检验
protest{portes}可以进行一元的Portmanteau Q检验




3、解决方法:



方法1
NeweyWest()函数可以进行异方差和自相关稳健性Newey—West估计
library(sandwich)
NeweyWest(fit)
neweywest <- coeftest(fit, vcov = NeweyWest(fit))
print(neweywest)

hccm(fit) #car packages 协方差阵
vcovHAC(fit) #sandwich packages 协方差阵
vcov(fit)

方法2
加权最小二乘(lm模型换成gls模型)


4、异方差的计算代码



  1. ## packages and data
  2. library("AER")
  3. data("CigarettesB")
  4. ## regression
  5. cig_lm2 < - lm(packs ~ price + income, data = CigarettesB)
  6. ## auxiliary regression
  7. aux <- residuals(cig_lm2)^2
  8. aux_lm <- lm(aux ~ income * price + I(income^2) + I(price^2),
  9. data = CigarettesB)
  10. ## test statistic
  11. nrow(CigarettesB) * summary(aux_lm)$r.squared
  12. pchisq( nrow(CigarettesB) * summary(aux_lm)$r.squared,df=5,lower.tail=F)
复制代码






——yujun7654321的博客

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:检验及解决 异方差检验 解决方法 方差检验 R实现 散点图 模型 统计

已有 3 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
跃奇 + 5 + 1 + 1 + 1 精彩帖子
niuniuyiwan + 100 + 100 + 5 + 5 + 5 精彩帖子
xddlovejiao1314 + 60 + 60 精彩帖子

总评分: 经验 + 160  论坛币 + 165  学术水平 + 6  热心指数 + 6  信用等级 + 6   查看全部评分

本帖被以下文库推荐

沙发
niuniuyiwan 在职认证  发表于 2015-10-31 13:16:04
感谢楼主分享!

藤椅
henchli 学生认证  发表于 2018-12-26 17:48:44
感谢您的帮助~

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2026-1-2 14:49