如何用update()更新含竖线的fixest公式对象?移除变量保留固定效应
处理fixest风格公式的拆分更新问题
对于fixest这类用竖线|分隔解释变量与固定效应的公式,base R的update()函数无法正确识别这种特殊结构,直接调用会导致修改失效。以下是不需要拟合模型的解决方案:
方法一:手动拆分并重组公式
利用rlang包操作公式的语法树,精准拆分变量部分与固定效应部分,修改后重新组合:
library(rlang) # 原公式 f <- log(y) ~ log(x) + z | fe # 提取公式各组成部分 lhs <- f_lhs(f) # 提取左边响应变量 rhs <- f_rhs(f) # 提取右边整体 rhs_parts <- call_args(rhs) # 拆分|分隔的两部分 vars_part <- rhs_parts[[1]] # 解释变量部分:log(x) + z fe_part <- rhs_parts[[2]] # 固定效应部分:fe # 修改解释变量部分,移除z new_vars_part <- vars_part - sym("z") # 重新组合成新公式 new_f <- new_formula(lhs, call2("|", new_vars_part, fe_part)) new_f #> log(y) ~ log(x) | fe
方法二:封装成通用更新函数
如果需要频繁修改这类公式,可以封装一个工具函数,实现类似update()的灵活操作,支持分别修改变量部分和固定效应部分:
library(rlang) update_fixest_formula <- function(formula, vars_update = NULL, fe_update = NULL) { lhs <- f_lhs(formula) rhs <- f_rhs(formula) # 拆分右边的变量与固定效应部分 if (call_name(rhs) == "|") { rhs_parts <- call_args(rhs) vars_part <- rhs_parts[[1]] fe_part <- rhs_parts[[2]] } else { vars_part <- rhs fe_part <- NULL } # 更新解释变量部分 if (!is.null(vars_update)) { vars_part <- eval_tidy(expr(!!vars_part !!vars_update)) } # 更新固定效应部分 if (!is.null(fe_update)) { fe_part <- if (is.null(fe_part)) { eval_tidy(fe_update) } else { eval_tidy(expr(!!fe_part !!fe_update)) } } # 重新组合公式 new_rhs <- if (!is.null(fe_part)) { call2("|", vars_part, fe_part) } else { vars_part } new_formula(lhs, new_rhs) } # 使用示例1:移除原公式中的z变量 f <- log(y) ~ log(x) + z | fe update_fixest_formula(f, vars_update = expr(- z)) #> log(y) ~ log(x) | fe # 使用示例2:添加新变量w,同时更换固定效应为fe2 f2 <- log(y) ~ log(x) | fe update_fixest_formula(f2, vars_update = expr(+ w), fe_update = expr(fe2)) #> log(y) ~ log(x) + w | fe2
这种方式通过直接操作公式的语法结构,比字符串处理更可靠、优雅,且无需依赖模型拟合过程。
内容的提问来源于stack exchange,提问作者dufei
相关产品推荐
相关产品推荐

