简介+案例+检验方法+解决方法+异方差代码
关于异方差我们必须注意到这样一个事实:即便误差具有一致的方差,最小二乘残差仍有不等的方差。我们可以通过对学生残差(主要是排除一些异常值,让数据平稳一些)根据拟合值绘制散点图来辨别之。当然我们也有统计的办法如Breusch-Pagan检验。
在R中,扩展包lmtest中的Breusch-Pagan检验。或者利用car包中的ncv.test()函数。二者工作的原理都是相同的。在回归之后,我们可以对拟合的模型采用bptest()函数
复制代码
- unrestricted<-lm(z~x)
- bptest(unrestricted)
这将得到检验的“学生化的”(studentized)结果。如果为了保持与其他软件结论的一致性(包括ncv.test()),我们可以设置studentize=FALSE
1、案例
我们来看一个例子:以下数据取自伍德里奇的《计量经济学导论》均保留原数据名
- library(foreign)
- B<-read.dta("D:/R/data/SAVING.dta")#导入数据
- library(lmtest)
- result2<-lm(sav~inc+size+educ+age+black,data=B)
- bptest(result2)
- studentized Breusch-Pagan test
- data: result2
- BP =5.5756, df = 5, p-value = 0.3497 #从这里看得出数据是不具有异方差性的
- C<-read.dta("D:/R/data/SMOKE.dta")
- result3<-lm(cigs~log(income)+cigpric+educ+age+restaurn,data=C)
- bptest(result3)
- studentized Breusch-Pagan test
- data: result3
- BP =11.0583, df = 5, p-value = 0.05024#这里可以认为数据有异方差性,但表现的不是特别强烈
- 如果去掉“学生化”我们可以得到:
- >result3<-lm(cigs~log(income)+cigpric+educ+age+restaurn,data=C)
- >bptest(result3,studentize=FALSE)
- Breusch-Pagan test
- data: result3
- BP =24.6376, df = 5, p-value = 0.0001637#这里可以看出异方差性是很明显的。
- 这也说明了学生化对异方差的修正作用。
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
- library(lmtest)
- lmtest的Breusch-Pagan Test
- bptest(fit,studentize=FALSE)
- bptest(fit) #输出学生化(studentized)的残差结果,学生化具有修正异方差的作用
方法4
- lmtest的Goldfeld-Quandt Test
- 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、异方差的计算代码
- ## packages and data
- library("AER")
- data("CigarettesB")
- ## regression
- cig_lm2 < - lm(packs ~ price + income, data = CigarettesB)
- ## auxiliary regression
- aux <- residuals(cig_lm2)^2
- aux_lm <- lm(aux ~ income * price + I(income^2) + I(price^2),
- data = CigarettesB)
- ## test statistic
- nrow(CigarettesB) * summary(aux_lm)$r.squared
- pchisq( nrow(CigarettesB) * summary(aux_lm)$r.squared,df=5,lower.tail=F)
——yujun7654321的博客



雷达卡




京公网安备 11010802022788号







