使用R中plm包执行双向固定效应估计报错,如何复现lm结果?
解决plm双向固定效应回归的"empty model"错误并复现lm结果
错误原因
你的错误核心是解释变量zp.dummy与时间固定效应完全共线性:
zp.dummy由ztime>5生成,本质是对时间索引的二分组,和时间固定效应(ztime对应的10个虚拟变量)完全线性相关- 当设置
effect="twoways"时,plm会同时纳入企业和时间固定效应,此时zp.dummy会被时间固定效应完全吸收,模型里没有剩余的非固定效应解释变量,因此触发"empty model"错误
用plm复现你的lm结果
首先明确:你用lm写的代码里,zp.dummy和zftime(时间因子)存在完全共线性,lm能运行只是因为你加了-1(去掉截距),程序自动丢弃了一个冗余变量,但这不是规范的回归设定。下面分场景给出解决方案:
场景1:控制企业固定效应,估计zp.dummy的影响
如果你的目标是控制企业个体差异,同时看时间分组虚拟变量的作用,只需要控制企业固定效应即可,避免和时间固定效应的共线问题:
# 调整index顺序为(个体,时间),符合plm常规写法 zm1p <- plm(zp.rete ~ zp.dummy, data = zp.rete, index = c("zfirm", "ztime"), model = "within", effect = "individual") summary(zm1p)
场景2:必须用双向固定效应
如果一定要同时控制企业和时间固定效应,你需要重新构造不与时间固定效应共线的核心变量。比如构造变量相对于企业自身时间均值的偏离:
# 生成去企业时间均值后的zp.dummy zp.rete$zp.dummy_dev <- zp.rete$zp.dummy - ave(zp.rete$zp.dummy, zp.rete$zfirm) # 运行双向固定效应回归 zm1p_twoway <- plm(zp.rete ~ zp.dummy_dev, data = zp.rete, index = c("zfirm", "ztime"), model = "within", effect = "twoways") summary(zm1p_twoway)
完全复现你的lm输出(不规范但满足需求)
如果你非要得到和当前lm完全一致的结果(即使存在共线性问题),可以用plm的pooling模型手动纳入固定效应虚拟变量:
# 将企业、时间转为因子 zp.rete$zffirm <- as.factor(zp.rete$zfirm) zp.rete$zftime <- as.factor(zp.rete$ztime) # 用pooling模型,手动加入固定效应并去掉截距 zm1p_reproduce <- plm(zp.rete ~ -1 + zp.dummy + zffirm + zftime, data = zp.rete, model = "pooling") summary(zm1p_reproduce)
注:这种设定存在共线性,仅用于复现结果,不推荐实际研究使用。
内容的提问来源于stack exchange,提问作者Richard Hardy
相关产品推荐
相关产品推荐

