2012-05-21 22 views
6

mein Problem ist das: Ich bekomme NA, wo ich einige Werte bei der Berechnung von robusten Standardfehler erhalten sollte.Panel Daten Regression: Robuste Standardfehler

Ich versuche eine Fixed-Panel-Regression mit Cluster-robusten Standardfehlern zu machen. Dazu folge ich Arai (2011) wer auf p. 3 folgt Stock/ Watson (2006) (später veröffentlicht in Econometrica, für diejenigen, die Zugang haben). Ich möchte die Freiheitsgrade durch (M/(M-1)*(N-1)/(N-K) gegen Abwärts-Bias korrigieren, da meine Anzahl von Clustern endlich ist und ich unausgewogene Daten habe.

Ähnliche Probleme wurden vor [1, 2] auf StackOverflow und verwandten Problemen [3] auf CrossValidated geschrieben.

Arai (und die Antwort in dem ersten Link) verwendet den folgenden Code für Funktionen (ich meine Daten unten mit einigem weiteren Kommentar zur Verfügung stellen):

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) } 

, wo die gcenter Abweichungen vom Mittelwert berechnet (fester Effekt). Ich fahre dann fort und mache die Regression mit DS_CODE meine Cluster-Variable (ich habe meine Daten 'Daten' genannt).

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

und wollen

clx(datalm, dfcw, data$DS_CODE) 

jedoch berechnen, als ich uj (siehe Formel clx oben) für die Varianz berechnen will, muss ich einige Werte für meine Regressoren erst am Anfang bekommen, dann viele Nullen. Wenn dieser Eingang uj für die Varianz verwendet wird, wird nur NAs angezeigt.

Meine Daten

Da meine Daten von spezieller Struktur sein können, und ich kann das Problem nicht herausfinden, poste ich die ganze Sache als link von Hotmail. Der Grund ist, dass mit anderen Daten (aus Arai (2011)) mein Problem nicht auftritt. Sorry im Voraus für das Chaos, aber ich wäre sehr dankbar, wenn Sie es trotzdem sehen könnten. Die Datei ist eine 5 MB-TXT-Datei, die reine Daten enthält.

+0

Arais Papier nicht mehr unter dem Link vorhanden sein. Können Sie den tatsächlichen Link angeben? – MERose

Antwort

2

Nach einiger Zeit um zu spielen, funktioniert es für mich und gibt mir:

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

Dies lässt uns mit der Frage, warum es nicht für Sie tut. Ich denke, es hat etwas mit dem Format Ihrer Daten zu tun. Ist alles numerisch? Ich konvertiert die Spalte Klassen und es sieht so aus, dass für mich:

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

Was ist für Sie str(data) Rückkehr tut?

+0

Vielen Dank für Ihre Mühe und Ihre Antwort! Meine 'str (Daten)' gibt * Factor * für 'DS_CODE' und * int * für' DNEW' zurück. Alle anderen Ergebnisse sind gleich ... ABER: Das ist das Seltsamste: Es funktioniert jetzt, wenn ich den * reduzierten * Datensatz verwende (ich habe dir nur den kleinen Datensatz ohne meine anderen Variabilen und die R Zeilennummern gegeben). Mit dem großen Satz bekomme ich 1 einzelne Zeile 'NAs' in der Berechnung von * uj *. Wenn ich meinen gesamten Datensatz OHNE Zeilennummern ('row.names = FALSE') exportiere, ihn erneut importiere und die Regression mache, funktioniert es mit dem großen Datensatz. Ich weiß nicht warum ... – Jan

+0

Froh, dass es jetzt funktioniert. –

0

Das plm Paket kann Clustered SEs für Panel-Regressionen schätzen. Die Originaldaten sind nicht mehr verfügbar. Hier ein Beispiel mit Dummy-Daten.kann helfen,

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 

Wenn Sie lm Modelle verwenden (anstelle von plm), dann die multiwayvcov Paket.

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 

Weitere Informationen finden Sie unter:

Siehe: