You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 07:36:03