Використання R і plm для оцінки моделей з фіксованими ефектами, які включають взаємодію з часом


16

Я використовую plm()для оцінки моделей з фіксованими ефектами

y ~ x + time + time:fixed_trait

де fixed_traitє змінною, яка змінюється в окремих індивідах, але є постійною в межах індивідів.

Сенс взаємодії timeз ним fixed_traitполягає в тому, щоб дозволити ефекту fixed_traitзмінюватися в часі. (Я працюю тут з недавнього буклета Пола Елісона про фіксовані ефекти. Додаток цитування.)

plm()не має проблем з оцінкою коефіцієнтів і стандартних помилок для таких моделей. Але summary.plm()не можна обчислити R ^ 2 для цих моделей. Це проблема, яку я хотів би вирішити.

Ось мінімальний приклад:

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

Розібравшись, plm:::summary.plmпроблема стає зрозумілішою. Щоб обчислити R ^ 2, plmнамагається це зробити:

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

Це не працює, оскільки betaвключає лише оцінки для year1та year0:const, а Xтакож включає стовпець для year1:const. Іншими словами, Xвключає стовпці для обох year0:constі year1:const, і неможливо оцінити обидва ці коефіцієнти.

Приблизним завданням є створення терміна взаємодії "від руки" перед введенням його у формулу:

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

Але це громіздко. Окрім цього, чи є щось, що я можу зробити, щоб зробити summary.plmроботу з такими моделями?

===

Allison, Paul D. 2009. Регресійні моделі з фіксованими ефектами. Лос-Анджелес, Каліфорнія: Мудрець. Див. Особливості сторінок 19-21.


1
Починаючи з plmверсії 1.6-4, це вже не є проблемою, оскільки зменшені коефіцієнти просто знижуються.
Helix123

Відповіді:


9

Спробуйте використовувати

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

замість цього. Це навіть працює, якщо ви надто часто включаєте у *взаємодію фіксовані часом ефекти (оскільки час фіксується ефектом):

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

З огляду на те *, що треба використовувати замість :, чи існує спосіб придушити вихід коефіцієнтів невзаємодії?
Артур
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.