Saya mencoba memahami kesalahan "clustering" standar dan bagaimana mengeksekusi di R (itu sepele di Stata). Di RI telah gagal menggunakan salah satu plm
atau menulis fungsi saya sendiri. Saya akan menggunakan diamonds
data dari ggplot2
paket.
Saya bisa melakukan efek tetap dengan salah satu variabel dummy
> 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
atau dengan mengartikan kedua sisi kiri dan kanan (tidak ada waktu yang regresi di sini) dan memperbaiki derajat kebebasan.
> # 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
Saya tidak dapat mereplikasi hasil ini dengan plm
, karena saya tidak memiliki indeks "waktu" (yaitu, ini bukan benar-benar panel, hanya cluster yang bisa memiliki bias umum dalam hal kesalahan mereka).
> plm.temp <- plm(price ~ carat, data = diamonds, index = "cut")
duplicate couples (time-id)
Error in pdim.default(index[[1]], index[[2]]) :
Saya juga mencoba untuk kode matriks kovarians saya sendiri dengan kesalahan standar berkerumun menggunakan penjelasan Stata tentang cluster
opsi mereka ( dijelaskan di sini ), yaitu untuk memecahkan mana , si jumlah cluster, adalah residual untuk observasi dan adalah vektor baris prediktor, termasuk konstanta (ini juga muncul sebagai persamaan (7.22) dalam Cross Section dan Panel Data Wooldridgeuj=Σclusterjei∗xinceiith
plm
dapat melakukan cluster pada satu faktor, saya tidak yakin bagaimana melakukan benchmark kode saya.
> # 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
Bisakah ini dilakukan di R? Ini adalah teknik yang cukup umum dalam ekonometrik (ada tutorial singkat dalam kuliah ini ), tapi saya tidak bisa mengetahuinya dalam R. Terima kasih!
sumber
cluster
opsi ini dijelaskan. Saya yakin akan mungkin untuk mereplikasi di R.factor
tidak ada hubungannya denganfactanal
tetapi mengacu pada variabel yang dikategorikan. Namun cluster dalam R mengacu pada analisis cluster, k-means hanyalah metode partisi: statmethods.net/advstats/cluster.html . Saya tidak mendapatkan pertanyaan Anda, tapi saya kira cluster tidak ada hubungannya dengan itu.Jawaban:
Untuk kesalahan standar putih dikelompokkan berdasarkan grup dengan
plm
kerangka cobadi mana
model.plm
model PLM.Lihat juga tautan ini
http://www.inside-r.org/packages/cran/plm/docs/vcovHC atau dokumentasi paket plm
EDIT:
Untuk pengelompokan dua arah (mis. Grup dan waktu) lihat tautan berikut:
http://people.su.se/~ma/clustering.pdf
Berikut ini adalah panduan bermanfaat lain untuk paket PLM yang secara khusus menjelaskan berbagai opsi untuk kesalahan standar berkerumun:
http://www.princeton.edu/~otorres/Panel101R.pdf
Pengelompokan dan informasi lainnya, terutama untuk Stata, dapat ditemukan di sini:
http://www.kellogg.northwestern.edu/faculty/petersen/htm/papers/se/se_programming.htm
EDIT 2:
Berikut adalah contoh yang membandingkan R dan stata: http://www.richard-bluhm.com/clustered-ses-in-r-and-stata-2/
Juga,
multiwayvcov
mungkin bermanfaat. Posting ini memberikan ikhtisar bermanfaat: http://rforpublichealth.blogspot.dk/2014/10/easy-clustered-standard-errors-in-r.htmlDari dokumentasi:
sumber
coeftest(model.plm, vcov=vcovHC(model.plm,type="HC0"))
jugacoeftest(model.plm, vcov=vcovHC(model.plm,type="HC0",cluster="group"))
menghasilkan hasil yang identik. Apakah Anda tahu mengapa demikian?Setelah banyak membaca, saya menemukan solusi untuk melakukan pengelompokan dalam
lm
kerangka kerja.Ada buku putih yang sangat bagus dari Mahmood Arai yang menyediakan tutorial tentang pengelompokan dalam
lm
kerangka kerja, yang dia lakukan dengan koreksi derajat kebebasan alih-alih upaya saya yang berantakan di atas. Ia menyediakan fungsinya untuk matriks kovarians pengelompokan satu dan dua arah di sini .Akhirnya, meskipun konten tidak tersedia gratis, Angrist dan Mostly Harmless Econometrics dari Pischke memiliki bagian tentang pengelompokan yang sangat membantu.
Perbarui pada 4/27/2015 untuk menambahkan kode dari posting blog .
sumber
Cara termudah untuk menghitung kesalahan standar berkerumun di R adalah dengan menggunakan fungsi ringkasan yang dimodifikasi.
Ada posting yang sangat baik tentang pengelompokan dalam kerangka lm. Situs ini juga menyediakan fungsi ringkasan yang dimodifikasi untuk pengelompokan satu dan dua arah. Anda dapat menemukan fungsi dan tutorialnya di sini .
sumber
Jika Anda tidak memiliki
time
indeks, Anda tidak perlu indeks:plm
dengan sendirinya akan menambahkan indeks fiktif, dan itu tidak akan digunakan kecuali Anda memintanya. Jadi panggilan ini harus berfungsi :Kecuali itu tidak, yang berarti Anda telah menemukan bug
plm
. (Bug ini sekarang telah diperbaiki di SVN. Anda dapat menginstal versi pengembangan dari sini .)Tetapi karena ini akan menjadi
time
indeks fiktif , kita dapat membuatnya sendiri:Sekarang ini berfungsi:
Catatan penting :
vcovHC.plm()
dalamplm
perkiraan default Arellano akan dikelompokkan menurut SE kelompok. Yang berbeda dari apa yangvcovHC.lm()
disandwich
estimasi akan (misalnyavcovHC
SE dalam pertanyaan awal), yaitu SE heteroscedasticity-konsisten tanpa clustering.Pendekatan terpisah untuk ini adalah menempel pada
lm
regresi variabel dummy dan paket multiwayvcov .Dalam kedua kasus Anda akan mendapatkan Arellano (1987) SE dengan pengelompokan berdasarkan kelompok. The
multiwayvcov
paket evolusi langsung dan signifikan dari fungsi pengelompokan asli Arai.Anda juga dapat melihat matriks varians-kovarians yang dihasilkan dari kedua pendekatan, menghasilkan estimasi varians yang sama untuk
carat
:sumber