老王在城郊有一座苹果园。他最想弄明白一件事:那壶昂贵的有机肥,到底让苹果变甜了多少?他翻出三年记录,发现施过肥的树结的果子平均甜度高 0.8 度。但他很快冷静下来——他施肥不是抛硬币决定的,而是总挑光照好、树龄长的树施肥。这些树本来就甜,多出来的 0.8 度,究竟是肥料的功劳,还是树本身的底子?因果推断的答案不是把果树劈成两半,而是接受一个思想实验:每棵树都藏着两个平行世界的甜度——一个吃过肥,一个没吃过肥。现实只让我们看到其中一个,另一个叫反事实。倾向得分,就是根据树的年龄、光照、土质等特征,估算它被选去吃肥的概率。有了这个概率,老王可以把两群不对等的树重新配对、重新加权,让比较变成一场虚拟随机实验。
掌握倾向得分,你就能在无法做随机实验的现实数据里,用可复现的推理路径得到接近随机实验的因果结论,这是数据可信层与可解释 AI 的硬核能力。
可视化演示
展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。
本节配有交互动效(进入视口后自动加载,约 3KB)。
系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T
因果推断基础
想象老王真的拿到一台时光机。他可以让同一棵树在 2019 年吃肥,在 2020 年不吃肥,然后比较两次甜度。机器当然不存在,但潜在结果框架让老王的脑子里多了这台机器。它告诉老王:每一棵树 i 都同时拥有两个身份,一个是“施肥后的甜度”,一个是“不施肥的甜度”,就像一个人同时活在两个平行世界里。
我们把这两个身份记为 Y_i(1) 和 Y_i(0)。1 代表吃了肥,0 代表没吃肥。两者之间的差 Y_i(1) - Y_i(0),就是这棵树个体的因果效应。可惜现实是一个残酷的剪辑师,只保留一个镜头:吃了肥的树你无法知道它不吃肥有多甜,没吃肥的树你无法知道它吃了肥有多甜。那个消失的镜头,就叫反事实。
为了得到全园的整体结论,因果推断关心平均处理效应 ATE:把所有树的个体效应取平均。如果老王像抛硬币一样随机决定施肥,那么两组树在年龄、光照、土质上不会有系统性差别,均值的差异就能直接归因于肥料。随机化是因果推断的金标准。
老王收起时光机的幻想,却很受用这套语言:所有因果推断努力,本质上都是在补全那个被现实剪掉的反事实镜头。接下来要做的,不是造机器,而是找一杆能在两组树之间称出公平的秤。
- 潜在结果变量Y_i(1) 表示个体 i 接受处理后的潜在结果,Y_i(0) 表示未接受处理时的潜在结果,它们像同一颗苹果在平行世界中的两个版本。
- 个体因果效应同一棵树在两种平行世界中的甜度差值,差值为正说明肥料有效。
- 取期望得到 ATE对所有个体的个体效应求平均,就是群体层面的平均处理效应。
倾向得分原理
老王没有时光机,但他在果园里发现了一个规律:施肥并不是随便执行的,而是受树龄、光照、土质这些“协变量”摆布。于是他想:如果我能算出每一棵树被选去施肥的概率,这个概率是不是就能概括这棵树的全部偏心之处?
这个概率就是倾向得分 e(X)。树龄大、光照好的树被选中的概率高,处在冷角落、土质贫的树概率低。e(X) 把年龄、光照、土质等一堆特征压缩成一个 0 到 1 之间的数字,把高维的“找相似”问题,变成一维的“比概率”问题。
Rosenbaum 和 Rubin 在 1983 年证明了一个关键性质:在条件可忽略性假设下(即给定 X 时,处理分配与潜在结果独立),倾向得分是一个平衡得分。只要两组树在 e(X) 上相同,它们的协变量分布也趋于相同,处理分配就像随机化一样。这个结论把观测数据变成一场准实验。
老王终于松了口气:只要把每棵树被选去吃肥的概率算出来,就相当于找到了果园里的“偏心度”。剩下的工作,就是让偏心度相同的树走到一起比甜度。
- 处理变量T 表示是否接受处理,T=1 表示施肥,T=0 表示未施肥。
- 条件概率给定协变量向量 X 时,个体接受处理的概率,这是倾向得分的定义式。
- 概率取值范围e(X) 是概率,因此一定落在 0 和 1 之间,越接近 1 说明该个体越像“被选去施肥的人”。
匹配算法
老王想给每棵施肥树找一位“影子兄弟”——看起来条件相似但没吃肥的树。最朴素的办法是最邻近匹配:对每一位处理组个体,在对照组里找一个倾向得分最接近的个体。倾向得分越接近,说明两张“偏心名片”长得越像。
卡钳匹配给这个“最近”加上一道警戒线:如果两个个体倾向得分差得太大,宁可不匹配也不硬凑。分层匹配则先把全体样本按倾向得分切成若干层,再在每一层内比较结果;核匹配则用加权平均给一个处理个体匹配多个对照,让“影子兄弟”变成“影子兵团”。
影子兄弟不是完美的,但至少让比较不再像“校花与全年级比身高”。老王从一维的相似度入手,躲开了高维空间的度量灾难。
- 两个个体i 是处理组个体(吃了肥的树),j 是候选对照组个体(没吃肥的树)。
- 距离度量两个个体倾向得分绝对差越小,说明它们被选到处理组的概率越接近,协变量分布也越相似。
- 最邻近选择在对照组候选中选择距离最小的 j;若再加卡钳,则只有当 d 小于卡钳时才接受该匹配。
加权估计
匹配是一对一联姻,加权则是给所有样本重新称重。老王发现,与其辛苦地一对一配对,不如直接给每一棵树一个“纠偏权重”:那些明明条件很像对照组却吃了肥的树,权重应该大一些;那些条件很像处理组却没吃肥的树,也应该大一些。这样加权之后,两组的协变量分布会重新变得均衡。
逆概率加权(IPW)正是这个思路。处理组每个个体的权重取倾向得分的倒数 1/e,对照组每个个体取 1/(1-e)。本质是让样本分布“变回”一个处理分配完全随机的伪总体。稳定权重进一步在分子上乘上处理率或对照组比例,降低极端权重带来的方差。
老王想象把每一筐苹果按概率的“反概率”加水倒水,最终天平恢复平衡。他还可以把结果回归和倾向得分模型结合,这就是双重稳健估计:只要其中一个模型正确,估计依然保持一致。
- 处理组项当 T_i=1 时,这一项为 Y_i / e_i。个体被选中概率越低,权重倒数越大,就越能代表那些“条件相似但没被选中”的群体。
- 对照组项当 T_i=0 时,这一项为 Y_i / (1-e_i),用来放大那些实际上很像处理组的对照个体。
- 相减取平均对所有个体的加权结果差取平均,就得到总体平均处理效应的估计值。
性能评估
老王担心自己的“公平独木桥”是否真的公平,需要用尺子量。最常见的尺子是标准化差异(SMD):比较每个协变量在匹配或加权前后的均值差,再除以合并标准差。它不像显著性检验那样受样本量影响,能更真实地反映两组差异有多大。
标准化差异的绝对值小于 0.1,通常被认为协变量已经得到良好平衡。与此同时还要做重叠诊断:看两组倾向得分分布是否有足够重叠。如果处理组的倾向得分都集中在 0.9 附近,对照组都集中在 0.1 附近,那么“影子兄弟”根本找不到同一片生活区域。敏感性分析则用来回答:如果存在一个未观测混杂变量,它要强到什么程度才能推翻当前结论?
老王知道了,光有影子兄弟还不够,还要给兄弟俩量身高、测体重,确认真的很像。匹配不是结束,验证平衡才是真正把话说到实处的时刻。
- 两组均值差处理组与对照组在某个协变量上的均值之差,比如平均树龄或平均光照时长。
- 合并标准差两组方差取平均再开根号,相当于把两个组的波动幅度合成一把尺子。
- 标准化差异阈值用均值差除以合并标准差,绝对值小于 0.1 通常视为该协变量已平衡。
实战优化
老王开始调配方:不能把影响施肥但不会影响甜度的“工具变量”放进去,否则会放大方差;也不能放入处理后变量,否则会引入对撞偏倚。一个好的倾向得分模型,应该纳入同时影响处理分配和结局的混杂变量。
倾向得分最常用的拟合方式是 Logistic 回归:把处理变量对协变量做回归,得到每个个体进入处理组的概率。在协变量关系复杂时,还可以用广义加性模型、梯度提升等非参数方法拟合倾向得分。拟合之后,若发现极端倾向得分,例如小于 0.05 或大于 0.95,通常需要修剪,因为这些样本的权重会爆炸、匹配会失真。
经过这轮打磨,老王终于可以说:我的结论不再是猜测,而是一场深思熟虑的“虚拟随机实验”。从变量选择、倾向得分修剪、非参数拟合到成熟的软件实现,每一步都在提升结论的可信度。
- 优势比处理概率与未处理概率之比的自然对数,称为 logit 变换,把 [0,1] 的概率映射到实数轴。
- 线性预测用协变量的线性组合来表达 logit 值,β 表示每个协变量对处理分配的影响强度。
- 反解得分由 logit 值反解出概率,就得到了倾向得分。实际工作中可直接调用 sklearn 等工具完成。
AI 应用场景
医疗真实世界研究中的用药效果评估
阶段:观察性研究的因果推断 / 数据可信层验证
解决的问题:直接比较用药与不用药患者的复发率,会被病情严重程度等混杂因素带偏。AI 团队用倾向得分匹配或 IPW 构造可比的用药对照组,让“医生为什么开药”这一机制不再成为结论的干扰项。
具体案例:某医院评估新降压药对 30 天再入院率的影响。医生更倾向给重症患者开新药,而重症本身也推高再入院率。团队把重症程度、年龄、并发症纳入 Logistic 模型,对每个用药患者匹配一个倾向得分最接近的未用药患者,再比较再入院率。
营销场景中的优惠券效果归因
阶段:用户增长效果评估 / 策略算法审计
解决的问题:满减券的发送策略偏向高活跃用户,而高活跃用户本来就更容易复购,直接对比会高估券的效果。倾向得分加权可以还原“人人都有可能收到券”的伪随机世界。
具体案例:电商平台评估“满 300 减 50”是否提升复购。平台用用户活跃度、历史客单价等特征估计倾向得分,再用 IPW 加权:高活跃用户被发券概率高,权重取 1/e 压低其影响;低活跃用户被发券概率低,权重放大,从而得到更真实的券效估计。
公共政策评估中的职业培训项目
阶段:政策效果审计 / 可解释 AI 决策支持
解决的问题:参加职业培训的人与未参加者往往在动机、工作经历上存在系统性差异,简单对比就业率会把“选择偏差”误认为“培训效果”。双重稳健估计能同时利用结果回归和倾向得分模型,降低单一模型误设的风险。
具体案例:就业局评估一项职业技能培训是否提高就业率。参与者多为失业较久者,这类人本身就业难度更大。数据团队用双重稳健估计:既建立就业率的结果回归,又建立参与培训的倾向得分模型,只要其中一个模型设定合理,就能得到较稳健的因果效应。
Python 演示
import numpy as npfrom sklearn.linear_model import LogisticRegressionfrom sklearn.neighbors import NearestNeighbors def generate_data(n=600, seed=42): rng = np.random.default_rng(seed) age = rng.normal(40, 10, n) income = rng.normal(8, 3, n) X = np.c_[age, income] p_score = 1 / (1 + np.exp(-(0.04 * age - 0.2 * income + 1.2))) t = rng.binomial(1, p_score) y0 = 50 + 0.5 * age + 0.3 * income + rng.normal(0, 5, n) y1 = y0 + 1.5 y = np.where(t == 1, y1, y0) return X, t, y def estimate_ps(X, t): model = LogisticRegression(max_iter=1000) model.fit(X, t) return model.predict_proba(X)[:, 1] def ipw_ate(y, t, ps): w = t / ps + (1 - t) / (1 - ps) return np.average(y[t == 1], weights=w[t == 1]) - np.average(y[t == 0], weights=w[t == 0]) def psm_ate(X, t, y, caliper=0.05): ps = estimate_ps(X, t) treated = np.where(t == 1)[0] control = np.where(t == 0)[0] nn = NearestNeighbors(n_neighbors=1).fit(ps[control].reshape(-1, 1)) dist, idx = nn.kneighbors(ps[treated].reshape(-1, 1)) dist = dist.flatten() idx = control[idx.flatten()] mask = dist < caliper matched_t = treated[mask] matched_c = idx[mask] print('匹配对数:', matched_t.size) return y[matched_t].mean() - y[matched_c].mean() if __name__ == '__main__': X, t, y = generate_data() naive = y[t == 1].mean() - y[t == 0].mean() ps = estimate_ps(X, t) print('朴素差异:', naive) print('IPW估计:', ipw_ate(y, t, ps)) print('PSM估计:', psm_ate(X, t, y))
def generate_data(n=600, seed=42):生成模拟数据:年龄和收入同时影响处理与否和结果,制造选择偏差。p_score = 1 / (1 + np.exp(-(0.04 * age - 0.2 * income + 1.2)))用逻辑函数生成处理概率,让概率依赖于协变量。model.fit(X, t)用 Logistic 回归估计每个个体的倾向得分。w = t / ps + (1 - t) / (1 - ps)构造 IPW 权重:处理组取 1/e,对照组取 1/(1-e)。nn.kneighbors(ps[treated].reshape(-1, 1))对每个处理组个体,在倾向得分轴上找最近的对照组。mask = dist < caliper卡钳筛选:距离过大的匹配对被丢弃,避免“远房亲戚”硬配对。naive = y[t == 1].mean() - y[t == 0].mean()朴素比较结果均值,通常会偏离真实效应。print('IPW估计:', ipw_ate(y, t, ps))输出加权修正后的平均处理效应,更接近真实值。
常见误区
误区“我算出倾向得分 0.8,是不是说明施肥让苹果甜了 0.8 度?” 很多初学者第一次看到 0-1 之间的分数时,会把它当成效果值。
正解倾向得分只是“被选进处理组的概率”,不是处理对结果的影响。老王那棵 0.8 概率的树,指的是它的特征与“很可能施肥”的树相似;因果效应要比较 Y(1) 与 Y(0),而不是比较概率。这就像“中奖概率”不等于“奖金数额”。
为何常见:因为术语含“得分”,且数值在 0-1 之间,容易让人联想到相关系数或效果大小。
误区“倾向得分匹配之后,两组已经完全可比,可以像随机对照实验一样直接下因果结论。”
正解倾向得分只能平衡已经观测到的协变量;未观测混杂(比如老王心里那点“偏爱的眼神”)仍可能造成偏倚。倾向得分把观测性研究做成“准实验”,但做不到随机实验的百分百保险。事后需要做敏感性分析,评估未观测混杂要到多强才能推翻结论。
为何常见:因为“准实验”听起来与“随机实验”只有一步之遥,而且平衡表全部通过时,人会下意识放松警惕。
误区“两组倾向得分有一点重叠就够了,重叠区外也可以大胆比较。”
正解重叠区外的个体,比如老王的施肥树全在 0.8 以上,对照树全在 0.2 以下,把它们硬拉在一起比较,等于让苹果和橘子比甜。应该在共同支撑区内估计效应,并明确报告结论的适用范围。
为何常见:人们希望保留所有样本以增加样本量,却忽略了“保留不可比样本”会带来比样本量损失更严重的偏差。
误区“把能拿到的变量全放进 Logistic 回归,倾向得分一定会更准确。”
正解放进只影响处理、不影响结果的工具变量会增大方差;放进处理后的中介变量会引入对撞偏倚。应该选择同时影响处理分配与结果的混杂变量,并通过平衡性检验验证效果。
为何常见:机器学习给我们的直觉是特征越多模型越好,但因果推断关心的是识别路径,而不是纯预测精度。
面试题
Q1. 潜在结果框架中,“反事实”指的是什么?
- A.未能观测到的另一种处理结果← 正确答案
- B.历史数据中的真实结果
- C.随机实验中的安慰剂效应
- D.倾向得分模型的预测值
答案:A。潜在结果框架假设每个个体有 Y(1) 和 Y(0) 两个结果,现实只能观测到一个,另一个就是反事实。老王无法知道吃了肥的树如果没吃肥会多甜,这正是反事实。B 是已观测事实,C 是实验设计概念,D 与“潜在结果”无关。
Q2. 倾向得分 e(X) 的定义是?
- A.处理后结果的条件期望值
- B.给定协变量下接受处理的概率← 正确答案
- C.处理组与对照组均值之差
- D.未观测混杂变量的影响
答案:B。e(X)=P(T=1|X),它是“被选进处理组”的条件概率。A 是结果回归中的条件期望,C 是效应估计的朴素形式,D 与倾向得分不是同一个概念。好比一棵树“吃肥的概率”不等于它“吃了肥之后多甜”。
Q3. 随机化实验让处理效应估计更可信的主要原因是?
- A.保证样本量必定足够大
- B.让协变量在两组趋于可比← 正确答案
- C.让结果变量完全保持固定
- D.大幅减少数据采集工作量
答案:B。随机化让处理分配独立于所有协变量,包括观测到和未观测到的,因此两组在特征上可比。样本量、结果固定、数据采集量都不是随机化的核心意义。
Q4. 最邻近匹配的核心操作是?
- A.按结果变量从小到大排序
- B.按倾向得分距离找最近对照← 正确答案
- C.对每个协变量逐一找相似者
- D.直接删除所有缺失样本
答案:B。最邻近匹配在倾向得分这一维“尺子”上寻找距离最近的对照个体。它不按结果排序,也不是逐协变量匹配。删除缺失样本是数据处理清洗,与匹配无关。
Q5. 逆概率加权中,处理组个体的权重通常取?
- A.一除以该个体的倾向得分← 正确答案
- B.倾向得分除以未处理概率
- C.一减去该个体的倾向得分
- D.倾向得分乘以其观测结果
答案:A。IPW 中处理组权重取 1/e,对照组取 1/(1-e)。这能让加权后的伪总体近似随机分配。B、C、D 都不是标准权重公式,也无法起到平衡协变量的作用。
Q6. 标准化差异小于多少常视为协变量已平衡?
- A.0.01 以下
- B.0.10 以下← 正确答案
- C.0.50 以下
- D.1.96 以下
答案:B。标准化差异 |d|<0.10 是经验阈值。它不是 p 值,也不受样本量影响。0.01 过于严格,0.50 和 1.96 都说明两组差异过大。
Q7. 双重稳健估计的核心含义是?
- A.结果回归与倾向得分模型只需一个正确← 正确答案
- B.结果回归和倾向得分模型都要成倍增大样本
- C.两个模型必须同时完全正确才可用
- D.该方法仅适用于随机对照实验
答案:A。双重稳健估计把结果回归模型和倾向得分模型结合起来,只要其中至少一个模型设定正确,处理效应估计就是一致的。B 与样本量无关,C 说反了,D 错误因为它恰恰是为了处理观测性研究。
Q8. 倾向得分匹配正式估计前,通常需要确认哪些条件?
- A.两组倾向得分分布具有重叠← 正确答案
- B.相关协变量已被观测记录← 正确答案
- C.结局变量必须服从正态分布
- D.处理变量必须是连续型变量
答案:AB。共同支撑区和可忽略性(观测充分协变量)是使用倾向得分的前提。结局变量不需要正态分布,倾向得分匹配通常要求处理变量是二值的,D 说反了。
Q9. 下列哪些做法有助于降低倾向得分估计的偏差?
- A.纳入同时影响处理与结果的变量← 正确答案
- B.剔除倾向得分过极端的样本← 正确答案
- C.匹配时设置合理的卡钳限制← 正确答案
- D.只用一个协变量来建模
答案:ABC。纳入混杂变量、修剪极端得分、设置卡钳都是常见优化手段。只用单一协变量会忽略其它混杂,反而增加偏倚,因此 D 不正确。
Q10. 当倾向得分共同支撑区过窄时,正确的态度包括?
- A.只在与对照相似的处理个体上报告效应← 正确答案
- B.把所有个体强行匹配并给出唯一因果效应
- C.在结论中明确说明无法外推的边界← 正确答案
- D.完全放弃所有外推与内部效度
答案:AC。共同支撑区窄意味着很多个体找不到相似的对照,此时应在重叠区内报告效应,并明确研究结论不能外推。强行匹配会引入巨大外推偏差,完全否定方法也过于极端。A 和 C 是更审慎的做法。