R语言:如何高效遍历多指标运行双重差分(DID)模型
嘿,我完全懂你现在的麻烦——每次换个因变量就复制粘贴一遍lm代码,既繁琐还容易不小心写错变量名对吧?针对同一DID框架批量处理多个指标,有几个高效的方案,我给你拆解一下:
方法1:用tidyverse的purrr批量生成模型
如果你平时习惯用tidyverse工具链,这个方法最顺手。核心是用map()函数遍历所有要分析的因变量,动态生成模型公式:
# 先加载tidyverse(包含purrr) library(tidyverse) # 把你要分析的因变量列名存成向量 outcome_vars <- c("miles_driven", "hours_worked") # 批量生成DID模型 did_models <- map(outcome_vars, ~ lm(formula = paste(.x, "~ Group + Time + Group:Time"), data = df)) # 给模型命名,方便后续快速调用 names(did_models) <- outcome_vars
之后你想查看某个模型的结果,直接用summary(did_models[["miles_driven"]])就行;如果要批量看所有模型的摘要,用map(did_models, summary)就搞定。
方法2:Base R的lapply(无需额外安装包)
如果不想加载第三方包,用Base R的lapply也能实现同样的效果,逻辑和上面一致:
# 定义因变量列表 outcome_vars <- c("miles_driven", "hours_worked") # 用lapply批量运行模型 did_models <- lapply(outcome_vars, function(var) { # 动态生成公式并拟合模型 lm(formula = as.formula(paste(var, "~ Group + Time + Group*Time")), data = df) }) # 给模型命名 names(did_models) <- outcome_vars
这里as.formula()把拼接出来的字符串转换成lm能识别的公式对象,完全用Base R就能跑,适合不想额外装包的场景。
方法3:结合broom包整理成结构化结果表格
如果你需要把所有模型的结果(比如系数、p值、标准误)整理成一个统一的表格方便对比,broom包绝对是神器:
library(broom) library(purrr) outcome_vars <- c("miles_driven", "hours_worked") # 批量拟合模型并整理成数据框 model_results <- map_dfr(outcome_vars, function(var) { # 拟合模型 model <- lm(paste(var, "~ Group + Time + Group:Time"), data = df) # 用tidy()整理模型输出,再新增一列标记因变量 tidy(model) %>% mutate(outcome_variable = var) }) # 查看整理后的结果,方便对比不同指标的DID效应(Group:Time行) print(model_results)
这个输出会是一个整洁的数据框,你可以轻松筛选出每个因变量的DID交互项系数,或者导出成CSV用于汇报。
额外小技巧
如果你的模型需要加控制变量(比如State固定效应),可以把控制变量单独存成字符串,这样修改控制变量时只改一次就行:
controls <- "+ State" did_models <- map(outcome_vars, ~ lm(paste(.x, "~ Group + Time + Group:Time", controls), data = df))
内容的提问来源于stack exchange,提问作者Andrew




