Estoy tratando de entender el error estándar "agrupamiento" y cómo ejecutarlo en R (es trivial en Stata). En RI no he tenido éxito usando plm
o escribiendo mi propia función. Usaré los diamonds
datos del ggplot2
paquete.
Puedo hacer efectos fijos con variables ficticias
> 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
o desanimando los lados izquierdo y derecho (no hay regresores invariables en el tiempo aquí) y corrigiendo los grados de libertad.
> # 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
No puedo replicar estos resultados plm
, porque no tengo un índice de "tiempo" (es decir, esto no es realmente un panel, solo clústeres que podrían tener un sesgo común en sus términos de error).
> plm.temp <- plm(price ~ carat, data = diamonds, index = "cut")
duplicate couples (time-id)
Error in pdim.default(index[[1]], index[[2]]) :
También intenté codificar mi propia matriz de covarianza con error estándar agrupado utilizando la explicación de Stata de su cluster
opción ( explicada aquí ), que es resolver donde , si el número de grupos, es el residuo para la observación y es el vector fila de predictores, incluida la constante (esto también aparece como la ecuación (7.22) en la sección transversal de Wooldridge y los datos del panel
plm
hacer clusters en un factor, no estoy seguro de cómo comparar mi código.
> # 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
¿Se puede hacer esto en R? Es una técnica bastante común en econometría (hay un breve tutorial en esta conferencia ), pero no puedo entenderlo en R. ¡Gracias!
fuente
cluster
se explica esta opción. Estoy seguro de que sería posible replicar en R.factor
no tenía nada que verfactanal
sino que se refería a variables categorizadas. Sin embargo, el clúster en R se refiere al análisis de clúster, k-means es simplemente EL método de partición: statmethods.net/advstats/cluster.html . No entiendo tu pregunta, pero también supongo que el clúster no tiene nada que ver con eso.Respuestas:
Para los errores estándar blancos agrupados por grupo con el
plm
marco, intentedonde
model.plm
es un modelo plmVea también este enlace
http://www.inside-r.org/packages/cran/plm/docs/vcovHC o la documentación del paquete plm
EDITAR:
Para la agrupación bidireccional (por ejemplo, grupo y tiempo), consulte el siguiente enlace:
http://people.su.se/~ma/clustering.pdf
Aquí hay otra guía útil para el paquete plm específicamente que explica las diferentes opciones para los errores estándar agrupados:
http://www.princeton.edu/~otorres/Panel101R.pdf
La agrupación y otra información, especialmente para Stata, se pueden encontrar aquí:
http://www.kellogg.northwestern.edu/faculty/petersen/htm/papers/se/se_programming.htm
EDITAR 2:
Aquí hay ejemplos que comparan R y stata: http://www.richard-bluhm.com/clustered-ses-in-r-and-stata-2/
Además,
multiwayvcov
puede ser útil. Esta publicación proporciona una descripción general útil: http://rforpublichealth.blogspot.dk/2014/10/easy-clustered-standard-errors-in-r.htmlDe la documentación:
fuente
coeftest(model.plm, vcov=vcovHC(model.plm,type="HC0"))
, así como paracoeftest(model.plm, vcov=vcovHC(model.plm,type="HC0",cluster="group"))
producir resultados idénticos. ¿Sabes por qué este es el caso?Después de mucha lectura, encontré la solución para hacer clustering dentro del
lm
marco.Hay un excelente libro blanco de Mahmood Arai que proporciona un tutorial sobre la agrupación en clúster en el
lm
marco, lo que hace con correcciones de grados de libertad en lugar de mis intentos desordenados anteriores. Él proporciona sus funciones para matrices de covarianza de agrupación de una y dos vías aquí .Finalmente, aunque el contenido no está disponible de forma gratuita, la Econometría en su mayoría inofensiva de Angrist y Pischke tiene una sección sobre agrupación que fue muy útil.
Actualice el 27/04/2015 para agregar código de la publicación del blog .
fuente
La forma más fácil de calcular los errores estándar agrupados en R es utilizar la función de resumen modificada.
Hay una excelente publicación sobre clustering dentro del marco lm. El sitio también proporciona la función de resumen modificada para la agrupación en clúster de una y dos vías. Puedes encontrar la función y el tutorial aquí .
fuente
Si no tiene un
time
índice, no necesita uno:plm
agregará uno ficticio por sí mismo y no se utilizará a menos que lo solicite. Entonces esta llamada debería funcionar :Excepto que no lo hace, lo que sugiere que has encontrado un error
plm
. (Este error ahora se ha solucionado en SVN. Puede instalar la versión de desarrollo desde aquí ).Pero dado que este sería un
time
índice ficticio de todos modos, podemos crearlo nosotros mismos:Ahora esto funciona:
Nota importante :
vcovHC.plm()
enplm
forma predeterminada, Arellano estimará agrupado por grupos SE. Que es diferente de lo quevcovHC.lm()
ensandwich
estimará (por ejemplo, losvcovHC
PEs en la pregunta original), que es la SE heteroscedasticidad coherente con ninguna agrupación.Un enfoque separado para esto es apegarse a
lm
las regresiones variables ficticias y al paquete multiwayvcov .En ambos casos, obtendrá los SE de Arellano (1987) con agrupamiento por grupo. El
multiwayvcov
paquete es una evolución directa y significativa de las funciones de agrupamiento originales de Arai.También puede ver la matriz de varianza-covarianza resultante de ambos enfoques, obteniendo la misma estimación de varianza para
carat
:fuente