R'de standart hata kümelemesi (elle veya plm olarak)


33

Standart "kümeleme" hatasını ve R'de nasıl çalıştırılacağını anlamaya çalışıyorum (Stata'da önemsiz). RI'de ya plmkendi işlevimi kullanmakta ya da yazmakta başarısız oldum. diamondsVeriyi ggplot2paketten kullanacağım .

Her iki değişkenle de sabit efektler yapabilirim

> library(plyr)
> library(ggplot2)
> library(lmtest)
> library(sandwich)
> # with dummies to create fixed effects
> fe.lsdv <- lm(price ~ carat + factor(cut) + 0, data = diamonds)
> ct.lsdv <- coeftest(fe.lsdv, vcov. = vcovHC)
> ct.lsdv

t test of coefficients:

                      Estimate Std. Error  t value  Pr(>|t|)    
carat                 7871.082     24.892  316.207 < 2.2e-16 ***
factor(cut)Fair      -3875.470     51.190  -75.707 < 2.2e-16 ***
factor(cut)Good      -2755.138     26.570 -103.692 < 2.2e-16 ***
factor(cut)Very Good -2365.334     20.548 -115.111 < 2.2e-16 ***
factor(cut)Premium   -2436.393     21.172 -115.075 < 2.2e-16 ***
factor(cut)Ideal     -2074.546     16.092 -128.920 < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

veya hem sol hem de sağ tarafları (burada zaman içinde değişmeyen regresörler yok) ve serbestlik derecelerini düzelterek.

> # by demeaning with degrees of freedom correction
> diamonds <- ddply(diamonds, .(cut), transform, price.dm = price - mean(price), carat.dm = carat  .... [TRUNCATED] 
> fe.dm <- lm(price.dm ~ carat.dm + 0, data = diamonds)
> ct.dm <- coeftest(fe.dm, vcov. = vcovHC, df = nrow(diamonds) - 1 - 5)
> ct.dm

t test of coefficients:

         Estimate Std. Error t value  Pr(>|t|)    
carat.dm 7871.082     24.888  316.26 < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

Bu sonuçları çoğaltamıyorum plm, çünkü bir "zaman" dizinine sahip değilim (yani, bu gerçekten bir panel değil, yalnızca hata terimlerinde ortak bir önyargıya sahip olabilecek kümeler).

> plm.temp <- plm(price ~ carat, data = diamonds, index = "cut")
duplicate couples (time-id)
Error in pdim.default(index[[1]], index[[2]]) : 

Ayrıca kendi kovaryans matrisimi,cluster seçeneklerini açıklayan ( burada açıklandığı gibi ) açıklamasını kullanarak kümelenmiş standart hata ile kodlamaya çalıştım. , si küme sayısı, kalıntı olduğu için gözlem ve sabit içeren belirleyicileri, satır vektörüdür (bu da Wooldridge en denklem (7.22) olarak görünür Kesit ve panel veriuJ=ΣClusterjei*xınc, eiıth

V^cluster=(XX)1(j=1ncujuj)(XX)1
uj=Σcluster jeben*xbenncebenbenthxben). Ancak aşağıdaki kod çok büyük kovaryans matrisleri verir. Bu çok büyük değerler, sahip olduğum az sayıda kümeye veriliyor mu? Ben alamayan göz önüne alındığında plmbir faktör kümeleri yapmak, nasıl kriter benim kod emin değilim.
> # with cluster robust se
> lm.temp <- lm(price ~ carat + factor(cut) + 0, data = diamonds)
> 
> # using the model that Stata uses
> stata.clustering <- function(x, clu, res) {
+     x <- as.matrix(x)
+     clu <- as.vector(clu)
+     res <- as.vector(res)
+     fac <- unique(clu)
+     num.fac <- length(fac)
+     num.reg <- ncol(x)
+     u <- matrix(NA, nrow = num.fac, ncol = num.reg)
+     meat <- matrix(NA, nrow = num.reg, ncol = num.reg)
+     
+     # outer terms (X'X)^-1
+     outer <- solve(t(x) %*% x)
+ 
+     # inner term sum_j u_j'u_j where u_j = sum_i e_i * x_i
+     for (i in seq(num.fac)) {
+         index.loop <- clu == fac[i]
+         res.loop <- res[index.loop]
+         x.loop <- x[clu == fac[i], ]
+         u[i, ] <- as.vector(colSums(res.loop * x.loop))
+     }
+     inner <- t(u) %*% u
+ 
+     # 
+     V <- outer %*% inner %*% outer
+     return(V)
+ }
> x.temp <- data.frame(const = 1, diamonds[, "carat"])
> summary(lm.temp)

Call:
lm(formula = price ~ carat + factor(cut) + 0, data = diamonds)

Residuals:
     Min       1Q   Median       3Q      Max 
-17540.7   -791.6    -37.6    522.1  12721.4 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)    
carat                 7871.08      13.98   563.0   <2e-16 ***
factor(cut)Fair      -3875.47      40.41   -95.9   <2e-16 ***
factor(cut)Good      -2755.14      24.63  -111.9   <2e-16 ***
factor(cut)Very Good -2365.33      17.78  -133.0   <2e-16 ***
factor(cut)Premium   -2436.39      17.92  -136.0   <2e-16 ***
factor(cut)Ideal     -2074.55      14.23  -145.8   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

Residual standard error: 1511 on 53934 degrees of freedom
Multiple R-squared: 0.9272, Adjusted R-squared: 0.9272 
F-statistic: 1.145e+05 on 6 and 53934 DF,  p-value: < 2.2e-16 

> stata.clustering(x = x.temp, clu = diamonds$cut, res = lm.temp$residuals)
                        const diamonds....carat..
const                11352.64           -14227.44
diamonds....carat.. -14227.44            17830.22

Bu R'de yapılabilir mi? Ekonometride oldukça yaygın bir tekniktir ( bu derste kısa bir ders var ), ancak bunu R'de çözemiyorum. Teşekkürler!


7
@ricardh, kullanmak istedikleri terimin zaten istatistiklerde kullanılıp kullanılmadığını kontrol etmedikleri için tüm ekonomistleri lanetleyin. Bu bağlamda küme grup anlamına gelir ve küme analizi ile tamamen ilgisizdir, bu yüzden rseek size ilgisiz sonuçlar verdi. Böylece kümeleme etiketini kaldırdım. Panel veri analizi için plm paketine bakınız . Güzel bir skeç içerdiğinden istediğinizi bulabilirsiniz. Sorunuza gelince, ne istediğinizi net değil. Grup standartlarında hatalar var mı?
mpiktas

@ ricardh, bu clusterseçeneğin açıklandığı Stata kılavuzuna bağlanmanız çok faydalı olacaktır . R.
mpiktas

2
Bu yorum için +1. ekonomistler deli gibi terminolojiyi sömürgeleştiriyorlardı. Gerçi bazen kötü adam seçmek zor. Ii biraz zaman aldı, mesela ben factorbununla alakası olmadığını factanalama kategorize edilmiş değişkenleri ifade edene kadar Bununla birlikte R'deki küme küme analizini ifade eder, k-aracı sadece THE partitioning metodudur: statmethods.net/advstats/cluster.html . Sorunuzu anlamadım, ama kümenin bununla hiçbir ilgisi olmadığını da düşünüyorum.
hans0l0

@mpiktas, @ ran2 - Teşekkürler! Umarım soruyu açıklığa kavuşturdum. Kısacası, neden zaten var olan sadece sabit etkiler ise "standart hata kümelemesi" neden var?
Richard Herron,

1
"multiwayvcov" paketindeki cluster.vcov işlevi aradığınızı yapar.

Yanıtlar:


29

Beyaz standart hatalar için grup tarafından kümelenmiş plmçerçeve

coeftest(model.plm, vcov=vcovHC(model.plm,type="HC0",cluster="group"))

model.plmbir plm modeli nerede .

Ayrıca bu bağlantıya bakın

http://www.inside-r.org/packages/cran/plm/docs/vcovHC veya plm paket dokümantasyonu

DÜZENLE:

İki yönlü kümeleme için (örneğin grup ve zaman) aşağıdaki bağlantıya bakın:

http://people.su.se/~ma/clustering.pdf

Özellikle kümelenmiş standart hatalar için farklı seçenekleri açıklayan plm paketi için başka bir faydalı rehber:

http://www.princeton.edu/~otorres/Panel101R.pdf

Kümeleme ve diğer bilgiler, özellikle Stata için burada bulunabilir:

http://www.kellogg.northwestern.edu/faculty/petersen/htm/papers/se/se_programming.htm

EDIT 2:

İşte R ve stata'yı karşılaştıran örnekler: http://www.richard-bluhm.com/clustered-ses-in-r-and-stata-2/

Ayrıca, multiwayvcovyardımcı olabilir. Bu yayın faydalı bir genel bakış sağlar: http://rforpublichealth.blogspot.dk/2014/10/easy-clustered-standard-errors-in-r.html

Belgelerden:

library(multiwayvcov)
library(lmtest)
data(petersen)
m1 <- lm(y ~ x, data = petersen)

# Cluster by firm
vcov_firm <- cluster.vcov(m1, petersen$firmid)
coeftest(m1, vcov_firm)
# Cluster by year
vcov_year <- cluster.vcov(m1, petersen$year)
coeftest(m1, vcov_year)
# Cluster by year using a formula
vcov_year_formula <- cluster.vcov(m1, ~ year)
coeftest(m1, vcov_year_formula)

# Double cluster by firm and year
vcov_both <- cluster.vcov(m1, cbind(petersen$firmid, petersen$year))
coeftest(m1, vcov_both)
# Double cluster by firm and year using a formula
vcov_both_formula <- cluster.vcov(m1, ~ firmid + year)
coeftest(m1, vcov_both_formula)

benim için aynı sonuçları üretmenin coeftest(model.plm, vcov=vcovHC(model.plm,type="HC0")) yanı sıra coeftest(model.plm, vcov=vcovHC(model.plm,type="HC0",cluster="group")). Neden böyle olduğunu biliyor musun?
Peter Pan

1
People.su.se/~ma/clustering.pdf bağlantısı artık çalışmıyor. Sayfanın başlığını hatırlıyor musunuz?
MER

8

Çok okuduktan sonra, lmçerçeve içinde kümelemenin çözümünü buldum .

Mahmood Arai'nin yukarıdaki karışıklık denemelerim yerine serbestlik derecesi düzeltmeleriyle yaptığı çerçevede kümelemeyle ilgili bir eğitim veren mükemmel bir beyaz makalesi varlm . O hem bir ve iki yönlü kümeleme kovaryans matrisleri için yaptığı işlevleri sağlar burada .

Son olarak, içerik ücretsiz olarak sunulmasa da, Angrist ve Pischke'nin Çoğunlukla Zararsız Ekonometrisi kümelenme üzerine çok yardımcı oldu.


Blog postasından kod eklemek için 4/27/2015 tarihinde güncelleme yapın .

api=read.csv("api.csv") #create the variable api from the corresponding csv
attach(api) # attach of data.frame objects
api1=api[c(1:6,8:310),] # one missing entry in row nr. 7
modell.api=lm(API00 ~ GROWTH + EMER + YR_RND, data=api1) # creation of a simple linear model for API00 using the regressors Growth, Emer and Yr_rnd.

##creation of the function according to Arai:
clx <- function(fm, dfcw, cluster) {
    library(sandwich)
    library(lmtest)
    library(zoo)
    M <- length(unique(cluster))
    N <- length(cluster)
    dfc <- (M/(M-1))*((N-1)/(N-fm$rank)) # anpassung der freiheitsgrade
    u <- apply(estfun(fm),2, function(x) tapply(x, cluster, sum))
    vcovCL <-dfc * sandwich (fm, meat = crossprod(u)/N) * dfcw
    coeftest(fm, vcovCL)
}

clx(modell.api, 1, api1$DNUM) #creation of results.

1
Arai'nin makalesi artık çevrimiçi değil. Asıl bağlantıyı sağlayabilir misin?
MERose

@MERose - Üzgünüm! Ne yazık ki pdfs ekleyemiyoruz! Bu blog yazılarını, kod ile kıyaslayan buldum . Kodu eklemek için bu cevabı düzenleyeceğim.
Richard Herron

Bu, beyaz makalenin güncellenmiş bir sürümü olabilir: Mahmood Arai, R kullanarak kümelenmiş standart hatalar .
gung - Monica'yı yeniden yerleştirme

4

R içindeki kümelenmiş standart hataları hesaplamanın en kolay yolu değiştirilmiş özet işlevini kullanmaktır.

lm.object <- lm(y ~ x, data = data)
summary(lm.object, cluster=c("c"))

Lm çerçevesinde kümelenme üzerine mükemmel bir yazı var. Site aynı zamanda hem bir hem de iki yönlü kümeleme için değiştirilmiş özet fonksiyonunu sağlar. Fonksiyonu ve öğreticiyi burada bulabilirsiniz .


1

Eğer bir timeindeksiniz yoksa, ona ihtiyacınız yok: plmhayali bir tane ekleyeceksiniz ve sizden istemediğiniz sürece kullanılmayacak. Yani bu çağrı çalışması gerekir :

> x <- plm(price ~ carat, data = diamonds, index = "cut")
 Error in pdim.default(index[[1]], index[[2]]) : 
  duplicate couples (time-id) 

Olmaması dışında, bir hata yaptığını düşündürüyor plm. (Bu hata şimdi SVN'de giderildi. Sen geliştirme sürümünü yükleyebilirsiniz buradan .)

Fakat bu timeyine de kurgusal bir dizin olacağından , kendimiz yaratabiliriz:

diamonds$ftime <- 1:NROW(diamonds)  ##fake time

Şimdi bu çalışır:

x <- plm(price ~ carat, data = diamonds, index = c("cut", "ftime"))
coeftest(x, vcov.=vcovHC)
## 
## t test of coefficients:
## 
##       Estimate Std. Error t value  Pr(>|t|)    
## carat  7871.08     138.44  56.856 < 2.2e-16 ***
## ---
## Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Önemli not : vcovHC.plm()içinde plmvarsayılan tahmine göre irade Arellano grup SE tarafından kümelenmiş. Hangi farklı ne vcovHC.lm()de sandwich(örneğin tahmin eder vcovHChiçbir kümeleme ile varyans-tutarlı SEler olduğunu, orijinal söz konusu SES).


Buna ayrı bir yaklaşım, lmyapay değişken regresyonlara ve multiwayvcov paketine yapışmaktır .

library("multiwayvcov")
fe.lsdv <- lm(price ~ carat + factor(cut) + 0, data = diamonds)
coeftest(fe.lsdv, vcov.= function(y) cluster.vcov(y, ~ cut, df_correction = FALSE))
## 
## t test of coefficients:
## 
##                      Estimate Std. Error t value  Pr(>|t|)    
## carat                 7871.08     138.44  56.856 < 2.2e-16 ***
## factor(cut)Fair      -3875.47     144.83 -26.759 < 2.2e-16 ***
## factor(cut)Good      -2755.14     117.56 -23.436 < 2.2e-16 ***
## factor(cut)Very Good -2365.33     111.63 -21.188 < 2.2e-16 ***
## factor(cut)Premium   -2436.39     123.48 -19.731 < 2.2e-16 ***
## factor(cut)Ideal     -2074.55      97.30 -21.321 < 2.2e-16 ***
## ---
## Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Her iki durumda da Arellano (1987) SE'lerini grup bazında kümelemeyle alacaksınız. multiwayvcovPaket Arai orijinal kümeleme fonksiyonları doğrudan ve önemli evrimdir.

Ayrıca, her iki yaklaşımdan elde edilen varyans-kovaryans matrisine bakabilirsiniz, bunlar için aynı varyans tahminini verir carat:

vcov.plm <- vcovHC(x)
vcov.lsdv <- cluster.vcov(fe.lsdv, ~ cut, df_correction = FALSE)
vcov.plm
##          carat
## carat 19165.28
diag(vcov.lsdv)
##                carat      factor(cut)Fair      factor(cut)Good factor(cut)Very Good   factor(cut)Premium     factor(cut)Ideal 
##            19165.283            20974.522            13820.365            12462.243            15247.584             9467.263 

Lütfen bu bağlantıya bakın:
multiwayvcov
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.