DID安慰剂检验-基于stata实现【原理笔记+代码】

安慰剂检验常用于医学实验,确保疗效的真实。在政策评估中,这种方法用来检验处理组和对照组在政策干预时点之外的趋势变化,避免其他因素干扰。通过虚构处理组或政策时间,若结果在不同假设下仍显著,则原有估计可能存在偏误。该方法包括选择政策实施前的时间段,建立对照并重复实验,以验证估计的稳健性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

安慰剂检验源自于医学,也叫作“安慰剂效应”。比如,在对新药疗效进行检验时,设置两组实验,一组服用试验药,一组服用类糖丸。但实验对象并不知道是试验药或者糖丸,以避免主观因素作用影响实验。

安慰剂检验

定义:检验政策干预时点,处理组和实验组(对照组)的趋势变化是否收到了其他政策或者随机因素的影响。


核心思想:

  • 虚构处理组或者虚构政策时间进行估计。
  • 如果不同虚构方式下的估计量回归结果依然显著,则原来估计结果不稳健(有偏误)
  • 下结论就是被解释变量 y y y很可能受到其他政策影响或者其他随机因素影响。

步骤:

  • 1.选取政策实施之前的年份进行处理,如,在2005年,研究区间为2004-2006。则定实验研究区间为2002-2004,假定政策实施为2003年。
  • 2.选取已知的但不受政策影响的群组作为处理组回归,如果不同虚构方式下的DID估计量的回归结果依然显著,这原模型设定可能出现偏误。
  • 3.重复实验,看看虚构变量的系数书否依然显著。

代码

来自B站
好人一生平安!

### 多时点 DID 平行趋势检验实现 #### Python 实现 在 Python 中可以利用 `pandas` 和 `statsmodels` 来完成多时点 DID 的平行趋势检验。以下是具体代码: ```python import pandas as pd import numpy as np from statsmodels.formula.api import ols # 假设数据结构如下: data = { 'unit': [1, 1, 1, 2, 2, 2, 3, 3, 3], # 单位编号 'time': [2018, 2019, 2020, 2018, 2019, 2020, 2018, 2019, 2020], # 时间 'treatment': [0, 0, 1, 0, 0, 0, 0, 1, 1], # 是否处理组(1表示处理) 'outcome': [5, 6, 7, 4, 5, 6, 3, 4, 5] # 结果变量 } df = pd.DataFrame(data) # 创建时间虚拟变量 for t in df['time'].unique(): df[f'time_{t}'] = (df['time'] == t).astype(int) # 构建回归模型 formula = 'outcome ~ treatment * time_2018 + treatment * time_2019 + treatment * time_2020' model = ols(formula, data=df).fit() print(model.summary()) ``` 上述代码通过交互项来检测不同时间段内的政策效果变化情况,从而验证平行趋势假设[^1]。 --- #### Stata 实现 Stata 提供了更为直观的方式来进行平行趋势检验。以下是一个完整的例子: ```stata * 数据准备 clear input unit time treatment outcome 1 2018 0 5 1 2019 0 6 1 2020 1 7 2 2018 0 4 2 2019 0 5 2 2020 0 6 3 2018 0 3 3 2019 1 4 3 2020 1 5 end * 创建时间虚拟变量 tabulate time, gen(time_) gen treat_time_2018 = treatment * time__1 gen treat_time_2019 = treatment * time__2 gen treat_time_2020 = treatment * time__3 * 进行回归分析 regress outcome treatment time__1 time__2 time__3 treat_time_2018 treat_time_2019 treat_time_2020 * 绘制平行趋势图 foreach j of numlist 1/3 { replace DID = 1 if (unit == `j' & time >= 2019) } mkmat time__*, matrix(Times) coefplot, keep(treat_time_*) vertical recast(connect) yline(0) /// xline(2, lp(dash)) ytitle("政策效应") xtitle("时期") ``` 此部分展示了如何构建交互项并绘制平行趋势图[^2][^3]。 --- #### R 实现 R 可以借助 `fixest` 或者 `plm` 包轻松完成类似的分析过程。下面提供了一个简单示例: ```r library(fixest) library(ggplot2) # 准备数据 data <- data.frame( unit = c(1, 1, 1, 2, 2, 2, 3, 3, 3), time = c(2018, 2019, 2020, 2018, 2019, 2020, 2018, 2019, 2020), treatment = c(0, 0, 1, 0, 0, 0, 0, 1, 1), outcome = c(5, 6, 7, 4, 5, 6, 3, 4, 5) ) # 添加时间哑变量 data$time_dummies <- paste0("time_", data$time) dcast_data <- reshape2::dcast(data, unit + treatment + outcome ~ time_dummies, value.var = "outcome") # 回归分析 feols(outcome ~ treatment + time_2018 + time_2019 + time_2020 | unit, data = dcast_data) # 绘制平行趋势图 ggplot(data, aes(x = factor(time), y = outcome, group = interaction(unit, treatment))) + geom_line(aes(color = factor(treatment)), size = 1) + labs(title = "Parallel Trend Test", x = "Time Periods", y = "Outcome Variable") + theme_minimal() ``` 这段代码实现了基于固定效应回归和平行趋势可视化的过程。 --- ### 总结 以上分别提供了 Python、Stata 和 R 下的多时点 DID 平行趋势检验方法及其对应的代码实现方式。每种工具都有其独特的优势,在实际应用中可以根据个人习惯和技术环境选择合适的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wency(王斯-CUEB)

我不是要饭的

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值