2015-05-08 13 views
5

Po uruchomieniu standardowej specyfikacji panelu błędów klastra z plm i lfe otrzymuję wyniki, które różnią się od drugiej cyfry znaczącej. Czy ktokolwiek wie, dlaczego różnią się one kalkulacją SE?Skonfigurowane standardowe błędy standardowe różnią się w porównaniu do 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 

Odpowiedz

7

Różnica polega na dostosowaniu stopni swobody. Jest to zwykłe pierwsze przypuszczenie przy poszukiwaniu różnic rzekomo podobnych błędów standardowych (patrz np. Different Robust Standard Errors of Logit Regression in Stata and R). W tym przypadku problem można zilustrować porównując wyniki z (1) plm + vcovHC, (2) felm, (3) lm + cluster.vcov (z opakowania multiwayvcov).

Najpierw zamontować wszystkie modele:

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) 

prowadzą do tych samych szacunków współczynników. W przypadku m3 ustalone efekty są jawnie zgłaszane, gdy nie są dla m1 i m2. W związku z tym tylko dla ostatniego współczynnika dla m3 jest uzyskiwany tail(..., 1).

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

Niestabilne błędy standardowe również się zgadzają.

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 

I porównując klastrowych standardowe błędy możemy teraz pokazać, że felm wykorzystuje korekcję stopni-of-swobody podczas plm nie:

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

Badanie 'multiwayvcov :: cluster.vcov' jest łatwo można zobaczyć algebrę używaną do uzyskania poprawki Staty o niewielkich próbach stopni swobody, a mianowicie: '(df $ M/(df $ M - 1)) * ((df $ N - 1)/(df $ N - df $ K)) '. Ale jaka byłaby odpowiednia korekta df, jaką zastosowano, to 'sandwich (..., adjust = TRUE)'? W [tej odpowiedzi] (http://stackoverflow.com/questions/27367974/) wyjaśnisz, że różnica między tymi dwoma jest taka, że ​​dla Stata podział to "1/(n - 1)", a dla 'sandwich' jest to '1/(n - k)'. Jednak nie jestem pewien, jak to przekłada się na odpowiednią algebrę ... Czy zastępuję '(df $ N - 1)' '' '' 'df $ - df $" powyżej? – landroni

+1

Myślę, że tak, ale nie sprawdziłem szczegółowo kodu. Zauważ też, że obecnie 'sandwich' sam w sobie nie oferuje klastrowych błędów standardowych. Wszystkie teoretyczne szczegóły dotyczące pakietu "sandwich" są również udokumentowane w dwóch winietach. –