基于长格式填补面板数据的匹配以开展双重差分(DiD)分析
长格式多重填补数据集的PSM+DiD处理方案
核心思路
PSM是基于个体基线特征的匹配,只需用每个ID的基线(t1)行计算倾向得分、完成匹配,之后保留匹配ID对应的所有时间点(t1/t2/t3)记录,就能用于DiD分析。针对mice生成的多重填补数据集,需对每个填补样本重复该流程。
具体步骤(R代码示例)
假设你的多重填补数据集是imputed_data(mids对象),长格式包含列:ID, time(取值t1/t2/t3), treat(处理组标识,t1时确定), 基线协变量(如age, gender, baseline_score), 结局变量(如outcome)。
1. 提取每个填补样本的个体基线信息(宽格式)
从长格式填补数据中筛选t1行,得到个体层面的匹配数据集:
library(mice) library(dplyr) library(MatchThem) # 从单个填补数据中提取基线行 extract_baseline <- function(data) { data %>% filter(time == "t1") # 替换为你的基线时间标识,比如1 select(ID, treat, age, gender, baseline_score) # 保留ID、处理变量和所有基线协变量 } # 对所有填补样本应用函数,转换为mids对象 imputed_baseline <- lapply(complete(imputed_data, "all"), extract_baseline) imputed_baseline <- as.mids(imputed_baseline)
2. 用MatchThem完成个体层面PSM
和宽格式处理逻辑一致,基于基线协变量匹配处理组与对照组:
# 执行1:1近邻匹配(可根据需求调整参数) matched_baseline <- matchthem( treat ~ age + gender + baseline_score, data = imputed_baseline, approach = "nearest", ratio = 1, replace = FALSE ) # 检查匹配平衡性(可选,在个体层面验证) summary(matched_baseline, type = "balance")
3. 将匹配结果映射回长格式数据集
提取匹配后的ID列表,回到原长格式填补数据中筛选对应所有行:
# 从匹配后的基线数据中筛选长格式全量记录 get_matched_long <- function(long_data, matched_baseline_data) { matched_ids <- matched_baseline_data$ID long_data %>% filter(ID %in% matched_ids) } # 对每个填补样本执行映射 matched_long_list <- mapply( get_matched_long, long_data = complete(imputed_data, "all"), matched_baseline_data = complete(matched_baseline, "all"), SIMPLIFY = FALSE ) # 转换为mids对象,方便后续分析 matched_long_imputed <- as.mids(matched_long_list)
4. 在匹配后的长格式数据上做DiD分析
用固定效应模型拟合DiD,合并多重填补的结果:
library(fixest) # 定义DiD模型函数 fit_did <- function(data) { feols(outcome ~ treat * i(time, ref = "t1") | ID, data = data) } # 对所有匹配后的填补样本拟合模型 did_models <- lapply(complete(matched_long_imputed, "all"), fit_did) # 合并多重填补结果 pooled_results <- pool(did_models) summary(pooled_results)
关键注意事项
- 处理变量
treat必须是基线时确定的固定变量,不能随时间变化,否则PSM逻辑不成立。 - 匹配平衡性检查需在个体层面的基线数据上完成,而非长格式数据。
- 多重填补的每个样本需独立完成匹配与DiD,最后用
pool()合并结果,符合多重填补的统计推断要求。
内容的提问来源于stack exchange,提问作者Paul Fabian
相关产品推荐
相关产品推荐

