Sử dụng R và plm để ước tính các mô hình hiệu ứng cố định bao gồm các tương tác với thời gian


16

Tôi đang sử dụng plm()để ước tính các mô hình hiệu ứng cố định của biểu mẫu

y ~ x + time + time:fixed_trait

trong đó fixed_traitmột biến số khác nhau giữa các cá nhân nhưng không đổi trong các cá nhân.

Điểm tương tác timevới fixed_traitlà cho phép hiệu ứng fixed_traitthay đổi theo thời gian. (Tôi đang làm việc ở đây từ tập sách gần đây của Paul Allison về các hiệu ứng cố định. Trích dẫn được thêm vào.)

plm()không gặp khó khăn khi ước tính hệ số và sai số chuẩn cho các mô hình đó. Nhưng summary.plm()không thể tính R ^ 2 cho các mô hình này. Đây là vấn đề mà tôi muốn khắc phục.

Đây là một ví dụ tối thiểu:

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

Đi sâu vào plm:::summary.plmlàm cho vấn đề rõ ràng hơn. Để tính R ^ 2, hãy plmthử làm điều này:

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

Điều này không hoạt động vì betachỉ bao gồm các ước tính cho year1year0:const, trong khi Xcũng bao gồm một cột cho year1:const. Nói cách khác, Xbao gồm các cột cho cả hai year0:constyear1:const, và không thể ước tính cả hai hệ số đó.

Cách giải quyết là tạo thuật ngữ tương tác "bằng tay" trước khi nhập nó vào công thức:

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

Nhưng điều này là cồng kềnh. Nói tóm lại, có điều gì tôi có thể làm để làm summary.plmviệc với những mô hình như vậy không?

===

Allison, Paul D. 2009. Các mô hình hồi quy hiệu ứng cố định. Los Angeles, CA: Hiền nhân. Xem đặc biệt trang 19-21.


1
Bắt đầu với plmphiên bản 1.6-4, đây không còn là vấn đề nữa vì các hệ số đã bị loại bỏ đơn giản.
Helix123

Câu trả lời:


9

Hãy thử sử dụng

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

thay thế. Nó thậm chí hoạt động nếu bạn dự phòng bao gồm các hiệu ứng cố định thời gian trong* tương tác (vì thời gian đang được sửa lỗi có hiệu lực):

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

Cho rằng *phải được sử dụng thay vì :, có cách nào để triệt tiêu đầu ra của các hệ số không tương tác?
Arthur
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.