如何修改MatchIt代码实现面板数据个体层面PSM匹配(用于DID)
个体层面PSM匹配修改思路(适配DID面板数据)
针对你的需求,核心是把观测层面的匹配改成个体层面的匹配——因为DID分析聚焦个体在处理前后的差异,必须以participant_uuid为单位匹配,而非每个月的单条观测。具体修改步骤如下:
1. 先将预处理面板数据聚合到个体层面
你的dataset_12months_pre_treatment包含每个个体12条预处理观测,首先需要把每个个体的预处理特征汇总成单一记录(时变特征取均值/总和,时间不变特征取唯一值):
library(dplyr) # 按个体分组,聚合预处理特征 individual_pre_data <- dataset_12months_pre_treatment %>% group_by(participant_uuid, grouping_variable) %>% summarize( # 时变特征:取预处理12个月的均值(可根据需求调整为总和、中位数等) characteristic1 = mean(characteristic1, na.rm = TRUE), characteristic2 = mean(characteristic2, na.rm = TRUE), characteristic3 = mean(characteristic3, na.rm = TRUE), .groups = "drop" )
注意:如果特征是时间不变的(如性别、基线年龄),直接用
first(characteristic1)提取唯一值即可,无需聚合。
2. 基于个体层面数据执行PSM匹配
修改matchit代码,去掉针对month_relative_to_treatment的精确匹配,改用个体层面的聚合特征匹配:
library(MatchIt) # 个体层面的最近邻匹配 match.nearestneighbour <- matchit( grouping_variable ~ characteristic1 + characteristic2 + characteristic3, data = individual_pre_data, distance = "glm", method = "nearest", m.order = "largest", replace = TRUE # 若有个体层面的精确匹配需求(如地区),可重新添加exact参数,如exact = c("region") )
3. 将匹配结果映射回原始全期面板数据
匹配完成后,提取所有匹配成功的个体ID,再从包含24个月观测的原始面板数据中筛选出这些个体,用于后续DID分析:
# 提取匹配后的个体UUID列表 matched_uuids <- match.data(match.nearestneighbour)$participant_uuid # 筛选原始面板数据中匹配成功的个体 matched_full_panel <- original_full_panel_data %>% filter(participant_uuid %in% matched_uuids)
4. 验证匹配效果
运行summary(match.nearestneighbour)查看协变量平衡情况,确保治疗组与控制组的个体层面预处理特征无显著差异,这是保证DID结果可靠性的关键。
内容的提问来源于stack exchange,提问作者Alexanderg
相关产品推荐
相关产品推荐

