☰
真实世界研究如何用倾向得分实现组间均衡?匹配与IPTW实操解析
2026/9/30 3:19:57 网站建设 项目流程

做观察性研究的同行应该都经历过这种绝望:数据整理了大半年,统计检验做了好几轮,结果审稿人一句“两组基线不齐,结果可能有偏”直接打回。要说随机对照试验是金标准,可很多临床问题根本做不了RCT,只能用真实世界数据、病例队列、注册登记数据硬着头皮上。这时候,倾向得分方法就是最趁手的工具。BMJ最近发表了一篇方法学论文,专门讨论怎么用倾向得分把非随机研究的组间均衡真正做到位、做扎实。这篇解读我会把论文里的核心策略拆开讲,同时把我自己在实操中踩过的坑、试过的参数、觉得好用的流程一并放进来,给做临床研究、流行病学分析以及真实世界证据评估的朋友一个可以直接参考的版本。

先说清楚这篇解读适合谁。如果你是临床医生,想在自己的队列数据里比较两种治疗方案,那倾向得分匹配(PSM)和逆概率加权(IPTW)的思路你需要吃透;如果你是流行病学或者生物统计方向的研究生,刚接触观察性研究的因果推断,这篇可以帮你绕过不少弯路;如果你在药企或者科研院所做真实世界研究,要应付监管或审稿对偏倚控制的追问,那均衡性诊断和敏感性分析的部分值得细看。BMJ这篇论文最有价值的地方不是提出了什么玄乎的新模型,而是把“如何让观察性研究两组真正可比”这件事拆成了一系列可以执行的动作。

1. 为什么“均衡可比”是观察性研究的生死线

1.1 随机化带来的不是运气,而是“未知均摊”

随机化在研究中被神化太久了,很多人以为它的作用就是“碰运气”。实际上随机分配的真正效果是把所有协变量——包括你知道的和根本没想到的——在两组的分布都变为可比较的。处理组的平均年龄略微大一点,对照组男性比例稍微高一点,这些都只是随机误差,不会系统偏向某一边。观察性研究没有这个保护机制,选择接受某种治疗的患者往往年龄更大、合并症更多、预后更差。如果不做任何处理,直接比较两组的结局,那你看到的“关联”很可能只是混杂因素在背后起作用。

这就像你想比较两条通勤路线上班的用时,但一条路线主要被住在老城区的老司机选,另一条被新手集中使用。最后测出来的时间差,根本不代表道路本身好坏。观察性研究里的“老城区司机”就是那些影响治疗选择的患者特征,混杂就是这么来的。

1.2 倾向得分:把几十个混杂变量压成一个数

Rosenbaum和Rubin在1983年提出的倾向得分定义本身非常简单:给定一组可测量的协变量X,个体接受处理Z的概率P(Z=1|X)。这个概率值就被称为倾向得分。它的精妙之处在于“降维”——原来可能需要匹配年龄、性别、分期、合并症指数等十几个变量,维度一高,匹配就变得困难甚至不可能。但如果把所有这些变量压缩成一个倾向得分,那么理论上倾向得分相同或者接近的两个个体,他们整套基线特征是相似的。

这一点不是拍脑袋想的,它有扎实的理论基础:在给定倾向得分(也就是给定e(X))的条件下,处理分配和这些协变量集合是条件独立的。换句话说,你不需要逐个调整每一个协变量,只要把倾向得分这一维控制住,协变量在两组的分布就会趋向平衡。这就是为什么这个工具能流行几十年,尤其是在RCT不可行、又必须回答因果问题的场景下。

1.3 BMJ这篇论文,其实在回答四个问题

BMJ这篇方法学论文最让我欣赏的,是它不跟你绕弯子。它把利用倾向得分实现组间均衡的过程拆成了四个必须回答的问题:

第一个,倾向得分模型里究竟应该放哪些变量?放少了漏掉混杂,放多了引入不必要的噪声和偏倚。第二个,得到倾向得分之后,用匹配、加权、还是分层?不同策略背后的效应估计目标是不一样的。第三个,怎么判断“均衡”已经实现?很多人用P值判断,论文明确指出这在逻辑上是错位的。第四个,如果存在未测量混杂,怎么办?倾向得分有自己的边界,论文讲的是如何通过设计层面的手段去补充。

这四个问题恰好对应实际操作中每一步的关键决策。我见过太多研究在这几个问题上马虎:有的只报告了匹配前后P值的变化,有的倾向得分模型放进了一个术后变量(中介)还浑然不知,有的做完匹配后样本只剩原来的十分之一却默不作声。把这四个问题想清楚,论文的解读工作基本就完成了一半。

2. 匹配、加权、分层:三种倾向得分策略怎么选

2.1 倾向得分匹配:优先保住ATT,但样本在燃烧

配对是最直观的用法。处理组每个个体,在对照组里找一个倾向得分最接近的人搭配起来,然后只在配对样本中比较结局。这个方法默认估计的是处理组的平均处理效应(ATT),也就是“我关心的这批接受治疗的人,他们相对于一个虚构的、基线特征相同的未治疗群体的收益”。

匹配的关键参数是卡尺。卡尺就是允许两个个体倾向得分差多少以内才算匹配成功。卡尺太宽,配出来的对子基线相差大,均衡性差;卡尺太窄,匹配不上的人太多,有效样本量骤减。Austin的模拟研究给出了一个经常被引用的建议:卡尺取倾向得分logit变换值的标准差的0.2倍左右。怎么理解这个0.2倍呢?就是在你计算完所有个体倾向得分、取其logit值、再算出标准差后,乘以0.2,这就是卡尺宽度。我自己的经验是,在很多临床数据里这个数值大致在0.02到0.05之间,确实能兼顾样本保留量和均衡质量。

注意:匹配前一定要规范地设定卡尺,匹配后要报告有多少个体成功匹配上,多少被丢弃。如果丢弃比例太高,你就得考虑是不是两组倾向得分分布本身重叠得太少,这时候强行匹配出来的结果推广性很差。

2.2 逆概率加权:全样本保留,却可能被极端权重绑架

加权法的思路跟匹配完全不同。它不丢弃任何人,而是用倾向得分的倒数作为权重给每个人重新赋予“代表性”。处理组个体权重为1/倾向得分,对照组个体权重为1/(1-倾向得分)。本质上是制造一个所有人都有机会接受处理的伪人群,估计的是整个人群的平均处理效应(ATE)。

这个方法听起来很完美,但有一个致命副作用:当倾向得分非常接近0或1时,权重会爆炸到几百上千,个别极端体重主导整个分析,方差变大、估计不稳定。我之前跑过一个数据,检查权重分布时发现最大权重超过800,结果标准误大得离谱,结论根本没法看。

解决办法有几个:其一是对极端权重做截尾,比如把超过1%或99%分位数的权重强行压到该分位数值;其二是使用稳定化权重;其三是转换思维,如果倾向得分分离严重,就不该坚持ATE,可以改用ATT权重,处理组权重固定为1,对照组权重为倾向得分/(1-倾向得分),这样最极端那一批不重叠的个体的影响力会小很多。

2.3 分层和重叠权重:数据不重叠时最后的安全垫

分层法是把样本按倾向得分分为若干层(通常5层),每层内比较处理组和对照组,再汇总各层的效应。它使用方便,但层内均衡效果不稳定,对层数敏感,现在已经逐渐成为辅助方法。

我更想推荐的是近年来逐渐进入主流视野的“重叠权重”(overlap weight)。权重形式很漂亮:处理组个体权重为1-倾向得分,对照组个体权重为倾向得分。你可以理解为它给每个个体赋予了一个与“属于对侧”的概率成正比的权重,于是分析重心集中在两组倾向得分分布重叠最大的区域。这样做的好处是极端倾向得分个体的权重天然被压低,不需要截尾,估计稳定,而且对应的人群是“临床决策最相关”的模糊地带人群。

BMJ那篇论文对方法选择的表达其实很务实:没有哪一种方法绝对好,选择取决于你的研究问题、数据的重叠程度、样本量以及你想回答的是ATT还是ATE。如果研究目标聚焦在接受治疗的人身上,匹配很合适;如果希望结果能外推到整个研究人群,IPTW更对口径;如果两组重叠度不佳,重叠权重是最好的“安全垫”。

3. 一套可复现的实操流程(附R代码)

3.1 第一步:变量选择与缺失数据插补

这一步的重要性怎么强调都不为过。倾向得分模型里放哪些协变量,直接决定了均衡能达到什么水平。我遵循的原则非常简单:

放所有在基线时测量的、既影响处理分配又影响结局的变量,放那些在临床上有充分理由认为是预后因素的变量。性别、年龄、疾病严重程度、入院状态、合并症评分,这些常客都必须进模型。

严禁放干预后变量,比如住院期间的并发症、术后用药调整。一旦把这类变量放进去,你实际上在控制一条因果路径上的中介,可能导致处理总效应被错误拆解甚至引入偏倚。严禁放“撞击变量”,就是那些同时受处理和结局影响的变量。这需要你对临床机制有足够清楚的判断,不是统计软件能自动帮你做决定的。

缺失数据处理上,列表删除是最差选择,它会破坏“随机缺失”的假设且损失样本。多重插补是更稳妥的路线,先插补所有协变量,再拟合倾向得分,最后在每个插补数据集里分别做均衡性诊断并汇总结果。

3.2 第二步:拟合倾向得分模型,先别急着匹配

最常见做法是用logistic回归,处理指示作为因变量,基线协变量作为自变量,得到每个个体的预测概率。这里有两个容易被忽略的点。

第一,非线性问题。有些连续变量(比如年龄)对处理分配的影响不一定是线性的。可以直接加自然样条或者二次项,但不要让模型过于复杂。BMJ论文里也提到,过度复杂的倾向得分模型并不会带来额外的均衡收益,反而可能增大极端倾向分的出现概率。

第二,拟合完成后先看倾向得分分布。画一张处理组和对照组倾向得分的重叠直方图或者密度图。如果两条分布几乎完全分家,说明两组在临床特征上的差异太大,就算强行匹配,得到的也是高度选择过的样本。这一步是很多人跳过的,但它恰恰决定了后续方法选择的可行性。

3.3 第三步:匹配/加权,以及用SMD判断均衡

用R的MatchIt做匹配很方便。我常用的代码长这样:

library(MatchIt) library(WeightIt) library(cobalt) # 倾向得分匹配:1:1最近邻,卡尺设为logit倾向得分标准差的0.2倍 m_out <- matchit( treatment ~ age + sex + bmi + comorbidity + stage, data = dat, method = "nearest", distance = "glm", link = "logit", caliper = 0.2, ratio = 1 ) # 逆概率加权 w_out <- weightit( treatment ~ age + sex + bmi + comorbidity + stage, data = dat, method = "ps", estimand = "ATE" ) # 均衡性诊断:love plot love.plot(m_out, threshold = 0.1) love.plot(w_out, threshold = 0.1, weighted = TRUE)

cobalt包的love.plot会生成一个很直观的点图,每个协变量的标准化差异在图上横向排开,阈值0.1处画一条参考线,一眼就能看出哪些变量还没平衡。我每次做完匹配或者加权,第一件事就是跑这个图,比看一列P值管用得多。

注意:caliper = 0.2这个写法在MatchIt里实际是指定“倾向得分logit变换值的标准差的0.2倍”,并不需要你手工计算卡尺绝对数值。但理解背后的含义仍然很重要,不然你无法在审稿人问起时解释清楚为什么取这个值。

3.4 第四步:效应估计与报告呈现

匹配后数据,结局是连续变量时用配对t检验或者混合效应模型;结局是二分类变量时可以用条件logistic回归或者配对McNemar检验。加权的数据则使用加权回归或者加权GEE,标准误可以用稳健标准误(sandwich estimator)来修正。

结果报告部分,必须包含一张匹配前后协变量的标准化均数差(SMD)表或者Love plot、各组的倾向得分分布重叠图、匹配/加权前后的样本量变化。BMJ论文尤其强调报告分析方案的预设性:你是先预计用匹配还是加权,还是跑完所有方法挑一个最“好看”的结果?后者在方法学上站不住脚。我现在做这类分析都会预先写一段分析计划,就像写RCT方案一样,把方法、变量、卡尺、敏感性分析全部先定下来,再动手跑数据。

4. 审稿人最在意的细节:均衡性诊断与敏感性分析

4.1 SMD、Love plot、重叠度:一个都不能少

很多新手最爱用t检验或者卡方检验的P值来证明匹配后“没有差异”。这是老误区了。P值受样本量影响,且有“P>0.05不代表无差异”的逻辑问题。匹配后样本量可能变小,P值变大完全可能是样本不足造成的假象。均衡性诊断应当看标准化均数差(SMD),它的计算是两组均值差除以合并标准差,不受样本量摆布。SMD的阈值通常取0.1,超过0.1说明这个变量存在有意义的组间差异,需要处理。

还有一个常被忽略的诊断点:不仅要看一阶矩(均值),还要看连续变量的方差、偏态和高阶矩是不是也接近。有时候均值平衡了,但方差差异很大,说明分布形态不一致,配对本身的“可比性”仍然存疑。如果某个变量是分类变量,最好把各个水平都纳入检查,而不是只检查一个代表性指标。

4.2 负对照结局和E-value:给结论加一层防护

倾向得分只能平衡你已经测量到的变量,这是它天然的边界。可审稿人最喜欢问的就是:那没测到的混杂呢?为了回应这个问题,BMJ论文提供了两个层次的思路。

一是负对照结局。找一个理论上完全不受处理影响、但会受到相同混杂路径影响的结局变量。比如研究吸烟与心肌梗死的关系,你可以把“因车祸死亡”作为负对照结局。如果在处理组这个结局也显著偏高,说明存在残余混杂在作祟,你的主结果可信度就会打折。

二是E-value。这是一个非常简单却很有说服力的量:它回答的是“如果存在未测混杂,这个混杂要同时与处理和结局相绑到多强,才能把你观察到的效应完全解释成零?”假设你观察到的相对危险度RR是1.5,那么E-value的计算是:

E-value = RR + sqrt(RR * (RR - 1)) = 1.5 + sqrt(1.5 * 0.5) ≈ 2.37

意思是说,要推翻这个结论,未测混杂必须同时与暴露和结局的RR都达到2.37以上。在临床场景里,一个单变量能把两个方向的关联都拉到2.4以上,是比较罕见的。所以E-value越高,你的结论越稳。R里用EValue包可以直接算,报告时把E-value和置信区间下限的E-value一起呈现比较规范。

4.3 这篇论文强调的报告清单

BMJ论文的最后一个重要输出是一份“倾向得分研究报告清单”。我把它理解为观察性研究版的CONSORT清单,用来检查你是否说清楚了所有关键细节。每条都很实用:是否明确说明倾向得分模型的协变量清单及其来源?是否描述缺失数据的比例和处理方式?是否报告倾向得分分布的重叠情况?是否提供匹配或加权前后均衡性诊断的结果?是否明确效应估计的目标(ATE还是ATT)?是否报告了匹配卡尺、权重截尾等参数?是否做了针对未测混杂的敏感性分析?

我把这份清单打印出来贴在工位上,每次做真实世界研究就对照自查一遍。说句实话,大部分被审稿人要求重做的研究,问题都出在清单中某一条上。比如我曾经接到一个咨询案例,对方在方法部分写了“倾向得分匹配后两组均衡”,但全文没有一张SMD表,审稿人自然会怀疑。

5. 常见坑与我的排查经验

5.1 匹配后样本量断崖式下跌,还能救吗

这种情况我见得太多了。处理组300人,对照组5000人,1:1最近邻匹配后只剩下250对,虽然SMD看起来完美,但有效样本少得让人慌。处理思路有两种:一是把配比改成1:2甚至1:3,让每个处理组个体匹配多个对照,这样能保留更多的对照信息;二是将卡尺稍放宽到0.25或0.3倍标准差,先测一下SMD还能不能保持住。如果放宽后变量明显失衡,说明原本的卡尺是必要的,就会回来坚持用窄卡尺。

但如果匹配后样本量骤减到原来的不到三成,我建议认真考虑换加权法。尤其是当处理组样本本身有代表性不足的问题时,匹配后的结果只代表“那些能找得到对照的处理组个体”,外推性很弱,报告时需要特别说明。

5.2 权重分布爆炸,倒数处理也行不通?

IPTW权重爆炸的最直接检查方法就是看权重的均值和范围。理论上,注意权重均值应该接近1(因为是概率倒数)。如果均值偏离1太远,说明数据结构跟模型设定有明显冲突。这时很多人会很自然地想到做一个两端截尾,把特大权重压下来,但截尾会改变估计目标。截完尾之后,你报告的不再是严格意义上的ATE。

我的习惯做法是这样:先看倾向得分重叠度,如果重叠度很差,直接换重叠权重而不是截尾来凑数。如果重叠度还行,只是少数个体极端,再做1%和99%分位数的对称截尾,并在敏感性分析里比较截尾前后的结果。只要结果方向一致,楼是稳的;如果方向都变了,说明结论脆弱,写报告时最怕遇到这种情况。

5.3 未测混杂:能用工具解决吗

不少研究者到了最后一步问:我能用工具变量或者孟德尔随机化来解决未测混杂吗?理论上可以,但这属于另一个分析框架,难度跳跃太大。工具变量需要的假设(相关性、排他性、无直接效应)往往比倾向得分的可忽略性假设更难满足。与其在最后关头强行换框架,不如做扎实的负对照和E-value,同时坦率地在局限性里写明“不能排除残余混杂”。

我个人在实际操作中的体会是,BMJ这篇论文反复强调的并不是某种方法的数学优越性,而是一种研究态度:观察性研究要像设计随机对照试验一样,预先定好分析方案,过程中做足诊断,最后把局限讲透。用倾向得分方法追求“组间均衡可比”,不是把SMD全调成0.1以下就万事大吉了,而是要让审稿人和读者相信,你的比较确实建立在两组基线尽量一致的基础上。这些年我走过不少弯路,最大的长进就是学会了在跑匹配前先仔细看分布重叠图,不再一上来就咔咔匹配。最后再分享一个小技巧:所有倾向得分分析过程都可以写成一个R脚本一键重跑,这样不只是你自己方便,审稿人要求复现时你也能挺直腰板。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询