Usando R y plm para estimar modelos de efectos fijos que incluyen interacciones con el tiempo

16

Estoy usando plm()para estimar modelos de efectos fijos de la forma

y ~ x + time + time:fixed_trait

donde fixed_traites una variable que varía entre individuos pero es constante dentro de los individuos.

El punto de interactuar timecon fixed_traites permitir que el efecto fixed_traitvaríe a lo largo del tiempo. (Estoy trabajando aquí desde el reciente folleto de Paul Allison sobre efectos fijos. Cita adjunta).

plm()no tiene problemas para estimar coeficientes y errores estándar para tales modelos. Pero summary.plm()no puedo calcular R ^ 2 para estos modelos. Este es el problema que me gustaría solucionar.

Aquí hay un ejemplo mínimo:

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

Profundizar en plm:::summary.plmaclara el problema. Para calcular R ^ 2, plmintenta hacer esto:

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

Esto no funciona porque betasolo incluye estimaciones para year1y year0:const, mientras que Xtambién incluye una columna para year1:const. En otras palabras, Xincluye columnas para ambos year0:consty year1:const, y es imposible estimar ambos coeficientes.

Una solución alternativa es crear el término de interacción "a mano" antes de ingresarlo en la fórmula:

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

Pero esto es engorroso. A falta de esto, ¿hay algo que pueda hacer para summary.plmtrabajar con estos modelos?

===

Allison, Paul D. 2009. Modelos de regresión de efectos fijos. Los Ángeles, CA: Sage. Ver especialmente las páginas 19-21.

usuario697473
fuente
1
A partir de la plmversión 1.6-4, esto ya no es un problema ya que los coeficientes aumentados simplemente se eliminan.
Helix123

Respuestas:

9

Intenta usar

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

en lugar. Incluso funciona si incluye efectos fijos de tiempo de forma redundante en la *interacción (porque el tiempo se está solucionando):

fe4 <- plm(y ~ year * const, index = c('ID', 'year'), data = tmp, effect = "twoway")
Charlie
fuente
Dado que *debe usarse en lugar de :, ¿hay alguna forma de suprimir la salida de coeficientes de no interacción?
Arthur