跳到主要内容

倾向得分匹配

一、直观理解:给处理组找“看起来差不多”的对照​

观测数据里,接受处理的人往往本来就与未接受者不同:更富、更病、更积极。直接比较平均结果,差值里混着选择偏差。

倾向得分匹配(Propensity Score Matching, PSM)的思路是:

  1. 用可观测协变量 XX 估计每人接受处理的概率 e(X)=P(D=1∣X)e(X)=P(D=1\mid X),即倾向得分;
  2. 在得分相近的个体之间,把处理组与对照组配成对(或匹配邻域);
  3. 在匹配样本上比较结果 YY,估计处理效应(常为 ATT)。

Rosenbaum & Rubin 的关键结果是:若给定 XX 时处理可忽略,则给定一维的 e(X)e(X) 也可忽略。于是用一维得分缓解“多维 XX 难以直接匹配”的诅咒。

重要:PSM 只能平衡已观测的 XX,不能自动消灭未观测混杂。

二、适用场景与优缺点​

类型说明
适用场景观测性研究;处理分配主要由可测变量驱动;需要估计 ATT;作为回归调整的稳健对照。
核心优点强调重叠与可比性;诊断图(共同支撑)直观;对处理机制建模与结果模型可分开。
局限与缺点未观测混杂仍在;错误倾向模型导致偏差;丢弃样本影响外推;匹配后仍需谨慎推断;高维/连续处理更复杂。

三、核心原理与识别​

1. 识别假设​

  • 条件可忽略(CIA):(Y(0),Y(1))⊥D∣X(Y(0),Y(1))\perp D\mid X(或对 ATT 只需 Y(0)⊥D∣XY(0)\perp D\mid X);
  • 重叠(positivity):0<e(X)<10<e(X)<1(ATT 则要求处理组的 e(X)e(X) 在对照组有支撑);
  • SUTVA:无干扰、处理版本一致。

2. 倾向得分​

常用 Logistic 回归:

e(X)=Λ(γTX)e(X)=\Lambda(\gamma^\mathsf{T}X)

也可用机器学习估计得分,但要以平衡性而非分类准确率为目标。

3. 匹配与估计​

  • 最近邻、卡尺(caliper)最近邻、核匹配、半径匹配等;
  • ATT:对每个处理个体找对照,平均 Yi−Y^i(0)Y_i-\hat Y_i(0);
  • 匹配后检查标准化均值差(SMD),目标多是 SMD<0.1。

4. 与 IPW 的关系​

得分也可做逆概率加权(IPW)而不配对;匹配是加权的一种离散形式。实践中可报告匹配与 IPW 两种。

四、关键决策​

1. 估 ATT 还是 ATE​

处理组有明确政策对象时常用 ATT;要全体平均用 ATE,并检查双方重叠。

2. 卡尺与替换​

卡尺过宽:坏匹配;过窄:样本流失。有放回匹配改善匹配质量但改变方差。

3. 平衡诊断重于伪 R2R^2​

倾向模型成功标准是匹配后 XX 平衡,不是 AUC 最大。

4. 双稳健​

结果回归 + IPW 的双稳健估计,在“得分或结果模型至少一个对”时更稳。

五、MATLAB 示例​

rng(23);
n = 600;
x1 = randn(n,1);
x2 = randn(n,1);
% 处理分配依赖 X
logit = 0.5 + 0.8*x1 - 0.6*x2;
ps_true = 1./(1+exp(-logit));
D = rand(n,1) < ps_true;
% 潜在结果:有混杂
Y0 = 2 + 1.0*x1 + 0.5*x2 + randn(n,1);
Y1 = Y0 + 1.5; % 真 ATT=1.5
Y = D.*Y1 + (1-D).*Y0;

% 朴素差
naive = mean(Y(D==1)) - mean(Y(D==0));
fprintf("朴素差 = %.3f\n", naive);

% 估计倾向得分
X = [ones(n,1) x1 x2];
beta = glmfit(X(:,2:end), D, "binomial"); % 含截距
ps = glmval(beta, X(:,2:end), "logit");

% 共同支撑:限制 ps 区间
support = ps > max(min(ps(D==1)), min(ps(D==0))) & ...
ps < min(max(ps(D==1)), max(ps(D==0)));
% 更常用:处理组 ps 落在对照 ps 范围内
lo = min(ps(D==0)); hi = max(ps(D==0));
support = true(n,1);
support(D==1) = ps(D==1) >= lo & ps(D==1) <= hi;

% 1:1 无放回最近邻匹配(ATT)
treat_idx = find(D==1 & support);
ctrl_idx = find(D==0);
used = false(size(ctrl_idx));
diff = zeros(size(treat_idx));
matched_ctrl = nan(size(treat_idx));
for k = 1:numel(treat_idx)
i = treat_idx(k);
cand = ctrl_idx(~used);
if isempty(cand), break; end
[dist, jrel] = min(abs(ps(cand) - ps(i)));
if dist > 0.05 % 卡尺
diff(k) = NaN; continue;
end
j = cand(jrel);
used(ctrl_idx==j) = true;
matched_ctrl(k) = j;
diff(k) = Y(i) - Y(j);
end
att = mean(diff(~isnan(diff)));
fprintf("PSM ATT ≈ %.3f (配对成功 %d)\n", att, sum(~isnan(diff)));

% 平衡性:匹配前后 x1 标准化差
function smd = std_mean_diff(xv, D)
smd = (mean(xv(D==1)) - mean(xv(D==0))) / sqrt((var(xv(D==1))+var(xv(D==0)))/2);
end
fprintf("匹配前 SMD(x1)=%.3f\n", std_mean_diff(x1,D));
% 匹配后样本
mT = treat_idx(~isnan(diff));
mC = matched_ctrl(~isnan(diff));
smd_post = (mean(x1(mT)) - mean(x1(mC))) / std(x1([mT; mC]));
fprintf("匹配后 SMD(x1)≈%.3f\n", smd_post);

figure;
histogram(ps(D==0), 30, "Normalization","pdf"); hold on;
histogram(ps(D==1), 30, "Normalization","pdf");
legend("对照","处理"); xlabel("倾向得分"); title("共同支撑检查");

六、如何解释结果​

  1. 处理、结果、协变量与样本;
  2. CIA/重叠等假设的实质讨论;
  3. 倾向模型形式;
  4. 匹配方法、卡尺、样本量变化;
  5. 平衡表(匹配前后 SMD);
  6. ATT 估计与 SE(Bootstrap 或阿布阿迪亚类解析);
  7. 敏感性(未观测混杂、换匹配方法)。

七、常见误区​

1. 把 PSM 当随机实验​

未观测混杂仍可毁掉因果。

2. 为提高 AUC 塞入中介或结果的代理​

会破坏识别。

3. 不检查共同支撑硬匹配​

强行外推。

4. 匹配后用普通 t 检验忽略估计得分与匹配的不确定性​

SE 往往偏小,宜 Bootstrap。

5. 报告 ATE 却按 ATT 匹配​

目标参数与算法要一致。

八、小结​

倾向得分匹配的核心是:

在可忽略与重叠假定下,用 e(X)e(X) 构造可比较的处理—对照,以估计因果效应(常为 ATT)。

它强调“先平衡,再比较”。写好 PSM 的关键不是调用匹配函数,而是把假设、重叠、平衡诊断和敏感性分析写到与点估计同样显眼的位置。