Użycie R i plm do oszacowania modeli efektów stałych, które obejmują interakcje z czasem

16

Używam plm()do oszacowania modeli formy z efektami stałymi

y ~ x + time + time:fixed_trait

gdzie fixed_traitjest zmienną, która różni się u poszczególnych osób, ale jest stała w obrębie poszczególnych osób.

Punkt interakcji timeze fixed_traitjest umożliwienie efekt fixed_traitzmieniać w czasie. (Pracuję tutaj z ostatniej broszury Paula Allisona na temat ustalonych efektów. Cytowanie dołączone).

plm()nie ma problemów z oszacowaniem współczynników i standardowych błędów dla takich modeli. Ale summary.plm()nie można obliczyć R ^ 2 dla tych modeli. To jest problem, który chciałbym naprawić.

Oto minimalny przykład:

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

Zagłębianie się plm:::summary.plmsprawia, że ​​problem jest jaśniejszy. Aby obliczyć R ^ 2, plmpróbuje to zrobić:

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

To nie działa, ponieważ betazawiera tylko szacunki dla year1i year0:const, a Xjednocześnie zawiera kolumnę dla year1:const. Innymi słowy, Xzawiera kolumny dla obu year0:consti year1:const, i niemożliwe jest oszacowanie obu tych współczynników.

Obejściem tego problemu jest utworzenie terminu interakcji „ręcznie” przed wprowadzeniem go do formuły:

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

Ale to jest kłopotliwe. Krótko mówiąc, czy jest coś, co mogę zrobić, aby summary.plmpracować z takimi modelami?

===

Allison, Paul D. 2009. Modele regresji z efektami stałymi. Los Angeles, Kalifornia: Sage. Zobacz zwłaszcza strony 19–21.

użytkownik697473
źródło
1
Począwszy od plmwersji 1.6-4, nie jest to już problemem, ponieważ alised współczynniki są po prostu pomijane.
Helix123

Odpowiedzi:

9

Spróbuj użyć

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

zamiast. Działa nawet, jeśli nadmiarowo włączasz efekty *interakcji w czasie (ponieważ czas jest usuwany w celu wyeliminowania efektu):

fe4 <- plm(y ~ year * const, index = c('ID', 'year'), data = tmp, effect = "twoway")
Charlie
źródło
Biorąc pod uwagę, że *należy to zastosować zamiast :, czy istnieje sposób na stłumienie wyników współczynników braku interakcji?
Arthur