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

fixest包feols与lm多期双重差分DID回归结果差异及正确设定方法

问题解答

1. 三个模型的设定匹配情况

  • 你写的lm_mod和lm_mod2完全等价,均符合你给出的eq.1设定要求。R公式语法中,A*B会自动展开为A + B + A:B(主效应+交互项),因此lm_mod2只是把lm_mod的自动展开项手动写了一遍,二者估计结果没有任何差异,你观察到的「lm_mod2更接近feols结果」属于错觉。
  • feols_mod不符合eq.1的设定要求。fixest包的i(period, treat, ref = 5)是专门生成交乘项的语法,仅会输出period各取值与treat的交互项,不会自动生成treat、period的主效应,和eq.1要求的包含所有主效应+交互项的设定不一致,这就是系数差异的核心来源。

2. 实现两类模型结果一致的调整方法

情况1:严格对齐你写的eq.1设定(包含treat、period主效应)

调整feols代码,补充主效应即可,运行后系数、标准误和lm模型完全一致:

feols_mod_aligned <- feols(y ~ x1 + treat + period + i(period, treat, ref = 5), base_did)

情况2:对齐你当前写的feols_mod设定(仅保留交互项,无主效应)

调整lm代码,去掉treat、period的主效应,仅保留交互项即可:

lm_mod_aligned <- lm(y ~ x1 + treat:period, base_ref_5)

补充说明(针对多期DID的常规使用场景)

如果你实际要做的是动态双重差分(事件研究法),而非你写的eq.1的基础形式,常规设定需要控制个体固定效应+时间固定效应,此时treat主效应会被个体固定效应吸收、period主效应会被时间固定效应吸收,不需要单独放入模型,正确的等价写法如下:

# feols写法(高效跑高维固定效应)
feols_did <- feols(y ~ x1 + i(period, treat, ref = 5) | id + period, base_did)
# lm写法(仅适合小样本,个体多的时候速度极慢)
lm_did <- lm(y ~ x1 + factor(id) + treat:period, base_ref_5)

如果还有标准误差异,确认两类模型使用的标准误类型一致即可:比如feols如果用了个体层面聚类标准误,lm也需要对应计算聚类标准误。

内容的提问来源于stack exchange,提问作者Tomas R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 21:15:03