You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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

火山引擎 最新活动