2015-05-08 13 views
5

plm ve lfe ile bir küme standart hata paneli belirtimi çalıştırdığımda, ikinci önemli sayıdan farklı sonuçlar elde ederim. SE'leri hesaplarken neden farklı olduklarını bilen var mı?Kümelenmiş standart hatalar plm vs lfe içinde farklı

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 

cevap

7

fark derece serbestlik ayarlanması bulunmaktadır. Bu, sözde benzer standart hatalardaki farklılıkları ararken genel ilk tahmindir (bkz. Ör., Different Robust Standard Errors of Logit Regression in Stata and R). Burada, sorunu, (2) felm (1) plm + vcovHC sonuçları karşılaştırırken gösterilen (3) (paket multiwayvcov den) lm + cluster.vcov. Edilebilir

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) 

aynı katsayı tahminlerine Tüm kurşun:

Birincisi, tüm modelleri takın. m3 için, m1 ve m2 için değil, sabit etkiler açıkça bildirilir. Bu nedenle, m3 için sadece son katsayı tail(..., 1) ile ayıklanır. Sağlam olmayan standart hatalar da aynı fikirdedir.

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 

Ve kümelenmiş standart hataları karşılaştırırken şimdi plm yok iken felm derece serbestlik düzeltme kullandığı gösterebilir:

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 :: öyle cluster.vcov' 'incelenmesi Stata küçük örnek dereceli serbestlik düzeltme elde etmek için kullanılan cebiri görmek kolay, yani: (df $ M/(df $ M - 1)) * ((df $ N - 1)/(df $ N - df $ K)) '. Fakat kullanılan eşdeğer df düzeltmesi ne olurdu? Sandwich (..., set = TRUE) '? [Bu cevap] 'da (http://stackoverflow.com/questions/27367974/), ikisi arasındaki farkın, Stata için bölümün' 1/(n - 1) 've' sandviçi 'için olduğunu açıklıyorsunuz. 1/(n - k) 'dir. Yine de bunun uygun cebire nasıl dönüştüğünden emin değilim ... Yukarıdaki (df $ N - 1) 'i (df $ N-df $ K)' yi yukarıda mı değiştirmeliyim? – landroni

+1

Sanırım, ancak kodu ayrıntılı olarak kontrol etmediniz. Ayrıca şu anda 'sandviçin' şu anda kümelenmiş standart hatalar sunmadığını unutmayın. 'Sandviç' paketinin arkasındaki tüm teorik bilgiler de iki vinyet içinde belgelenmiştir. –