R语言倾向得分匹配(PSM)匹配结果与预期不符问题咨询
首先,我们先明确你的数据集和匹配目标:你的propScore数据中,group=0是对照组(4个样本:行1-4),group=1是处理组(6个样本:行5-10)。你期望处理组中前4个样本(行5-8,与对照组行1-4的dep和public完全一致)分别匹配对应的对照组样本,而处理组后2个样本(行9-10)因无对应协变量的对照组样本无法匹配,但实际MatchIt返回的结果和预期不符。
你操作中的核心问题
默认的matchit()设置和你的预期匹配逻辑不一致,主要有两点:
1. 默认使用倾向得分而非直接协变量匹配
你当前的代码matchit(group ~ dep + public, data = propScore, method = "nearest", ratio = 1)默认会先通过logit模型估计倾向得分(即给定dep和public时,样本属于处理组的概率),然后基于倾向得分的欧氏距离进行最近邻匹配,而不是直接基于dep和public的原始值匹配。
虽然你的前4个处理组和对照组样本的dep、public完全一致,它们的倾向得分也会完全相同,但MatchIt的匹配顺序、样本优先级规则可能导致它没有优先匹配这些完全一致的样本。
2. 匹配方向与样本优先级的影响
MatchIt默认以处理组为匹配基准(因为group=1被识别为处理组),当处理组样本数多于对照组时,它会按倾向得分的排序规则选择处理组样本进行匹配,而非优先匹配协变量完全一致的样本。
如何修正得到你预期的结果
要实现你期望的“协变量完全匹配”效果,你需要修改matchit()的参数,指定直接基于协变量的匹配逻辑:
方法1:使用马氏距离匹配(直接基于协变量)
指定distance="mahalanobis",让MatchIt直接基于dep和public的马氏距离进行最近邻匹配,优先匹配协变量最接近(这里是完全一致)的样本:
m.out = matchit(group ~ dep + public, data = propScore, method = "nearest", ratio = 1, distance = "mahalanobis")
方法2:强制精确匹配dep和public
如果你希望只有dep和public完全一致的样本才能匹配,可以添加exact=c("dep","public")参数,直接限定匹配的精确条件:
m.out = matchit(group ~ dep + public, data = propScore, method = "nearest", ratio = 1, exact = c("dep", "public"))
这两种方法都会让处理组的行5-8分别匹配对照组的行1-4,而行9-10因无对应协变量的对照组样本,匹配结果为NA,和你的预期完全一致。
验证匹配结果
运行修正后的代码后,你可以用match.data(m.out)查看匹配后的完整数据集,或者用summary(m.out)查看匹配统计,此时dep和public会完全平衡,符合你的预期。
内容的提问来源于stack exchange,提问作者Juanma Mascarás Martínez

