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

如何在R中绘制双重差分(DID)安慰剂检验图?

双重差分(DID)安慰剂检验图绘制方法(R实现)

核心思路

安慰剂检验的逻辑是:多次随机重新分配「处理组」标签,每次拟合DID模型并提取交互项(treatment*after)的系数,最终把这些安慰剂系数的分布可视化,再将真实模型的交互项系数标注在图中,以此判断真实效应是否显著异于随机分配产生的效应。

具体步骤&代码

1. 加载依赖包

我们需要用tidyverse做数据处理和绘图,broom提取模型结果:

library(tidyverse)
library(broom)

2. 定义安慰剂模拟函数

写一个函数,每次随机打乱原数据的treatment变量,拟合DID模型并提取交互项系数:

placebo_sim <- function(data) {
  # 随机重分配处理组
  data_sim <- data %>% 
    mutate(treatment = sample(treatment, n(), replace = FALSE))
  
  # 拟合DID模型
  model <- lm(score ~ treatment + after + treatment*after, data = data_sim)
  
  # 提取交互项系数
  tidy(model) %>% 
    filter(term == "treatment:after") %>% 
    pull(estimate)
}

3. 运行多次模拟

这里我们跑1000次模拟(次数可按需调整),得到所有安慰剂系数:

set.seed(123) # 设置随机种子保证结果可重复
placebo_coefs <- replicate(1000, placebo_sim(data))

4. 提取真实模型的交互项系数

从你已经拟合好的did模型中提取真实的交互项系数:

real_coef <- tidy(did) %>% 
  filter(term == "treatment:after") %>% 
  pull(estimate)

5. 绘制安慰剂检验图

用密度图+直方图结合的方式展示,同时用竖线标出真实系数:

tibble(placebo_coef = placebo_coefs) %>% 
  ggplot(aes(x = placebo_coef)) +
  geom_histogram(aes(y = after_stat(density)), bins = 30, fill = "lightblue", alpha = 0.7) +
  geom_density(color = "darkblue", linewidth = 1) +
  geom_vline(xintercept = real_coef, color = "red", linewidth = 1.5, linetype = "dashed") +
  labs(
    x = "安慰剂交互项系数",
    y = "密度",
    title = "DID安慰剂检验结果",
    subtitle = paste0("真实交互项系数: ", round(real_coef, 3))
  ) +
  theme_minimal()

结果解读

如果红色虚线(真实系数)明显落在安慰剂系数分布的尾部(比如95%置信区间之外),说明你的真实处理效应不太可能是随机产生的,DID估计结果更可靠。

内容的提问来源于stack exchange,提问作者Ajern

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 02:45:40