การใช้ R และ plm เพื่อประเมินแบบจำลองเอฟเฟกต์คงที่ที่มีการโต้ตอบกับเวลา


16

ฉันใช้plm()เพื่อประเมินแบบจำลองเอฟเฟกต์คงที่ของแบบฟอร์ม

y ~ x + time + time:fixed_trait

ที่ไหน fixed_traitเป็นตัวแปรที่แปรผันไปตามบุคคล แต่คงที่ภายในบุคคล

จุดของการโต้ตอบtimeกับfixed_traitคือการอนุญาตให้มีผลของfixed_traitการเปลี่ยนแปลงในช่วงเวลา (ฉันกำลังทำงานที่นี่จากหนังสือเล่มล่าสุดของ Paul Allison เกี่ยวกับเอฟเฟกต์คงที่การอ้างอิงต่อท้าย)

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ทำงานกับรุ่นดังกล่าวหรือไม่

===

แอลลิสันพอลดี 2552 รูปแบบการถดถอยผลกระทบคงที่ Los Angeles, CA: Sage ดูหน้า 19-21 โดยเฉพาะ


1
เริ่มต้นด้วยplmรุ่น 1.6-4 นี่ไม่ใช่ปัญหาอีกต่อไปเนื่องจากสัมประสิทธิ์ alised ลดลงอย่างง่ายดาย
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")

ระบุว่า*จะต้องใช้แทน:มีวิธีที่จะปราบปรามการส่งออกของค่าสัมประสิทธิ์ที่ไม่ได้มีปฏิสัมพันธ์?
อาร์เธอร์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.