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

如何用R基础包与stats包复刻fixest交互效应对比行为

仅用基础包/stats包实现fixest::i()的参考水平剔除功能

你需要在不手动删除模型矩阵的前提下,用R基础包和stats包实现fixest中i()函数通过ref参数剔除交互效应参考水平的功能,以下是两种可行方案:

方案1:利用共线性自动剔除参考水平交互项

通过在模型中加入year主效应,让参考水平的交互项与主效应共线性,lm会自动剔除该列,最终结果等价于fixest的参数化逻辑:

# 假设df_het为已加载的示例数据,转换state为因子
df_het$state <- as.factor(df_het$state)

# 设置state的处理对比,指定参考水平为1
contrasts(df_het$state) <- contr.treatment(base = 1)

# 拟合模型:主效应year + 交互项state:year
fit <- lm(dep_var ~ year + state:year, data = df_het)
coef(fit)

此时模型中不会出现state1:year列,year系数对应state=1时year的斜率,其余stateX:year系数为对应state与state=1的斜率差值,与fixest的i(state, year, ref=1)逻辑一致。

方案2:通过公式动态剔除参考水平交互项

先拟合全模型,自动识别参考水平的交互项列名,再通过公式更新剔除该列:

# 假设df_het为已加载的示例数据,转换state为因子
df_het$state <- as.factor(df_het$state)
n <- length(levels(df_het$state))

# 拟合包含所有交互项的全模型
fit_full <- lm(dep_var ~ C(state, contr.treatment(n, base=1)):year, data = df_het)

# 自动定位参考水平的交互项列名
ref_col <- grep("1:year", names(coef(fit_full)), value = TRUE)

# 更新模型,剔除参考水平交互项
fit <- update(fit_full, formula = . ~ . - !!ref_col)
coef(fit)

这种方法无需手动指定列名,完全通过代码自动处理,避免了手动操作模型矩阵的麻烦。


内容的提问来源于stack exchange,提问作者A.Fischer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 09:59:55