R中marginaleffects双对比时参考类别估计值一致问题排查
问题描述
我在R中使用marginaleffects包计算三重交互项的边际效应,回归代码如下:
library(fixest) library(marginaleffects) fmla <- as.formula(paste0("DV ~ ",k,"*var1:(var2 + control) + var2 + control | FE")) reg <- feols(fmla, data = test_df , vcov="cluster") plot_cme(congress_reg,variables = c("var2"), condition = list("var1",k), draw = FALSE)
变量说明:
k为多组虚拟变量,通过lapply循环运行var1是虚拟变量var2是含5个水平的因子变量,已正确指定参考水平0- 因
var1完全依赖于var2,模型未估计其基础效应
遇到的问题:
希望同时针对var1和k进行对比估计,但运行后发现:
- 当
var1=1时,var2的边际效应随k变化,符合预期 - 当
var1=0时,无论k取何值,估计值完全相同
已确认无变量缺失水平、无系数被剔除,想知道是否误解了plot_cme的斜率计算逻辑,或是能否这样指定多对比项。
调试与解决方案
经调试发现原公式未在三重交互外指定k与var2的基础交互效应,修改后的公式如下:
library(fixest) library(marginaleffects) fmla <- as.formula(paste0("DV ~ ",k,"*var1:(var2 + control) +",k,"*var2 + control | FE")) reg <- feols(fmla, data = test_df , vcov="cluster") plot_cme(congress_reg,variables = c("var2"), condition = list("var1",k), draw = FALSE)
修改后估计值出现预期变化,推测原问题是缺乏计算边际效应的基线参考水平,导致对比项固定,想确认这个直觉是否正确,以及是否仍存在其他问题。
分析解答
你的直觉完全正确,核心问题出在原回归公式的设定上:
- 原公式中,
k仅与var1:(var2 + control)存在交互,当var1=0时,var1:(var2 + control)这一项完全失效,此时模型中仅包含var2的主效应,没有k*var2的交互项——这意味着模型根本没有估计k对var2边际效应的调节作用,所以var1=0时,var2的边际效应自然不会随k变化。 - 修改后的公式添加了
k*var2交互项,为var1=0的场景提供了k调节var2边际效应的参数,因此此时var2的边际效应会随k取值不同而变化,符合预期。
额外注意事项:
- 确认
k作为虚拟变量时,其水平在数据中完整且无共线性问题,避免模型自动剔除系数影响结果 - 可通过
summary(reg)检查模型系数估计情况,确保k*var2的交互项都被正确估计 plot_cme的condition参数指定list("var1",k)是合理的,这会让函数在var1的不同水平下,分别展示k调节var2边际效应的结果,完全满足你的多对比需求
内容的提问来源于stack exchange,提问作者flâneur
相关产品推荐
相关产品推荐

