R plm与lfe中不同的聚集标准误差

R plm与lfe中不同的聚集标准误差,r,plm,lfe,R,Plm,Lfe,当我使用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

当我使用
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
set.seed(572015)
图书馆(lfe)
图书馆(plm)
图书馆(lmtest)
#聚类示例

x差异在于自由度调整。当寻找假定相似的标准误差的差异时,这通常是第一个猜测(例如,参见)。这里,当比较来自(1)plm
+
vcovHC
,(2)felm,(3)lm+
cluster.vcov
(来自package
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)
非稳健标准误差也一致

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 

检查
multiwayvcov::cluster.vcov
很容易看到用于获得Stata小样本自由度校正的代数,即:
(df$M/(df$M-1))*((df$N-1)/(df$N-df$K))
。但是使用的等效df校正是
三明治(…,adjust=TRUE)
?在您的解释中,两者之间的区别在于,对于Stata,除法是通过
1/(n-1)
,对于
sandwich
则是通过
1/(n-k)
。但我不确定这是如何转化为适当的代数。。。我是否将上面的
(df$N-1)
替换为
(df$N-df$K)
?我想是的,但还没有详细检查代码。还请注意,当前的
sandwich
本身目前不提供集群标准错误。
sandwich
包背后的所有理论细节也记录在两个案例中。更新:聚集协方差现在也可在
sandwich
中找到。来自
multiwayvcov
cluster.vcov()
函数已被重写和扩展,并已作为
vcovCL()
合并到
sandwich
中。看见
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 
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