设想你是篮球俱乐部的数据分析师。教练推出了一款新训练饮料,A 队喝了,B 队没喝,一百天后要比较两队的场均得分。可问题来了:A 队个个是两米以上的高个,B 队平均只有一米八五,你直接比较两队的平均提升,就像让职业球员和业余爱好者比赛投篮——不管饮料有没有用,A 队天生更强。因果推断的解法是“找影子”:给 A 队每个球员,在 B 队里找一个身高、速度、位置都相似的“镜像对手”,然后只比较这些配对。但影子的前提是“找得到”。共同支撑域(common support)就是那个“找得到影子”的区域——它是处理组与对照组在“进组概率打分”分布上的重叠区间。只有落在这个区间里的个体,才存在真正可比较的对照伙伴。如果某个 A 队球员高到离谱,B 队里根本没有相似的人,那么关于他的一切比较都只能靠“想当然”的外推。这篇文章会带你认识这个区域、它为什么决定因果结论的生死,以及修剪、加权这些把它拉回正轨的补救手段。
职业价值:掌握共同支撑域的判断与处理,是因果推断工作“能落地”与“只停留在纸面”的分水岭——政策评估、医学统计等岗位的资深评审一眼就能看出你是否处理过这个问题。
目录
可视化演示
展示内连接、左连接、右连接和全外连接四种JOIN操作,高亮匹配行并显示连接结果表。
本节配有交互动效(进入视口后自动加载,约 3KB)。
SQL JOIN操作 匹配行 未匹配行 A JOIN B ON A.id=B.id 内连接仅返回匹配行
概念定义:两队都够得着的“有效对抗区”
篮球教练很快发现,直接比较均值不可信。于是他定下规矩:每个 A 队球员,必须从 B 队里挑一个“镜像对手”——身高差不超过 3 厘米、百米速度差不超过 0.2 秒。A 队的中锋身高 2.18 米,找遍全队,B 队最高的替补只有 1.96 米,没人配得上他。教练只好宣布:这个中锋退出本次评估。这里的“配得上”就是共同支撑域的直觉——两个组里都存在相似个体的那部分样本空间。
在因果推断里,我们不说身高和速度,而说协变量 X(年龄、收入、病情严重程度等)。共同支撑域的定义是:在给定 X 的条件,个体既可能被分到处理组,也可能被分到对照组——也就是说,两组都能为这个 X 值提供“参照物”。用数学语言写出来:
这里 Z=1 表示接受处理,P(Z=1|X) 就是下文的倾向得分。这个式子要求:不管 X 取什么值,个体被分进处理组的概率必须严格大于 0 且严格小于 1。如果某个特征的个体百分之百进处理组(概率为 1),对照组就永远没有这种特征的人,支撑域把这个点排除在外。S 就是所有“两头都有人”的协变量取值组成的集合,只有 X∈S 的样本才进入后续匹配估计。
回到篮球场,共同支撑域就是 A、B 两队身高、速度分布重叠的“球员池”。中锋不在池子里,不是他不好,而是他无法被公平地评价。同样的,在因果推断中,如果一个样本不落在共同支撑域内,我们对它的因果效应只能保持沉默。
- 集合大括号$\mathbb{S} = \{ \cdots \}$ 表示“满足内部条件的全部 X 组成的集合”。
- 协变量 X$X$ 是描述个体的特征向量,如篮板球里的身高、速度,医学里的年龄、病情。
- 进组概率$P(Z=1 \mid X)$ 表示给定特征 X 时,个体进入处理组的条件概率。
- 严格开区间$0 < \cdots < 1$ 表示概率必须严格介于 0 和 1 之间,概率为 0 或 1 的极端个体被排除。
潜在结果框架:没有影子就无从比较
为什么非要找镜像对手?因为世间没有时光机。一个球员要么喝了新饮料(处理),要么没喝(对照),他不可能同时走两条时间线。教练想知道“如果中锋没喝饮料,得分会怎样”,这个问题的答案永远无法直接观测——我们只能请一个相似的替身,替他走一遍“没喝饮料”的路线。
这就是潜在结果框架的核心:对每个个体,定义两个潜在结果——处理状态下的 Y(1) 和对照状态下的 Y(0)。个体的因果效应是 Y(1)-Y(0),但我们只能观测到其中一个。政策制定者真正关心的往往是处理组的平均因果效应:
由于 Y(0) 对处理组个体是缺失的,研究者只能去对照组“借”一个结果来填充。借的前提是:存在与这个处理个体在协变量上足够相似的对照个体。如果这个人落在共同支撑域内,说明可以借;落在域外,手里的数据里根本没有可借的对象。此时任何估计器都得靠“脑补”,也就是外推。
镜像对手的意义就在于此:B 队球员的得分,就是 A 队球员“没喝饮料的世界”里最接近的替代品。而这个替代品是否合法,完全取决于 A 队球员是否站在共同支撑域内。影子找错了人,结论就不是“饮料的效果”,而是“饮料和天赋差距混在一起的效果”。
- 潜在结果$Y(1)$ 和 $Y(0)$ 分别是接受处理与不接受处理时的潜在结果,可以理解为“喝饮料后的得分”与“没喝饮料的得分”。
- 个体效应$Y(1)-Y(0)$ 是单个个体的因果效应,但现实中只能观测到其中一半。
- 期望算子$E[\cdot]$ 表示对所有满足条件的个体取平均,把个体差异“抹平”成总体结论。
- 条件限定$\mid Z=1$ 表示只在接受处理的群体内计算,不管对照组的事。
- 效应记号$\tau_{ATT}$ 读作“处理组平均处理效应”,是政策评估最常报告的指标。
倾向得分桥梁:把多维特征压缩成一把尺
身高、速度、弹跳、传球视野……要找一个多维都相近的影子对手极其困难。教练灵机一动:把每个球员的多个特征综合成一个“进 A 队的概率”打分。如果 A、B 两队里都有一批“进 A 队概率”差不多的人,就把他们两两配对,这比逐个维度比对聪明得多。
这个“进组概率”就是倾向得分。给定协变量 X,个体进入处理组(Z=1)的条件概率:
倾向得分的妙处在于“平衡性”:在倾向得分相同的个体之间,处理组与对照组的协变量分布趋于一致。因此,研究者只需要在倾向得分这一维上做匹配、分层或加权,就能近似达到多维匹配的效果。共同支撑域的检验,也顺理成章地变成:比较两组个体的 e(x) 分布重叠了多少。直方图和密度图因此成为最常用的诊断工具。
有了这把“进组概率”的尺子,教练不再逐个比较身高和速度,而是先看两队的打分分布是否重叠。打分组重叠的区域,就是前文所说的共同支撑域;分歧大的区域,影子无从谈起。
- 得分记号$e(x)$ 是倾向得分的标准记号,表示“这个特征的个体有多大概率被分进处理组”。
- 条件概率$P(Z=1 \mid X=x)$ 是在已知特征 $x$ 的条件下,个体进入处理组的概率。
- 处理指示$Z=1$ 表示该个体接受了处理,$Z=0$ 表示在对照组。
- 特征向量$X=x$ 表示协变量取具体数值,比如身高 180 厘米、年龄 30 岁。
支撑域过窄危害:外推的悬崖
赛季结束,教练发现:A 队球员的进队概率打分普遍在 0.7 以上,B 队普遍在 0.3 以下,两队几乎没有交集。这意味着两队根本不是同一类球员——比较变得像让航天员和厨子比赛颠勺。强行比较,得到的数字不是因果效应,而是两组“本来就不一样”的差距。
技术上讲,当支撑域过窄时,匹配估计的“最近邻”也相距很远。在近邻匹配中,处理组个体 i 找一个对照 j(i) 来模拟 Y(0),估计量写成:
若 i 的倾向得分周围没有对照样本,Y_{j(i)} 可能来自一个协变量完全不同的个体。这个“坏的邻居”把混淆偏差重新带进估计,使得估计值系统性偏离真实效应。更严重的是,支撑域过窄本身就是正定性假设(对每个协变量组合,两组都应有观测)被违反的信号。此时报告的因果效应无法推广到任何真实人群——它只对“假设存在但实际不存在”的虚构个体成立。
数据里的“无人区”就像球场上禁区外的真空带——没有对手、没有参照、没有评价。聪明的分析师不会硬闯,而是承认:在这片区域里,因果推断的探照灯照不亮。
- 帽子记号$\hat{\tau}_{ATT}$ 表示由样本估算出来的统计量,真实值永远不可知,只能逼近。
- 求和范围$i: Z_i = 1$ 表示只把处理组的个体纳入求和。
- 平均分母$n_1$ 为处理组的样本个数,求和后取平均。
- 真实结果$Y_i$ 是处理组个体 $i$ 实际观测到的结果。
- 镜像结果$Y_{j(i)}$ 表示给 $i$ 配的最相似对照 $j(i)$ 的结果,相减得到该个体的效应贡献。
修剪与加权策略:把游戏拉回公平
面对过窄的支撑域,教练做了两件事:第一,声明“进组打分低于 0.1 或高于 0.9 的球员不参与评估”,把极端个体移出比较名单——这叫修剪;第二,给那些“罕见地出现在对方阵营里的球员”更高的发言权重——这叫加权。
修剪直接划定有效比较区间:
通常取 α 为 0.05 或 0.1,只有倾向得分落在该区间的样本保留在估计中。加权则换一种思路:用倾向得分的倒数重新衡量每个样本的贡献,即逆概率加权(IPTW):
修剪的代价是损失样本量,收益是让估计只在“有支撑”的区域进行,减少模型外推;加权的逻辑是让每个样本代表与其倾向得分相似的人群:处理组个体权重 1/e(X_i),对照组权重 1/(1-e(X_i))。实际操作中,两者常结合使用,并且要变换修剪阈值做稳健性检验——如果阈值从 0.05 变到 0.1 时结论大幅翻转,说明估计对修剪很敏感,结论需要谨慎。
教练的新方案让评估只覆盖“两队都有人”的区域,谁的数据稀缺谁少说话,谁的数据被低估谁多说几句——数据说话的分量,终于和它代表的群体真实比例匹配上了。
- 处理组项$\frac{Z_i Y_i}{e(X_i)}$ 当 $Z_i=1$ 时生效,结果按倾向得分倒数放大。
- 对照组项$\frac{(1-Z_i)Y_i}{1-e(X_i)}$ 当 $Z_i=0$ 时生效,按未处理概率放大。
- 样本平均$\frac{1}{n}\sum_{i=1}^{n}$ 对全体样本各自求平均。
- 差值两项平均值相减就得到加权后的平均处理效应。
真实场景应用:支撑域的职场版图
篮球场上的纠葛每天都在真实世界重演:政府想知道补贴有没有促就业,药企想知道新药有没有降死亡率,电商想知道会员券有没有提转化。它们共同的特点,是处理组和对照组“长得不一样”。
政策评估中,参加职业培训的人往往比不参加的人更有上进心,协变量分布天然错位;医学研究中,重症患者更可能被分到新药组,轻症患者多在对照组;商业分析里,高活跃用户更容易获得优惠券。若两组倾向得分几乎不重叠,任何朴素比较都是把“人本身的差异”误判成“处理的因果效果”。
标准的操作流程是:第一步,估计倾向得分;第二步,绘制两组得分分布直方图或密度图,目测重叠程度;第三步,计算支撑域范围,报告落在域外的样本比例;第四步,对域外样本做修剪或加权,并报告修剪前后的效应估计差异;第五步,做敏感性与稳健性检验。这套流程已内置在许多开源工具中(如 R 的 MatchIt、Python 的 causallib),但工具只负责计算,判断是否进入支撑域、如何修剪,仍依赖分析师的领域知识。
三块球场的规则完全相同:先找一个共同支撑域,只在这个域里比较,并对域外的部分保持坦诚。谁遵守这条规则,谁得出的“因果结论”才不会在审稿人或老板的追问下崩塌。
AI 应用场景
政策评估:就业培训补贴效果
阶段:因果效应估计(观测数据因果推断)
解决的问题:参加培训者多为积极求职者,对照组多为佛系求职者,两组动机差异很大。若直接比较就业率,会高估补贴效果。先用倾向得分建模,再检查共同支撑域,只比较域内的可比个体。
具体案例:某省用行政数据评估“技能培训补贴对半年就业率的影响”,处理组 5 万人、对照组 50 万人。分析发现处理组倾向得分集中在 0.1~0.4,对照组集中在 0.05~0.5,重叠良好;但 0.4 以上几乎全是处理组,于是修剪掉该区域后再估计 ATT,结论比朴素估计低 18 个百分点。
医学研究:新药真实世界效果
阶段:观察性疗效比较(真实世界证据)
解决的问题:重症患者多进新药组、轻症多在标准组,病情严重度分布错位。共同支撑域检查能识别哪些患者无法比较,避免“新药救重症”被误读成“新药对所有人有效”。
具体案例:药企用电子病历研究某降糖药对心血管事件的影响,按倾向得分匹配后绘制密度图,发现 80 岁以上多并发症患者几乎只出现在新药组,属于域外。剔除后分析,结论从“显著降低风险”变为“仅对中低风险人群有效”。
商业决策:会员券对复购的影响
阶段:营销增益建模(Uplift Modeling)
解决的问题:高活跃用户更容易领到券,低活跃用户领不到,消费能力分布不重叠,朴素对比会把“用户本来就活跃”误判成“券有效”。
具体案例:电商发放满减券后,朴素分析显示消费提升 35%。倾向得分显示领券者的购买力打分普遍高于未领券者,共同支撑域只覆盖中等购买力人群。修剪后得出真实增益为 8%,运营据此重新设计了发券人群包,预算效率翻倍。
Python 演示
# 共同支撑域检测与修剪演示import numpy as npfrom sklearn.linear_model import LogisticRegression np.random.seed(42)n = 400x1 = np.random.normal(0, 1, n) # 能力分x2 = np.random.normal(0, 1, n) # 努力分X = np.column_stack([x1, x2])logit = 0.6 * x1 + 0.6 * x2 + 0.8p = 1.0 / (1.0 + np.exp(-logit)) # 真实进组概率z = np.random.binomial(1, p) # 处理分配 y0 = 2.0 + x1 - x2 + np.random.normal(0, 0.5, n)y1 = y0 + 1.5 # 真实处理效应=1.5y = np.where(z == 1, y1, y0) # 只能观测到一种潜在结果 model = LogisticRegression()model.fit(X, z)e = model.predict_proba(X)[:, 1] # 估计倾向得分 e_treat = e[z == 1]e_ctrl = e[z == 0]print("Treated PS range: [%.3f, %.3f]" % (e_treat.min(), e_treat.max()))print("Control PS range: [%.3f, %.3f]" % (e_ctrl.min(), e_ctrl.max())) low = max(e_treat.min(), e_ctrl.min())high = min(e_treat.max(), e_ctrl.max())print("Common support: [%.3f, %.3f]" % (low, high)) outside = (e < low) | (e > high)print("Outside support: %d (%.1f%%)" % (outside.sum(), 100.0 * outside.mean())) naive = y[z == 1].mean() - y[z == 0].mean()mask = ~outsidetrim = y[(z == 1) & mask].mean() - y[(z == 0) & mask].mean()print("True ATE: 1.500")print("Naive ATE: %.3f" % naive)print("Trimmed ATE: %.3f" % trim)
p = 1.0 / (1.0 + np.exp(-logit))用 Sigmoid 函数把线性组合压到 0~1,模拟真实进组概率。z = np.random.binomial(1, p)按真实概率做一次“抽签”,决定谁进处理组。y = np.where(z == 1, y1, y0)每个个体只保留他实际所处状态的结果,这就是缺失的反事实。e = model.predict_proba(X)[:, 1]用逻辑回归从协变量反推进组概率,即倾向得分。low = max(e_treat.min(), e_ctrl.min())取两组得分下限的较大者,作为共同支撑域下界。high = min(e_treat.max(), e_ctrl.max())取两组得分上限的较小者,作为上界。outside = (e < low) | (e > high)标记所有落在域外的样本,这些个体没有有效对照。trim = y[(z == 1) & mask].mean() - y[(z == 0) & mask].mean()修剪后重新估计 ATT,通常更接近真实效应。
常见误区
误区只要把实验做得够大,处理组和对照组肯定会有重叠,不需要专门检查共同支撑域。数据多了,什么分布都能覆盖到。
正解共同支撑取决于两组协变量分布的位置是否重合,与样本量无关。两组都很大但能力分布完全错开(一组全是学霸、一组全是学渣),重叠依然为零。样本量只影响重叠区域内的估计精度,不能创造重叠本身。就像把世界上最顶尖的 10 万人和没打过球的 10 万人放在一起,人数再多也不会出现“相似镜像对手”。
为何常见:人们习惯把“数据多”等同于“信息全”,忽略了分布位置错位这种结构性缺失。
误区修剪会把好不容易收集的数据扔掉,损失样本量,应该尽量保留所有样本做估计。数据是资产,扔了可惜。
正解域外样本本来就没有有效对照,它们对因果估计的贡献是偏差而非信息。保留它们相当于让航天员和厨子比赛颠勺,得到的是两组固有差异而非因果效应。修剪是对“不可比”的承认,不是浪费。
为何常见:做数据分析的人通常被教育“数据是资产”,丢弃数据在直觉上像浪费,但无效数据不构成资产。
误区随机化实验不需要关注共同支撑域,只有观测数据研究才需要考虑;随机分组天然保证两组处处重叠。
正解随机化大幅提高两组协变量平衡的概率,但不保证每个协变量组合下都有观测。小样本随机化仍可能出现部分区域无重叠;观测研究则几乎必然存在重叠不足问题。无论数据来源如何,做支撑域诊断都是标准动作。
为何常见:随机化常被神化为“完美实验”,让人们忽略小样本与偶然失衡的现实。
误区用逻辑回归算出每个样本的倾向得分,就等于处理好了共同支撑问题,接下来直接比较两组均值就行。
正解算出倾向得分只是第一步,更重要的是比较两组得分分布的形态和重叠范围。得分只是工具,重叠与否仍需单独检查分布图。若两组得分分布几乎无交集,说明模型识别不了足够的可比对照,需要修剪、加权乃至重新设计研究。
为何常见:把“建模完成”误当成“分析完成”,忽略了建模之后的诊断环节。
面试题
Q1. 潜在结果框架中,共同支撑域的本质是什么?
- A.两组倾向得分分布的重叠区间← 正确答案
- B.两组协变量取值的完整区间
- C.结果变量数值的分布区间
- D.处理组样本的全体区间
答案:A。共同支撑域特指处理组与对照组在倾向得分分布上的重叠部分,只有这里才存在有效反事实对照。B 是协变量全范围,C 是结果分布,D 只覆盖处理组,均不符合定义。
Q2. 处理组某样本倾向得分为 0.96,对照组最高仅 0.62,该样本怎么办?
- A.处于共同支撑域内可以正常匹配
- B.位于支撑域外找不到有效对照← 正确答案
- C.应当直接删除全部对照样本
- D.属于结果变量的异常值应剔除
答案:B。该样本的进组概率远超对照组上限,处于支撑域之外,没有任何对照组个体可作镜像对手。强行匹配等于外推,应修剪掉或在结论中说明其不适用。
Q3. 倾向得分 e(x) 的正确含义是什么?
- A.给定特征时进入处理组的概率← 正确答案
- B.处理效果优于对照效果的概率
- C.协变量能解释结果的方差比例
- D.样本属于处理组结果的概率
答案:A。e(x)=P(Z=1|X=x),是给定协变量 X 后个体进入处理组的条件概率。它不是效果优劣的概率,也不是方差解释比例,更不是结果的概率。
Q4. 支撑域过窄会对因果推断带来哪些危害?
- A.匹配时找不到相近的对照伙伴← 正确答案
- B.估计结果严重依赖模型外推← 正确答案
- C.处理组样本量会自动变大
- D.因果结论适用范围变窄← 正确答案
答案:ABD。支撑域过窄意味着缺少可比对照,估计只能靠外推,结论也仅适用于重叠区域。样本量不会自动变化,C 是误解。
Q5. 常用的修剪策略会保留哪些样本进入分析?
- A.倾向得分在 α 与 1-α 之间的样本← 正确答案
- B.倾向得分大于 0.5 的处理组样本
- C.匹配检验显著的全部样本
- D.结果变量位于均值附近的样本
答案:A。修剪的标准是保留 α < e(X) < 1-α 的样本,两头极端概率的个体因无对照而被剔除。显著性检验和结果变量位置与支撑域修剪无关。
Q6. 逆概率加权中,处理组个体的权重应为多少?
- A.倾向得分的倒数 1/e(x)← 正确答案
- B.倾向得分本身 e(x)
- C.对照组权重公式 1-e(x)
- D.与倾向得分无关的常数
答案:A。IPTW 中处理组权重为 1/e(x),对照组权重为 1/(1-e(x))。倾向得分低的处理组个体代表更多“想进组却没进”的人群,权重因此被放大。
Q7. 若某类个体进入处理组的概率恒等于 1,说明了什么?
- A.违反正定性且缺少有效对照← 正确答案
- B.该个体的处理效应必然为零
- C.倾向得分模型拟合得非常好
- D.共同支撑域覆盖了全体样本
答案:A。P(Z=1|X)=1 意味着给定特征 X 的个体必定进处理组,对照组永远没有此类人,正定性假设被违反,该区域无共同支撑。这与效应大小、模型拟合无关。
Q8. 下列哪项是诊断共同支撑域的常用手段?
- A.比较两组倾向得分密度图的重叠← 正确答案
- B.比较处理前后结果变量的平均差
- C.对结果变量执行正态性检验
- D.计算两组样本量的比例大小
答案:A。绘制两组倾向得分直方图或密度图、目测重叠区域是标准诊断手段。均值比较是看处理效应,正态性检验和样本量比例都与支撑域无关。
Q9. 两组数据“共同支撑不足”通常意味着什么?
- A.协变量分布之间的重叠太少← 正确答案
- B.研究样本的总数量太少
- C.处理效应在统计上不显著
- D.结果变量测量存在较大误差
答案:A。共同支撑不足的本质是两组协变量分布重叠太少,导致无法找到可比样本。样本量小可能加剧问题,但不是本质;它也不必然导致效应不显著或测量误差。
Q10. 反事实结果无法直接观测,研究者如何近似处理?
- A.在共同支撑域内寻找相似个体← 正确答案
- B.借用对照组的观测结果替代← 正确答案
- C.通过倾向得分匹配寻找镜像← 正确答案
- D.直接删除域内样本不做推断
答案:ABC。研究者通过在共同支撑域内寻找相似个体、借用对照结果、用倾向得分匹配等方式近似反事实。删除域内样本反而毁掉有效比较,D 错误。