异方差性修正标准误差的回归

30
我想找到最接近Stata输出的R实现,用于拟合具有异方差校正标准误差的最小二乘回归函数。
具体来说,我希望校正后的标准误差在“summary”中,并且不需要在我的初步假设检验中进行额外的计算。我正在寻找与Eviews和Stata提供的解决方案一样“简洁”的解决方案。
到目前为止,使用“lmtest”包,我能找到的最好的解决方案是:
model <- lm(...)
coeftest(model, vcov = hccm)

这给了我想要的输出,但似乎没有按照“coeftest”的预期目的使用。我还必须使用不正确的标准误差来使用摘要读取R^2和F统计量等。我觉得鉴于R的动态性,应该存在一个“一行”解决方案来解决这个问题。

你需要注意hccm()函数也需要安装“car”包。我花了几分钟才找出这是从哪里引起的。 - Gavin Simpson
3个回答

39

我认为你在使用lmtest包中的coeftest功能是正确的。请查看sandwich包,它包括此功能并且与你已经找到的lmtest包相互配合。

> # generate linear regression relationship
> # with Homoskedastic variances
> x <- sin(1:100)
> y <- 1 + x + rnorm(100)
> ## model fit and HC3 covariance
> fm <- lm(y ~ x)
> vcovHC(fm)
            (Intercept)           x
(Intercept) 0.010809366 0.001209603
x           0.001209603 0.018353076
> coeftest(fm, vcov. = vcovHC)

t test of coefficients:

            Estimate Std. Error t value  Pr(>|t|)    
(Intercept)  1.01973    0.10397  9.8081 3.159e-16 ***
x            0.93992    0.13547  6.9381 4.313e-10 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

要获得F检验,请查看函数waldtest()

> waldtest(fm, vcov = vcovHC)
Wald test

Model 1: y ~ x
Model 2: y ~ 1
  Res.Df Df      F    Pr(>F)    
1     98                        
2     99 -1 48.137 4.313e-10 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

你可以编写一个简单的函数将这两个功能组合起来,如果你想要一行代码的话...
在 sandwich 包中的 Econometric Computing with HC and HAC Covariance Matrix Estimators 文档中有很多示例,可以链接 lmtest 和 sandwich 来实现你想要的功能。 编辑: 一行代码可能只需这么简单:
mySummary <- function(model, VCOV) {
    print(coeftest(model, vcov. = VCOV))
    print(waldtest(model, vcov = VCOV))
}

我们可以像这样使用它(在上面的示例中):
> mySummary(fm, vcovHC)

t test of coefficients:

            Estimate Std. Error t value  Pr(>|t|)    
(Intercept)  1.01973    0.10397  9.8081 3.159e-16 ***
x            0.93992    0.13547  6.9381 4.313e-10 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Wald test

Model 1: y ~ x
Model 2: y ~ 1
  Res.Df Df      F    Pr(>F)    
1     98                        
2     99 -1 48.137 4.313e-10 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

7
@Jerome:如果你对一个回答感到满意,请点赞或接受它(这就是 SO 上的运作方式)。好的,你支付给我与购买 Stata 相同的费用,我将为你编写一行代码;-) 说真的,R 是由志愿者和个人开发的。这些人开发他们需要使用的代码,并按照他们认为应该做的方式进行开发。lmtest 的目的是提供线性模型的有针对性测试。作者可能认为最好提供原始工具来完成这些任务,并且没有需要你想要的概述-糖果。在我的回答中,我将向你展示编写一个一行包装器是多么简单。 - Gavin Simpson
你有没有想过STATA在这里做了什么,因为我试图复制别人使用STATA的“robust”选项计算出的结果。 - Matt Bannert
3
啊,我可以回答我自己的问题了(我在上一个评论中提出的那个):与STATA所做的相当的是使用typ="HC1"和vcovHC。 - Matt Bannert
1
lmtest为什么没有提供mysummary(...,robust = TRUE)的简要说明。首先,“鲁棒性”经常被误解-它只是一种非常特定的鲁棒性。其次,不可避免地会有一个问题:如果修改协方差矩阵估计值,“残差标准误差”和“R-平方”是什么?答案:并不清楚。你明确考虑异方差性,这样就不会有“一个”残差方差。同样,平方和的分解对于R-平方来说也不像“通常”那样工作。因此,用户必须明确要求coeftest()waldtest() - Achim Zeileis

10

我找到了一个R函数,恰好满足您的需求。它可以在不进行额外计算的情况下为您提供强健的标准误差。您只需对lm.object运行summary(), 如果设置参数robust=T,它将返回类似于Stata的异方差一致的标准误差。

summary(lm.object, robust=T)

你可以在https://economictheoryblog.com/2016/08/08/robust-standard-errors-in-r/上找到该函数。

1
如果不加载作者提供的外部脚本来更改摘要函数,这将无法正常工作。如果没有加载该脚本,R 将简单地忽略鲁棒变量并输出标准异方差不一致的标准误差。 - ifly6


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接