2015-05-08 29 views
5

Quando si esegue una specifica del pannello di errore standard del cluster con plm e lfe, ottengo risultati diversi nella seconda cifra significativa. Qualcuno sa perché si differenziano nel calcolo degli SE?Errori standard clusterizzati diversi 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 

risposta

7

La differenza è nella regolazione dei gradi di libertà. Questa è la solita prima ipotesi quando si cercano differenze in errori standard apparentemente simili (ad esempio, Different Robust Standard Errors of Logit Regression in Stata and R). Qui, il problema può essere illustrato confrontando i risultati da (1) plm + vcovHC, (2) felm, (3) lm + cluster.vcov (dal pacchetto multiwayvcov).

In primo luogo, ho rimontare tutti i modelli:

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) 

portare a tutti le stesse stime dei coefficienti. Per m3 gli effetti fissi sono riportati esplicitamente mentre non sono per m1 e m2. Quindi, per m3 viene estratto solo l'ultimo coefficiente con tail(..., 1).

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

Anche gli errori standard non robusti concordano.

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 

E quando si confrontano gli errori standard cluster possiamo ora dimostrare che felm utilizza la correzione gradi di libertà, mentre plm non:

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

Esaminando 'multiwayvcov :: cluster.vcov' è è facile vedere l'algebra utilizzata per ottenere la correzione dei gradienti di libertà a piccoli campioni di Stata, ovvero: '(df $ M/(df $ M - 1)) * ((df $ N - 1)/(df $ N - df $ K)) '. Ma quale sarebbe la correzione df equivalente usata come 'sandwich (..., adjust = TRUE)'? In [questa risposta] (http://stackoverflow.com/questions/27367974/) spieghi che la differenza tra i due è che per Stata la divisione è per '1/(n - 1)', e per 'sandwich' è per '1/(n - k)'. Tuttavia non sono sicuro di come questo si traduca in un'algebra appropriata ... Sostituisco '(df $ N - 1)' da '(df $ N - df $ K)' sopra? – landroni

+1

Penso di sì ma non ho controllato il codice in dettaglio. Si noti inoltre che attualmente 'sandwich' non offre al momento errori standard in cluster. Tutti i dettagli teorici alla base del pacchetto "sandwich" sono anche documentati nelle due vignette. –