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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 22:02:30