如何在Matchit输出PSM配对结果时保留原始账号信息?
解决Matchit PSM配对结果关联账号并导出的方法
核心思路
利用match.matrix中的观测序号,直接关联原始数据里的account number字段,将配对关系转化为包含双方账号的表格后导出。
具体步骤(以1:1匹配为例,多匹配可扩展)
假设你的Matchit结果对象名为m.out,原始数据框名为data,账号字段为account_number:
提取匹配关系矩阵
# 取出匹配矩阵 match_mat <- m.out$match.matrix # 转为数据框并给对照组序号列命名 match_df <- as.data.frame(match_mat) colnames(match_df) <- "control_idx"关联处理组与对照组账号
# 提取处理组账号(行名对应处理组观测序号) match_df$treatment_account <- data$account_number[as.integer(rownames(match_df))] # 提取对照组账号(control_idx对应对照组观测序号) match_df$control_account <- data$account_number[as.integer(match_df$control_idx)]整理并导出结果
# 保留账号列,移除序号列 final_results <- match_df[, c("treatment_account", "control_account")] # 导出为CSV文件 write.csv(final_results, "psm_paired_accounts.csv", row.names = FALSE)
多匹配场景扩展(如1:3匹配)
如果每个处理组匹配多个对照组,按以下方式处理:
match_mat <- m.out$match.matrix match_df <- as.data.frame(match_mat) colnames(match_df) <- paste0("control_idx_", 1:ncol(match_df)) # 提取处理组账号并重复对应匹配次数 match_df$treatment_account <- rep(data$account_number[as.integer(rownames(match_df))], each = ncol(match_df)) # 批量提取所有对照组账号 control_accounts <- unlist(lapply(match_df[,1:ncol(match_df)], function(x) data$account_number[as.integer(x)])) # 整理成长格式表格,标注匹配优先级 final_results <- data.frame( treatment_account = match_df$treatment_account, control_account = control_accounts, match_rank = rep(1:ncol(match_df), nrow(match_df)) ) # 导出结果 write.csv(final_results, "psm_multiple_paired_accounts.csv", row.names = FALSE)
注意事项
- 确保原始数据
data的行号未被修改(未做行删除、排序等操作),否则观测序号会与match.matrix中的值不匹配。 - 若匹配结果存在NA(部分处理组未匹配到对照组),可通过
na.omit()去除未匹配行后再导出。
内容的提问来源于stack exchange,提问作者Ophdesdi
相关产品推荐
相关产品推荐

