Regressão de dados em painel:Erros padrão robustos
-
12-12-2019 - |
Pergunta
meu problema é este:eu recebo NA
onde devo obter alguns valores no cálculo de erros padrão robustos.
Estou tentando fazer uma regressão de painel de efeito fixo com erros padrão robustos de cluster.Para isso, sigo Arai (2011) quem na pág.3 segue Estoque / Watson (2006) (publicado posteriormente em Econométrica, para quem tem acesso).Eu gostaria de corrigir os graus de liberdade (M/(M-1)*(N-1)/(N-K)
contra o viés descendente, pois meu número de clusters é finito e tenho dados desequilibrados.
Problemas semelhantes foram postados antes de [1, 2] no StackOverflow e problemas relacionados [3] em CrossValidated.
Arai (e a resposta no primeiro link) usa o seguinte código para funções (Forneço meus dados abaixo com mais alguns comentários):
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) }
,onde o gcenter
calcula desvios da média (efeito fixo).Eu então continuo e faço a regressão com DS_CODE
sendo minha variável de cluster (chamei meus dados de 'dados').
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))
e quero calcular
clx(datalm, dfcw, data$DS_CODE)
No entanto, quando eu quero calcular uj (ver fórmula clx
acima) para a variância, obtenho apenas no início alguns valores para meus regressores e depois muitos zeros.Se esta entrada uj é usado para a variação, apenas NAs
resultado.
Meus dados
Como meus dados podem ter uma estrutura especial e não consigo descobrir o problema, posto tudo como um link do Hotmail.A razão é que com outros dados (retirados de Arai (2011)) meu problema não ocorre.Desculpe antecipadamente pela bagunça, mas ficaria muito grato se você pudesse dar uma olhada nisso.O arquivo é um arquivo .txt de 5 MB contendo apenas dados.
Solução
Depois de algum tempo brincando, funciona para mim e me dá:
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
...
Isso nos deixa com a questão de por que isso não acontece com você.Acho que tem algo a ver com o formato dos seus dados.Tudo é numérico?Converti as classes da coluna e ficou assim para mim:
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 ...
O que str(data)
retornar para você?
Outras dicas
O plm
O pacote pode estimar SEs agrupados para regressões de painel.Os dados originais não estão mais disponíveis, então aqui está um exemplo usando dados fictícios.
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
Se você estiver usando lm
modelos (em vez de plm
), então o multiwayvcov
pacote pode ajudar.
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 mais detalhes consulte:
Veja também: