问题描述
一个简单的问题,但是在使用plm估计有限元回归之前–我是否需要使用plm.data将df“设置”为面板数据(类似于Stata中的xtset)?
pdata <- plm.data(df,index = "state","year")
我认为在回归中包括“索引”会照顾到FE?例如
Model1 <- plm(DV ~ IV + IV2,data = df,index = c("state","year"),model="within")
stargazer(Model1,type = 'text',align = TRUE,title = "Regression Results")
该消息人士称:“当前版本的plm能够使用常规data.frame,而无需进行任何进一步的转换,前提是个人和时间索引位于前两列中,就像所有示例数据集中一样,但是工资。如果不是这种情况,则必须将索引可选参数传递给估计和测试函数。” https://cran.r-project.org/web/packages/plm/vignettes/plmPackage.html
解决方法
您可以在plm
调用本身之前使用pdata.frame()
(plm.data()
过时)或更简单(与Stata不同)中的plm()
命令执行此操作。 示例:
library(plm)
data("Grunfeld",package="plm")
class(Grunfeld)
# [1] "data.frame"
head(Grunfeld,3)
# firm year inv value capital
# 1 1 1935 317.6 3078.5 2.8
# 2 1 1936 391.8 4661.7 52.6
# 3 1 1937 410.6 5387.1 156.9
plm
对于前两列期望组和时间数据。因此,当您将上述Grunfeld
示例数据用于FE回归而未指定索引时,它将起作用。
wi1 <- plm(inv ~ value + capital,data=Grunfeld,model="within",effect="twoways")
wi1$coe
# value capital
# 0.1177159 0.3579163
但是,当您混淆列时,将发生错误。
## confuse columns
Grunfeld2 <- Grunfeld[c(3:5,2,1)]
head(Grunfeld2,3)
# inv value capital year firm
# 1 317.6 3078.5 2.8 1935 1
# 2 391.8 4661.7 52.6 1936 1
# 3 410.6 5387.1 156.9 1937 1
plm(inv ~ value + capital,data=Grunfeld2,effect="twoways")
# Error in plm.fit [...]
我们需要在index=c(<group>,<time>)
调用中指定plm
,
wi2 <- plm(inv ~ value + capital,index=c("firm","year"),effect="twoways")
wi2$coe
# value capital
# 0.1177159 0.3579163
或通过生成"pdata.frame"
。
Grunfeld3 <- pdata.frame(Grunfeld2,"year"))
class(Grunfeld3)
# [1] "pdata.frame" "data.frame"
列的顺序不会改变,index
会存储在属性中。您可能需要比较attributes(Grunfeld2)
和attributes(Grunfeld3)
。
wi3 <- plm(inv ~ value + capital,data=Grunfeld3,effect="twoways")
wi3$coe
# value capital
# 0.1177159 0.3579163
结果wi1
,wi2
和wi3
是相同的。但是,会有一些后果,因为"pdata.frame"
的行名对应于组时间:
head(Grunfeld3,3)
# inv value capital year firm
# 1-1935 317.6 3078.5 2.8 1935 1
# 1-1936 391.8 4661.7 52.6 1936 1
# 1-1937 410.6 5387.1 156.9 1937 1
因此,all.equal
抛出字符串不匹配,
all.equal(wi2,wi3)
# [1] "Component “residuals”: Names: 200 string mismatches"
# [2] "Component “model”: Attributes: < Component “row.names”: 200 string mismatches >"
# [3] "Component “call”: target,current do not match when deparsed"
这些值是相同的,但是:
head(wi2$residuals)
# 1 2 3 4 5 6
# 41.10980 -69.68476 -152.11391 -19.73566 -93.36168 -28.48560
head(wi3$residuals)
# 1-1935 1-1936 1-1937 1-1938 1-1939 1-1940
# 41.10980 -69.68476 -152.11391 -19.73566 -93.36168 -28.48560
head(wi2$model,3)
# inv value capital
# 1 317.6 3078.5 2.8
# 2 391.8 4661.7 52.6
# 3 410.6 5387.1 156.9
head(wi3$model,3)
# inv value capital
# 1-1935 317.6 3078.5 2.8
# 1-1936 391.8 4661.7 52.6
# 1-1937 410.6 5387.1 156.9
wi2$call
# plm(formula = inv ~ value + capital,data = Grunfeld2,effect = "twoways",# model = "within",index = c("firm","year"))
wi3$call
# plm(formula = inv ~ value + capital,data = Grunfeld3,# model = "within")