混合模型中demeaned多项式的边际效应:FE与RE一致性及工具适配问题
多项式建模中混合模型与固定效应(FE)估计等价性及边际效应兼容方案
核心问题
在混合模型(REWB)框架中,对时变变量做组内去均值(demeaning)后建模,与固定效应(FE)估计量等价。但在多项式场景下:
- 直接对去均值后的变量使用
poly()构建多项式,会打破与FE估计的等价性; - 先对原始变量构造多项式项(如
Days_squared = Days*Days),再分别对原始变量和多项式项做组内去均值,可恢复等价性,但此类手动构建的模型在使用marginaleffects等工具计算边际效应时,会被识别为两个独立变量,无法自动合并为原始变量的多项式边际效应(而FE模型用poly()输入时,工具会返回原始变量的单一边际效应)。
可行解决方案
方法1:使用marginaleffects::avg_slopes自动计算多项式边际效应
avg_slopes函数可识别模型中变量与原始自变量的函数关系,自动计算连续变量的边际效应(即多项式的导数:$\partial Reaction/\partial Days = \beta_1 + 2\beta_2 \times Days$)。
代码示例:
# 加载所需包 library(lme4) library(fixest) library(datawizard) library(marginaleffects) library(modelsummary) # 数据预处理 dt <- lme4::sleepstudy dt$days_squared <- dt$Days * dt$Days dt <- cbind(dt, datawizard::demean(dt, select = c("Days", "days_squared"), group = "Subject")) # 构建等价模型 re_poly_fixed <- lme4::lmer(Reaction ~ Days_within + days_squared_within + (1 | Subject), data = dt, REML = FALSE) fe_poly <- fixest::feols(Reaction ~ poly(Days, 2, raw = TRUE) | Subject, data = dt) # 计算混合模型的Days边际效应 me_re <- marginaleffects::avg_slopes( re_poly_fixed, variables = "Days" # 指定原始自变量,自动合并线性和二次项 ) # 计算FE模型的Days边际效应 me_fe <- summary(marginaleffects::marginaleffects(fe_poly)) # 对比结果 summary(me_re) me_fe
此方法得到的边际效应与FE模型完全一致,且无需修改模型结构。
方法2:指定variables参数自定义边际效应计算
通过marginaleffects的variables参数指定原始自变量的取值范围,工具会根据模型中的系数自动计算对应取值下的边际效应:
# 生成原始Days的取值序列 days_vals <- seq(min(dt$Days), max(dt$Days), by = 1) # 计算混合模型的边际效应 me_re <- marginaleffects::marginaleffects( re_poly_fixed, variables = list(Days = days_vals) ) summary(me_re)
该方法可直观查看不同Days取值下的边际效应变化,结果与FE模型等价。
原理说明
FE模型中,poly(Days, 2, raw = TRUE) | Subject本质是对Days和Days²分别做组内去均值后回归;混合模型中先构造Days_squared再分别去均值,得到的回归元与FE完全一致,因此估计量等价。而marginaleffects的avg_slopes或variables参数可识别两个去均值项对应原始自变量的多项式关系,从而计算正确的边际效应(导数形式),实现与FE模型边际效应输出的兼容。
内容的提问来源于stack exchange,提问作者edvinsyk
相关产品推荐
相关产品推荐

