【问题标题】:Why is lm_robust() HC3 standard error smaller than coeftest() HC0 standard error?为什么 lm_robust() HC3 标准误差小于 coeftest() HC0 标准误差?
【发布时间】:2020-07-28 01:52:27
【问题描述】:

我正在使用包 'estimatr' 的 lm_robust 来构建包含 HC3 稳健标准误差的固定效应模型。我不得不从 vcovHC() 切换,因为我的数据样本太大而无法由它处理。

使用以下行进行回归:

lm_robust(log(SPREAD) ~ PERIOD, data = dat, fixed_effects = ~ STOCKS + TIME, se_type = "HC3")

代码运行良好,系数与使用 plm 包中的固定效果相同。由于数据样本太大,我无法使用 coeftest 估计 plm 输出的 HC3 标准误差,我比较了 lm_robust 的 HC3 估计器与 coeftest(model, vcov= vcovHC(model, type = HC1)) 的 HC1 结果 lm_robust 的 HC3 标准误差远小于 coeftest 的 HC1。

有人解释一下吗,因为 HC3 应该比 HC1 更严格。我感谢任何建议和解决方案。

EDIT 用于 coeftest 的模型:

plm(log(SPREAD) ~ PERIOD, data = dat, index = c("STOCKS", "TIME"), effect = "twoway", method = "within")

【问题讨论】:

  • 你能分享你的数据吗?另外,很高兴知道STOCKSTIME 的大小以及观察次数
  • 是的,当然;数据可以在github.com/dpendi/data 下载,STOCKS 的大小是 288,TIME 有 312 天。因此 312 * 288 个观测值。请参阅我上面的编辑以了解比较使用的两个代码行。因为我对使用 HC3 估计器很感兴趣,但由于 coeftest 需要计算能力而无法使用。
  • 我得到0.005444type_se = "HC10.005463type_se = "HC3 使用estimatr_0.18.0。我觉得还可以。
  • 是的,使用具有相同功能 (lm_robust) 的 HC1 和 HC3 会产生合理的顺序。但是我将 lm_robust 的 HC3 与应用于 plm 模型的 coeftest() 的 HC1 进行了比较

标签: r statistics lm robust


【解决方案1】:

似乎plmvcovHC() 方法会自动估计集群稳健标准误差,而lm_robust() 则不会。因此,与lm_robust 相比,HC1plm 标准误差的估计将显得夸大(就此而言,lm)。

使用一些玩具数据:

library(sandwich)
library(tidyverse)
library(plm)
library(estimatr)
library(lmtest)

set.seed(1981)
x <- sin(1:1000)
y <- 1 + x + rnorm(1000)
f <- as.character(sort(rep(sample(1:100), 10)))
t <- as.character(rep(sort(sample(1:10)), 100))

dat <- tibble(y = y, x = x, f = f, t = t)

lm_fit <- lm(y ~ x + f + t, data = dat)
plm_fit <- plm(y ~ x, index = c("f", "t"), model = "within", effect = "twoways", data = dat)
rb_fit <- lm_robust(y ~ x, fixed_effects = ~ f + t, data = dat, se_type = "HC1", return_vcov = TRUE)

sqrt(vcovHC(lm_fit, type = "HC1")[2, 2])
#> [1] 0.04752337
sqrt(vcovHC(plm_fit, type = "HC1"))
#>            x
#> x 0.05036414
#> attr(,"cluster")
#> [1] "group"
sqrt(rb_fit$vcov)
#>            x
#> x 0.04752337

rb_fit <- lm_robust(y ~ x, fixed_effects = ~ f + t, data = dat, se_type = "HC3", return_vcov = TRUE)
sqrt(vcovHC(lm_fit, type = "HC3")[2, 2])
#> [1] 0.05041177
sqrt(vcovHC(plm_fit, type = "HC3"))
#>            x
#> x 0.05042142
#> attr(,"cluster")
#> [1] "group"
sqrt(rb_fit$vcov)
#>            x
#> x 0.05041177

这两个包中似乎没有等效的集群稳健标准错误类型。但是,当在 lm_robust() 中指定集群健壮的 SE 时,SE 会更接近:

rb_fit <- lm_robust(y ~ x, fixed_effects = ~ f + t, clusters = f, data = dat, se_type = "CR0")
summary(rb_fit)
#> 
#> Call:
#> lm_robust(formula = y ~ x, data = dat, clusters = f, fixed_effects = ~f + 
#>     t, se_type = "CR0")
#> 
#> Standard error type:  CR0 
#> 
#> Coefficients:
#>   Estimate Std. Error t value  Pr(>|t|) CI Lower CI Upper DF
#> x    0.925    0.05034   18.38 1.133e-33   0.8251    1.025 99
#> 
#> Multiple R-squared:  0.3664 ,    Adjusted R-squared:  0.2888
#> Multiple R-squared (proj. model):  0.3101 ,  Adjusted R-squared (proj. model):  0.2256 
#> F-statistic (proj. model): 337.7 on 1 and 99 DF,  p-value: < 2.2e-16
coeftest(plm_fit, vcov. = vcovHC(plm_fit, type = "HC1"))
#> 
#> t test of coefficients:
#> 
#>   Estimate Std. Error t value  Pr(>|t|)    
#> x 0.925009   0.050364  18.366 < 2.2e-16 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

reprex package (v0.3.0) 于 2020 年 4 月 16 日创建

【讨论】:

  • 非常感谢!现在我明白这两种方法的区别了!
猜你喜欢
  • 2014-02-27
  • 1970-01-01
  • 1970-01-01
  • 2014-08-26
  • 2015-11-20
  • 2018-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多