2015-05-08 19 views
5

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

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 

回答

7

不同之处在于自由度调整。在寻找类似的标准错误中的差异时,这是通常的第一种猜测(参见例如,Different Robust Standard Errors of Logit Regression in Stata and R)。这里,当比较来自(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) 

都会导致同样的系数估计值。对于m3固定效果明确报告,但它们不是m1m2。因此,对于m3,只有最后一个系数用tail(..., 1)提取。

all.equal(coef(m1), coef(m2)) 
## [1] TRUE 
all.equal(coef(m1), tail(coef(m3), 1)) 
## [1] TRUE 

非健壮的标准错误也同意。

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 

,并比较集群标准错误时,我们现在可以证明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 
+0

检查'multiwayvcov :: cluster.vcov'是容易看到用于获得Stata小样本自由度校正的代数,即:(df $ M /(df $ M-1))*((df $ N - 1)/(df $ N - df $ K))'。但是,使用的等效df修正是“sandwich(...,adjust = TRUE)'?在[这个答案](http://stackoverflow.com/questions/27367974/)中,你解释了两者之间的区别在于,对于Stata,除法是'1 /(n-1)',而'sandwich'它是由'1 /(n - k)'。然而,我不确定这是如何转化为适当的代数的...我是否用上面的'(df $ N - df $ K)'替代'(df $ N - 1)'? – landroni

+1

我这么认为,但没有详细检查代码。另请注意,目前'sandwich'本身并不提供集群标准错误。 “三明治”套餐背后的所有理论细节也记录在两个小插曲中。 –