2012-05-21 41 views
6

mi problema es este: Obtuve NA donde debería obtener algunos valores en el cálculo de errores estándar robustos.Regresión de datos del panel: Errores estándar robustos

Estoy tratando de hacer una regresión del panel de efectos fijo con errores estándar robustos. Para esto, sigo Arai (2011) que en la p. 3 sigue a Stock/ Watson (2006) (más tarde publicado en Econometrica, para aquellos que tienen acceso). Me gustaría corregir los grados de libertad por (M/(M-1)*(N-1)/(N-K) contra el sesgo a la baja ya que mi número de conglomerados es finito y tengo datos desequilibrados.

Problemas similares han sido publicados antes [1, 2] en StackOverflow y problemas relacionados [3] en CrossValidated.

Arai (y la respuesta en la primera link) utiliza el siguiente código para funciones (proporciono mis datos a continuación con un poco más comentarios):

gcenter <- function(df1,group) { 
    variables <- paste(
     rep("C", ncol(df1)), colnames(df1), sep=".") 
    copydf <- df1 
    for (i in 1:ncol(df1)) { 
     copydf[,i] <- df1[,i] - ave(df1[,i], group,FUN=mean)} 
    colnames(copydf) <- variables 
    return(cbind(df1,copydf))} 

# 1-way adjusting for clusters 
clx <- function(fm, dfcw, cluster){ 
    # R-codes (www.r-project.org) for computing 
    # clustered-standard errors. Mahmood Arai, Jan 26, 2008. 
    # The arguments of the function are: 
    # fitted model, cluster1 and cluster2 
    # You need to install libraries `sandwich' and `lmtest' 
    # reweighting the var-cov matrix for the within model 
    library(sandwich);library(lmtest) 
    M <- length(unique(cluster)) 
    N <- length(cluster)   
    K <- fm$rank       
    dfc <- (M/(M-1))*((N-1)/(N-K)) 
    uj <- apply(estfun(fm),2, function(x) tapply(x, cluster, sum)); 
    vcovCL <- dfc*sandwich(fm, meat=crossprod(uj)/N)*dfcw 
    coeftest(fm, vcovCL) } 

, donde el gcenter calcula las desviaciones de la media (efecto fijo). Luego continúo y realizo la regresión con DS_CODE siendo mi variable de clúster (he nombrado mis datos 'datos').

centerdata <- gcenter(data, data$DS_CODE) 
datalm <- lm(C.L1.retE1M ~ C.MCAP_SEC + C.Impact_change + C.Mom + C.BM + C.PD + C.CashGen + C.NITA + C.PE + C.PEdummy + factor(DS_CODE), data=centerdata) 
M <- length(unique(data$DS_CODE)) 
dfcw <- datalm$df/(datalm$df - (M-1)) 

y desea calcular

clx(datalm, dfcw, data$DS_CODE) 

Sin embargo, cuando quiero calcular uj (véase la fórmula clx arriba) para la varianza, consigo solamente al principio algunos valores para mis regresores, luego muchos ceros. Si se usa esta entrada uj para la varianza, solo NAs resultado.

Mis datos

Desde mis datos pueden ser de estructura especial y no puedo averiguar el problema, puedo publicar toda la cosa como un link desde Hotmail. La razón es que con otros datos (tomados de Arai (2011)) mi problema no ocurre. Lo siento de antemano por el desastre, pero estaría muy agradecido si pudiera echarle un vistazo, sin embargo. El archivo es un archivo .txt de 5mb que contiene solo datos.

+0

de Arai ya no existe en su enlace. ¿Puedes proporcionar el enlace real? – MERose

Respuesta

2

Después de algún tiempo jugando, funciona para mí y me da:

      Estimate Std. Error t value Pr(>|t|)  
(Intercept)   4.5099e-16 5.2381e-16 0.8610 0.389254  
C.MCAP_SEC   -5.9769e-07 1.2677e-07 -4.7149 2.425e-06 *** 
C.Impact_change  -5.3908e-04 7.5601e-05 -7.1306 1.014e-12 *** 
C.Mom     3.7560e-04 3.3378e-03 0.1125 0.910406  
C.BM     -1.6438e-04 1.7368e-05 -9.4645 < 2.2e-16 *** 
C.PD     6.2153e-02 3.8766e-02 1.6033 0.108885  
C.CashGen    -2.7876e-04 1.4031e-02 -0.0199 0.984149  
C.NITA    -8.1792e-02 3.2153e-02 -2.5438 0.010969 * 
C.PE     -6.6170e-06 4.0138e-06 -1.6485 0.099248 . 
C.PEdummy    1.3143e-02 4.8864e-03 2.6897 0.007154 ** 
factor(DS_CODE)130324 -5.2497e-16 5.2683e-16 -0.9965 0.319028  
factor(DS_CODE)130409 -4.0276e-16 5.2384e-16 -0.7689 0.441986  
factor(DS_CODE)130775 -4.4113e-16 5.2424e-16 -0.8415 0.400089 
... 

Esto nos deja con la pregunta de por qué no lo hace para usted. Supongo que tiene algo que ver con el formato de tus datos. ¿Es todo numérico? Convertí las clases de columna y parece que para mí:

str(dat) 
'data.frame': 48251 obs. of 12 variables: 
$ DS_CODE  : chr "902172" "902172" "902172" "902172" ... 
$ DNEW   : num 2e+05 2e+05 2e+05 2e+05 2e+05 ... 
$ MCAP_SEC  : num 78122 71421 81907 80010 82462 ... 
$ NITA   : num 0.135 0.135 0.135 0.135 0.135 ... 
$ CashGen  : num 0.198 0.198 0.198 0.198 0.198 ... 
$ BM   : num 0.1074 0.1108 0.097 0.0968 0.0899 ... 
$ PE   : num 57 55.3 63.1 63.2 68 ... 
$ PEdummy  : num 0 0 0 0 0 0 0 0 0 0 ... 
$ L1.retE1M : num -0.72492 0.13177 0.00122 0.07214 -0.07332 ... 
$ Mom   : num 0 0 0 0 0 ... 
$ PD   : num 5.41e-54 1.51e-66 3.16e-80 2.87e-79 4.39e-89 ... 
$ Impact_change: num 0 -10.59 -10.43 0.7 -6.97 ... 

Lo que hace str(data) retorno para usted?

+0

¡Muchas gracias por su esfuerzo y su respuesta! My 'str (data)' devuelve * Factor * para 'DS_CODE' y * int * para' DNEW'. Todos los demás resultados son los mismos ... PERO: Esto es lo más extraño: funciona ahora si utilizo el conjunto de datos * reducido * (le di solo el pequeño conjunto de datos sin mis otros varialbios y los números de la fila R). Con el conjunto grande, obtengo 1 fila única de 'NA' en el cálculo de * uj *. Si exporto mi conjunto de datos completo SIN números de fila ('row.names = FALSE'), lo importo nuevamente y hago la regresión, funciona con el conjunto de datos grandes. No sé por qué ... – Jan

+0

Me alegro de que funcione ahora. –

0

El paquete plm puede estimar SE agrupados para regresiones de panel. Los datos originales ya no están disponibles, así que aquí hay un ejemplo con datos ficticios.

require(foreign) 
require(plm) 
require(lmtest) 
test <- read.dta("http://www.kellogg.northwestern.edu/faculty/petersen/htm/papers/se/test_data.dta") 

fpm <- plm(y ~ x, test, model='pooling', index=c('firmid', 'year')) 

##Arellano clustered by *group* SEs 
> coeftest(fpm, vcov=function(x) vcovHC(x, cluster="group", type="HC0")) 

t test of coefficients: 

      Estimate Std. Error t value Pr(>|t|)  
(Intercept) 0.029680 0.066939 0.4434 0.6575  
x   1.034833 0.050540 20.4755 <2e-16 *** 
--- 
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Si está utilizando lm modelos (en lugar de plm), entonces el paquete multiwayvcov puede ayudar.

library("lmtest") 
library("multiwayvcov") 

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

> coeftest(m1, vcov=function(x) cluster.vcov(x, petersen[ , c("firmid")], 
    df_correction=FALSE)) 

t test of coefficients: 

      Estimate Std. Error t value Pr(>|t|)  
(Intercept) 0.029680 0.066939 0.4434 0.6575  
x   1.034833 0.050540 20.4755 <2e-16 *** 
--- 
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Para más detalles ver:

así como el Libro

Cuestiones relacionadas