如何用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
相关产品推荐
相关产品推荐

