Utilizzo di R e plm per stimare modelli a effetti fissi che includono interazioni con il tempo


16

Sto usando plm()per stimare i modelli a effetti fissi del modulo

y ~ x + time + time:fixed_trait

dove fixed_traitè una variabile che varia tra gli individui ma è costante all'interno degli individui.

Il punto di interagire timecon fixed_traitè quello di consentire l'effetto di fixed_traitvariare nel tempo. (Sto lavorando qui dal recente opuscolo di Paul Allison sugli effetti fissi. Citazione allegata.)

plm()non ha problemi a stimare i coefficienti e gli errori standard per tali modelli. Ma summary.plm()non è possibile calcolare R ^ 2 per questi modelli. Questo è il problema che vorrei risolvere.

Ecco un esempio minimo:

library(plm)
tmp <- data.frame(ID=rep(1:3, 2), year=rep(0:1, each=3), 
                  y=rnorm(6), const=rep(1:3, 2))
fe1 <- plm(y ~ year,              index=c('ID', 'year'), data=tmp)
fe2 <- plm(y ~ year + year:const, index=c('ID', 'year'), data=tmp)
summary(fe1)  # works fine
summary(fe2)  # Error in crossprod(t(X), beta) : non-conformable arguments

L'analisi approfondita plm:::summary.plmchiarisce il problema. Per calcolare R ^ 2, plmprova a fare questo:

beta <- coef(fe2)
X <- model.matrix(fe2)
crossprod(t(X), beta)

Questo non funziona perché betainclude solo le stime per year1e year0:const, mentre Xinclude anche una colonna per year1:const. In altre parole, Xinclude colonne per entrambi year0:conste year1:const, ed è impossibile stimare entrambi questi coefficienti.

Una soluzione alternativa consiste nel creare il termine di interazione "a mano" prima di inserirlo nella formula:

tmp$yearXconst <- tmp$year*tmp$const
fe3 <- plm(y ~ year + yearXconst, index=c('ID', 'year'), data=tmp)
summary(fe3)  # works fine

Ma questo è ingombrante. A parte questo, c'è qualcosa che posso fare per summary.plmlavorare con questi modelli?

===

Allison, Paul D. 2009. Modelli di regressione ad effetti fissi. Los Angeles, California: Sage. Vedi in particolare le pagine 19-21.


1
A partire dalla plmversione 1.6-4, questo non è più un problema poiché i coefficienti modificati vengono semplicemente eliminati.
Helix123,

Risposte:


9

Prova a usare

fe3 <- plm(y ~ year * const, index = c('ID', 'year'), data = tmp)

anziché. Funziona anche se includi in modo ridondante effetti di *interazione a tempo nell'interazione (perché il tempo è stato risolto con effetto):

fe4 <- plm(y ~ year * const, index = c('ID', 'year'), data = tmp, effect = "twoway")

Dato che *deve essere usato invece di :, c'è un modo per sopprimere l'output di coefficienti di non interazione?
Arthur,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.