plm与lfe不同的聚类标准错误

ken*_*nyB 8 r lfe plm

当我运行集群标准错误面板规范时plm,lfe我得到的结果在第二个有效数字上有所不同.有谁知道为什么他们的SE计算不同?

set.seed(572015)
library(lfe)
library(plm)
library(lmtest)
# clustering example
x <- c(sapply(sample(1:20), rep, times = 1000)) + rnorm(20*1000, sd = 1)
y <- 5 + 10*x + rnorm(20*1000, sd = 10) + c(sapply(rnorm(20, sd = 10), rep, times = 1000))
facX <- factor(sapply(1:20, rep, times = 1000))
mydata <- data.frame(y=y,x=x,facX=facX, state=rep(1:1000, 20))
model <- plm(y ~ x, data = mydata, index = c("facX", "state"), effect = "individual", model = "within")
plmTest <- coeftest(model,vcov=vcovHC(model,type = "HC1", cluster="group"))
lfeTest <- summary(felm(y ~ x | facX | 0 | facX))
data.frame(lfeClusterSE=lfeTest$coefficients[2],
       plmClusterSE=plmTest[2])

lfeClusterSE plmClusterSE
1   0.06746538   0.06572588
Run Code Online (Sandbox Code Playgroud)

Ach*_*eis 10

不同之处在于自由度调整.当寻找所谓类似标准误差的差异时,这是通常的第一个猜测(参见例如Stata和R中的Logit回归的不同稳健标准误差).这里,当比较(1)plm+ vcovHC,(2)felm,(3)lm+ cluster.vcov(来自包装multiwayvcov)的结果时,可以说明问题.

首先,我改装所有型号:

m1 <- plm(y ~ x, data = mydata, index = c("facX", "state"),
  effect = "individual", model = "within")
m2 <- felm(y ~ x | facX | 0 | facX, data = mydata)
m3 <- lm(y ~ facX + x, data = mydata)
Run Code Online (Sandbox Code Playgroud)

所有这些都导致相同的系数估计.因为m3固定效果是明确报告的,而不是m1m2.因此,m3仅提取最后一个系数tail(..., 1).

all.equal(coef(m1), coef(m2))
## [1] TRUE
all.equal(coef(m1), tail(coef(m3), 1))
## [1] TRUE
Run Code Online (Sandbox Code Playgroud)

不稳健的标准错误也同意.

se <- function(object) tail(sqrt(diag(object)), 1)
se(vcov(m1))
##          x 
## 0.07002696 
se(vcov(m2))
##          x 
## 0.07002696 
se(vcov(m3))
##          x 
## 0.07002696 
Run Code Online (Sandbox Code Playgroud)

当比较聚类标准误差时,我们现在可以显示felm使用自由度校正而plm不是:

se(vcovHC(m1))
##          x 
## 0.06572423 
m2$cse
##          x 
## 0.06746538 
se(cluster.vcov(m3, mydata$facX))
##          x 
## 0.06746538 
se(cluster.vcov(m3, mydata$facX, df_correction = FALSE))
##          x 
## 0.06572423 
Run Code Online (Sandbox Code Playgroud)

  • 更新:聚类协方差现在也可以在“三明治”中使用。“multiwayvcov”中的“cluster.vcov()”函数已被重写和扩展,并已作为“vcovCL()”合并到“sandwich”中。请参阅 https://CRAN.R-project.org/web/packages/sandwich/vignettes/sandwich-CL.pdf (2认同)