Rの標準エラークラスタリング(手動またはplmのいずれか)


33

標準エラーの「クラスタリング」とRでの実行方法を理解しようとしています(Stataでは簡単です)。RIでは、どちらplmかを使用するか、独自の関数を作成することに失敗しました。パッケージのdiamondsデータを使用しggplot2ます。

いずれかのダミー変数で固定効果を実行できます

> 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 

または、左側と右側の両方の意味を失い(ここでは時不変の回帰変数はありません)、自由度を修正します。

> # 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 

plm「時間」インデックスがないため、これらの結果をで複製することはできません(つまり、これは実際にはパネルではなく、エラー用語に共通の偏りがあるクラスターだけです)。

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

私は、また、それらののStataの説明使用してコードにクラスタ化された標準誤差で自分自身の共分散行列を試みたclusterオプション(ここで説明する解決することである)、Vは CのLをUはsは、T 、E 、R = X ' X - 1 nはC Σ J = 1 u j u j X X 1ここで、u j = c l u s

V^clあなたはster=バツバツ1j=1ncあなたはjあなたはjバツバツ1
、siはクラスター数、は観測の残差、は定数を含む予測子の行ベクトルです(これは式(7.22)としても表示されます) Wooldridgeの断面およびパネルデータを参照)。しかし、次のコードは非常に大きな共分散行列を与えます。私が持っているクラスターの数が少ない場合、これらの非常に大きな値はありますか?1つの要因でクラスターを作成できないことを考えると、コードをベンチマークする方法がわかりません。あなたはj=clあなたはster jeバツe i i t h x incethバツplm
> # 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

これはRで実行できますか?これは計量経済学ではかなり一般的な手法です(この講義では簡単なチュートリアルがあります)が、Rではわかりません。ありがとう!


7
@ricardh、使用したい用語が既に統計で使用されているかどうかをチェックしないことに対するすべてのエコノミストに対する呪い。このコンテキストでのクラスターはグループを意味し、クラスター分析とはまったく無関係です。これが、rseekが無関係な結果をもたらした理由です。したがって、クラスタリングタグを削除しました。パネルデータ分析については、パッケージplmを確認してください。それは素晴らしいビネットを持っているので、あなたが欲しいものを見つけるかもしれません。あなたの質問に関しては、あなたが何を望むのか明確ではありません。グループ内の標準エラー?
mpiktas

@ricardh、このclusterオプションが説明されているStataのマニュアルにリンクできれば、非常に役立ちます。Rで複製できると確信しています。
mpiktas11年

2
そのコメントに対して+1。エコノミストは用語を狂ったように定着させます。時々、悪役を選ぶのは難しいです。Iiは、たとえば、カテゴリ化された変数を参照するだけでfactor何の関係もないことに気付くまでしばらくかかりましたfactanal。ただし、Rのクラスターはクラスター分析を指し、k-meansは単なる分割方法です:statmethods.net/advstats/cluster.html。私はあなたの質問を受け取りませんが、クラスターはそれとは何の関係もないと思います。
hans0l0

@ mpiktas、@ ran2-ありがとう!質問を明確にしたいと思います。要するに、既に存在していた固定効果だけである場合、なぜ「標準エラークラスタリング」が存在するのでしょうか。
リチャードヘロン

1
「multiwayvcov」パッケージのcluster.vcov関数は、あなたが探していることをします。

回答:


29

plmフレームワークを使用してグループ別にクラスター化されたホワイト標準エラーの場合

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

model.plmplmモデルはどこにありますか。

こちらのリンクもご覧ください

http://www.inside-r.org/packages/cran/plm/docs/vcovHCまたはplmパッケージのドキュメント

編集:

双方向クラスタリング(グループと時間など)については、次のリンクを参照してください。

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

クラスター化された標準エラーのさまざまなオプションを具体的に説明するplmパッケージの別の役立つガイドを次に示します。

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

特にStataのクラスタリングおよびその他の情報は、次の場所にあります。

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

編集2:

Rとstataを比較する例を次に示します。http://www.richard-bluhm.com/clustered-ses-in-r-and-stata-2/

また、multiwayvcov役に立つかもしれません。この投稿は役に立つ概要を提供します:http : //rforpublichealth.blogspot.dk/2014/10/easy-clustered-standard-errors-in-r.html

ドキュメントから:

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)

私にとってcoeftest(model.plm, vcov=vcovHC(model.plm,type="HC0"))coeftest(model.plm, vcov=vcovHC(model.plm,type="HC0",cluster="group"))同じ結果が得られます。なぜそうなのか知っていますか?
ピーターパン

1
リンクpeople.su.se/~ma/clustering.pdfは機能しなくなりました。ページのタイトルを覚えていますか?
MERose

8

たくさん読んだ後、lmフレームワーク内でクラスタリングを行うためのソリューションを見つけました。

フレームワークでのクラスタリングに関するチュートリアルを提供しているMahmood Araiの優れたホワイトペーパーがありlmます。彼はここで一方向および双方向のクラスタリング共分散行列の関数を提供します

最後に、コンテンツは無料では提供されていませんが、AngristとPischkeのMostly Harmless Econometricsにはクラスタリングに関するセクションがあり、非常に役立ちました。


2015年4月27日に更新して、ブログ投稿からコードを追加します。

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
新井の論文はオンラインではありません。実際のリンクを提供できますか?
MERose

@MERose-ごめんなさい!残念ながら、PDFを添付することはできません!コードをベンチマークするこのブログ投稿を見つけました。この回答を編集して、コードを含めます。
リチャードヘロン

これは、ホワイトペーパーの更新バージョンである可能性があります。MahmoodArai、Rを使用したクラスターロバスト標準エラー
GUNG -復活モニカ

4

Rでクラスター化された標準エラーを計算する最も簡単な方法は、修正された要約関数を使用することです。

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

lmフレームワーク内のクラスタリングに関する優れた記事があります。このサイトでは、一方向および双方向の両方のクラスタリング用に変更された要約機能も提供しています。ここで関数とチュートリアルを見つけることができます。


1

timeインデックスがない場合、インデックスは必要ありません。plm架空のインデックスを単独で追加し、要求しない限り使用されません。したがって、この呼び出しは動作するはずです:

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

そうでないことを除けば、でバグに遭遇したことを示唆していますplm。(このバグはSVNで修正されました。開発バージョンはこちらからインストールできます。)

しかし、timeとにかくこれは架空のインデックスになるため、自分で作成することができます。

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

今、これは動作します:

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

重要な注意:デフォルトvcovHC.plm()plmは、グループSEによってクラスター化されたArellanoを推定します。どちらが異なるものとvcovHC.lm()sandwich(例えば推定されますvcovHCなしクラスタリングと不均一一貫性のSEである、元の質問でのSEを)。


これに対する別のアプローチは、lmダミー変数回帰とmultiwayvcovパッケージに固執しています。

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

どちらの場合も、グループごとにクラスタリングされたArellano(1987)SEを取得できます。のmultiwayvcovパッケージは、新井のオリジナルのクラスタリング機能を直接かつ大幅に進化させたものです。

また、両方のアプローチから得られた分散共分散行列を見て、次の場合と同じ分散推定値を得ることができます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 

このリンクをご覧ください:multiwayvcov
HoneyBuddha
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.