plm 与 lfe 中的聚类标准错误不同
Clustered standard errors different in plm vs 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*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
区别在于自由度调整。这是在假定相似的标准误差中寻找差异时通常的第一个猜测(参见 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
的固定效应被明确报告,而 m1
和 m2
则没有。因此,对于 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
当我 运行 使用 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
区别在于自由度调整。这是在假定相似的标准误差中寻找差异时通常的第一个猜测(参见 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
的固定效应被明确报告,而 m1
和 m2
则没有。因此,对于 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