使用plm之前需要声明面板数据吗?

问题描述

一个简单的问题,但是在使用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 

结果wi1wi2wi3是相同的。但是,会有一些后果,因为"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")