2015-05-08 6 views
5

Wenn ich eine Cluster-Standard-Fehlerfeldspezifikation mit plm und lfe ausführen, erhalte ich Ergebnisse, die sich bei der zweiten signifikanten Zahl unterscheiden. Weiß jemand, warum sie sich in ihrer Berechnung der SE's unterscheiden?Geclusterte Standardfehler in 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 

Antwort

7

Der Unterschied liegt in der Einstellung der Freiheitsgrade. Dies ist die übliche erste Schätzung, wenn nach Unterschieden in vermeintlich ähnlichen Standardfehlern gesucht wird (siehe z. B. Different Robust Standard Errors of Logit Regression in Stata and R). Hier kann das Problem veranschaulicht werden, wenn die Ergebnisse von (1) plm + vcovHC, (2) felm, (3) lm + cluster.vcov (aus Paket multiwayvcov) verglichen werden.

Zuerst habe ich wieder montieren alle Modelle:

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) 

Alle führen zu den gleichen Koeffizienten Schätzungen. Für m3 werden die Fixed Effects explizit gemeldet, während sie nicht für m1 und m2 sind. Daher wird für m3 nur der letzte Koeffizient mit tail(..., 1) extrahiert.

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

Die nicht robusten Standardfehler stimmen ebenfalls überein.

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 

Und wenn die gruppierte Standardfehler Vergleich können wir nun zeigen, dass felm den Grad von Freiheits Korrektur verwendet, während plm nicht:

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

Prüfungs 'multiwayvcov :: cluster.vcov' es ist leicht zu sehen, die Algebra verwendet, um die Stata kleine Probe Freiheitsgrade Korrektur zu erhalten, nämlich: '(df $ M/(df $ M - 1)) * ((df $ N - 1)/(df $ N - df $ K)) '. Aber was wäre die äquivalente df-Korrektur, wie sie verwendet wird? Sandwich (..., adjust = TRUE)? In [dieser Antwort] (http://stackoverflow.com/questions/27367974/) erklärst du, dass der Unterschied zwischen den beiden ist, dass für Stata die Division durch "1/(n - 1)" und für "Sandwich" ist es ist durch '1/(n - k)'. Aber ich bin mir nicht sicher, wie sich das in eine angemessene Algebra übersetzt ... Ersetze ich '(df $ N - 1)' durch '(df $ N - df $ K)'? – landroni

+1

Ich denke schon, aber habe den Code nicht im Detail überprüft. Beachten Sie auch, dass derzeit "Sandwich" selbst keine standardmäßigen Clusterfehler bietet. Alle theoretischen Details hinter dem 'Sandwich'-Paket sind auch in den zwei Vignetten dokumentiert. –