在R中使用Wald Test检验双重差分模型的平行趋势
用Wald检验验证DID平行趋势假设的方法与R代码
当然可以用Wald检验作为DID平行趋势假设的预检验——核心逻辑是检验政策前所有处理组-时间交互项的联合显著性:如果联合检验结果不显著(p值>0.05),就说明政策前处理组和控制组的趋势没有显著差异,满足平行趋势假设。
具体操作步骤
- 构造相对时间变量:把政策实施的年份设为基准点(
rel_time=0),政策前的年份依次标记为-1(前1期)、-2(前2期)……-13(前13期)。 - 生成政策前交互项:为每个政策前的相对时间点生成
treat × rel_time交互项(treat=1是处理组,0是控制组)。 - 回归与Wald检验:估计包含这些交互项、个体固定效应、时间固定效应的回归模型,然后用Wald检验验证所有政策前交互项的系数是否联合为0。
R代码实现(推荐用fixest包,高效且简洁)
假设你的数据集名为df,包含变量:treat(分组)、year(年份)、policy_year(政策实施年份)、y(被解释变量)、id(个体标识),还有可选的控制变量cov1/cov2等。
# 加载包 library(fixest) # 1. 生成相对时间变量 df$rel_time <- df$year - df$policy_year # 2. 估计包含所有相对时间交互项的固定效应模型 # ref=-1 表示以政策前1期为基准,避免多重共线性 model <- feols( y ~ i(rel_time, treat, ref = -1) | id + year, # id是个体FE,year是时间FE data = df ) # 3. 执行Wald检验:检验政策前13期到前2期的交互项系数联合为0 # 注意:如果基准是-1,那么-1的系数是基准,不需要检验 wald_result <- wald( model, "rel_time::(-13):treat = rel_time::(-12):treat = rel_time::(-11):treat = rel_time::(-10):treat = rel_time::(-9):treat = rel_time::(-8):treat = rel_time::(-7):treat = rel_time::(-6):treat = rel_time::(-5):treat = rel_time::(-4):treat = rel_time::(-3):treat = rel_time::(-2):treat = 0" ) # 查看检验结果 print(wald_result)
替代方案(用lm+lmtest包)
如果你习惯用基础lm函数:
library(lmtest) # 1. 生成相对时间变量 df$rel_time <- df$year - df$policy_year # 2. 手动生成所有政策前的交互项 for (k in -13:-1) { df[[paste0("treat_rel_", k)]] <- df$treat * (df$rel_time == k) } # 3. 估计回归模型(控制个体和时间固定效应) model_lm <- lm( y ~ treat_rel_-13 + treat_rel_-12 + treat_rel_-11 + treat_rel_-10 + treat_rel_-9 + treat_rel_-8 + treat_rel_-7 + treat_rel_-6 + treat_rel_-5 + treat_rel_-4 + treat_rel_-3 + treat_rel_-2 + treat_rel_-1 + factor(id) + factor(year), data = df ) # 4. Wald检验:所有政策前交互项系数联合为0 wald_result_lm <- waldtest( model_lm, c("treat_rel_-13=0", "treat_rel_-12=0", "treat_rel_-11=0", "treat_rel_-10=0", "treat_rel_-9=0", "treat_rel_-8=0", "treat_rel_-7=0", "treat_rel_-6=0", "treat_rel_-5=0", "treat_rel_-4=0", "treat_rel_-3=0", "treat_rel_-2=0", "treat_rel_-1=0") ) # 查看结果 print(wald_result_lm)
实用经验
- 基准期选择:通常选政策前1期作为基准,既避免多重共线性,也能更清晰对比各期差异。
- 可视化辅助:不要只依赖Wald检验,建议同时绘制平行趋势图(用
fixest的iplot()函数),直观展示政策前两组的趋势走向,和统计检验结果互相印证。 - 若检验显著:如果Wald检验p值<0.05,说明平行趋势不满足,可考虑使用合成控制法、匹配DID,或加入个体-时间趋势交互项来修正模型。
内容的提问来源于stack exchange,提问作者j.rahilly
相关产品推荐
相关产品推荐

