Estoy tratando de entender el error estándar "clustering" y cómo ejecutarlo en R (es trivial en Stata). En R no he tenido éxito utilizando plm
o escribir mi propia función. Utilizaré el 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 bien desindexando los lados izquierdo y derecho (aquí no hay regresores invariantes en el tiempo) 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 con plm
porque no tengo un índice de "tiempo" (es decir, no se trata realmente de un panel, sino de conglomerados 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 sobre su cluster
opción ( explicada aquí ), que consiste en resolver $$\hat V_{cluster} = (X'X)^{-1} \left( \sum_{j=1}^{n_c} u_j'u_j \right) (X'X)^{-1}$$ donde $u_j = \sum_{cluster~j} e_i * x_i$ , $n_c$ si el número de clusters, $e_i$ es el residuo del $i^{th}$ observación y $x_i$ es el vector de filas de los predictores, incluida la constante (esto también aparece como ecuación (7.22) en la obra de Wooldridge Datos transversales y de panel ). Pero el siguiente código da matrices de covarianza muy grandes. ¿Son estos valores muy grandes dado el pequeño número de clusters que tengo? Dado que no puedo obtener plm
para hacer clusters en un factor, no estoy seguro de cómo evaluar 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 resolverlo en R. ¡Gracias!
7 votos
@ricardh, maldice a todos los economistas por no comprobar si el término que quieren utilizar ya se usa en estadística. Cluster en este contexto significa grupo y no tiene ninguna relación con el análisis cluster, por eso rseek te dio resultados no relacionados. De ahí que haya eliminado la etiqueta clustering. Para el análisis de datos de panel, consulte paquete plm . Tiene una bonita viñeta, por lo que puede encontrar lo que quiere. En cuanto a su pregunta, no está claro lo que quiere. ¿Errores estándar dentro del grupo?
0 votos
@ricardh, ayudaría mucho si pudieras enlazar con algún manual de Stata donde este
cluster
se explica la opción. Estoy seguro de que sería posible replicar en R.3 votos
+1 por el comentario. los economistas colonizan la terminología como locos. Aunque a veces es difícil elegir el villano. Me llevó un tiempo, por ejemplo, hasta que me di cuenta
factor
no tenía nada que ver confactanal
sino que se refiere a variables categorizadas. Sin embargo, cluster en R se refiere al análisis de cluster, k-means es sólo EL método de partición: statmethods.net/advstats/cluster.html . No entiendo tu pregunta, pero también supongo que la agrupación no tiene nada que ver.0 votos
@mpiktas, @ran2 -- ¡Gracias! Espero haber aclarado la pregunta. En resumen, ¿por qué existe la "agrupación de errores estándar" si sólo son efectos fijos, que ya existían?
0 votos
@ricardh, el enlace que has dado menciona
cluster
explícitamente en el contexto de las estimaciones robustas de la matriz de covarianza. Parece que su pregunta no se refiere a las matrices de covarianza. Su primer código es una regresión de mínimos cuadrados con variables ficticias y el segundo un modelo de efectos fijos. Dan las mismas estimaciones de coeficientes, pero como usted utilizalm
para la estimación del segundo modelo, calcula los grados de libertad como si se estimara un modelo lineal simple, lo que no es el caso. Dices que has encontrado una investigación, ¿puedes enlazarla?0 votos
@mpitkas -- No se trata explícitamente de las matrices vcov, pero en economía el foco está en la estimación y el error estándar. Dado que me parece que "agrupar" los errores estándar da los mismos resultados (en términos de estimaciones y errores estándar) que los efectos fijos, ¿por qué existe la práctica de agrupar? ¿Debe haber alguna diferencia que se me escapa?
1 votos
La función cluster.vcov del paquete "multiwayvcov" hace lo que usted busca.
0 votos
Consulte este enlace: multiwayvcov se deprecia: sites.google.com/site/npgraham1/research/code
0 votos
Si busca errores estándar agrupados para efectos fijos de tres vías , por favor, vea mi respuesta relevante en Stack Overflow .