开检查,不是为了盼它阳性
医生开一个肌钙蛋白,她心里问的并不是“这个病人是不是心梗”,而是“看了这个结果,我的判断该修正多少”。这是两个不同的问题。
检查还没开,她心里已经有了一个估计。一位62岁的男性,胸痛向左臂放射,伴有大汗,急性冠脉综合征的验前概率很高;一位28岁的女性,同样的主诉,可她刚喝了三杯浓缩咖啡,验前概率就很低。同一个肌钙蛋白结果,对这两个人的含义并不相同。第一位病人肌钙蛋白轻度升高,印证的是她原本的怀疑;第二位病人出现同样的结果,则更可能是假阳性,因为检查本身并不完美;把一项不完美的检查用在一个多半没病的人身上,概率天然就对你不利。
每一项检查都有灵敏度和特异度。灵敏度说的是,疾病确实存在时,检查有多大把握把它查出来;特异度说的是,对没有这种病的人,检查有多大把握正确排除。没有哪项检查在这两点上能做到100%。灵敏度95%的检查,仍会漏掉5%的真实病例;特异度90%的检查,仍会把10%的健康人误报为阳性。这些数字是检查的属性,不是病人的属性。它们意味着,每一个结果都带着不确定性,这份不确定性应当调整你的把握,而不是取代它。
这就是贝叶斯推理。你从已知的病人情况出发,得到一条新信息,再根据这条信息有多可靠来修正估计。然后,拿下一条信息再来一遍。
大多数临床AI反其道而行
医疗领域的大多数AI系统,是倒着推的。它们把生命体征、化验、诊断、用药这一堆结果收拢起来,回过头去和训练数据里学到的模式比对。系统看到肌酐1.6、糖尿病史、用药清单上有一种ACE抑制剂,便输出“可能是慢性肾病”,因为在它训练过的病例里,这几样东西常常一起出现。
听起来合情合理,直到你想一想它漏掉了什么。系统不知道肌酐是在升还是稳定;不知道那种ACE抑制剂是为了护肾还是为了降压;不知道这位病人两年前肌酐还是0.9,此后一路稳步攀升;也没有考虑到,在这一人群里,尿白蛋白检测有15%的假阳性率。它只是拿眼前的一张快照去套历史模式,然后贴上一个标签。
换一位医生来看同一个病人,她会往前推。她先根据病人的年龄、性别和危险因素,定下慢性肾病的先验概率;再根据肌酐修正,但修正的幅度取决于她对单次肌酐测量有多信任。她看趋势,而不只看今天这个数。她也会考虑那种ACE抑制剂,但在把它算作肾病的证据之前,先要问清楚为什么开了它。每一条证据都会推动概率,而每一条证据的分量,都取决于它有多可靠。
回顾式的方法问:这看起来像什么?前瞻式的方法问:结合目前掌握的全部情况,这条新信息说明了什么,我们又该信它几分?
看见整个人,还是只看见结果
临床训练最早教给你的道理之一,是治病人,不治化验单。溶血标本里的血钾5.8,说明不了任何问题;一个一路跑着赶来门诊的病人,量出血压160,也不等于高血压。一个结果是信号还是噪声,取决于背景;而要了解背景,就得知道今天这份病历之外的那个人。
通用AI处理的是结果。它读数字,读病程记录,读编码后的诊断,再根据文本模式给出输出。这件事它做得很好:总结一份出院小结,比任何人都快;从杂乱的临床文本里提取结构化数据,也不在话下。但它读病历,就像你读教科书里的病例分析。都是事后。
实时面对病人的医生,做的是另一件事。她在不确定之中推理,顺着时间往前走,每来一条新信息就修正一次评估,并按自己对这条信息的信任程度来加权。她知道,低风险病人的D-二聚体阳性多半是假阳性;她知道,胸片正常并不能排除早期肺炎。先验概率一直装在她心里,每多一项发现就调整一次,不是等量地调,而是按每项发现的诊断价值成比例地调。
我们打造Chroneme时,想让系统像她那样推理,而不是像搜索引擎那样。往前推,而不是往回套。每多一条证据就更新一次概率,并按这条证据实际的可靠程度来加权。
在实践中怎么运作
一位58岁的2型糖尿病男性来做常规化验。根据年龄、性别和糖尿病诊断,他患慢性肾病的基线概率落在某个水平上。不是零,因为糖尿病是慢性肾病的首要病因;也不高,因为他没有症状,以往也没有任何肾脏方面的异常。
他的肌酐结果是1.2。严格说来仍在正常范围,但比上一次高。系统随之更新,但幅度不大,因为单次肌酐轻度升高的诊断价值有限。就慢性肾病而言,单次肌酐的灵敏度和特异度,单独拿出来看都不算强。
十个月后,他的肌酐升到1.4,eGFR跌破60。这一次更新的幅度更大,因为eGFR低于60对慢性肾病的诊断价值高得多。不仅如此,系统还看到了静态模型看不到的东西:轨迹。肌酐不只是偏高,它上升的速度,照此推算下去,会进入令人担忧的范围。
又过了一年,出现了蛋白尿。此时的概率已经高到需要采取行动。但临床上真正要紧的是:早在蛋白尿出现之前几个月,系统就已经在标记这位病人了。不是言之凿凿,而是一个正在攀升、值得留意的概率。审阅病历的医生能看到每一次更新,看到它因何而起,再决定自己是否认同。如果她认为那种ACE抑制剂是为降压而开、并非为了护肾,她可以在自己的临床判断里给这个因素换一个分量。系统摆出它的推理,她运用她的判断。
轨迹本身就成了证据,无须依赖任何一个单独的数字。
为什么这关乎信任
神经网络说“慢性肾病的可能性为73%”时,你没法问为什么。这个数字来自数以百万计的参数,而这些参数并不对应任何临床概念。医生不可能看着它说:“肌酐那部分我同意,但用药史你看得太重了。”根本没有肌酐那部分,也没有用药那部分,只有一个数。
贝叶斯系统说73%时,医生可以问为什么。她能看到是哪些证据推动了概率,各推动了多少;她可以对某一个具体因素提出异议,用上自己的判断。临床AI要真正改变诊疗,靠的就是这样的对话。没有它,输出只是一句断言;有了它,输出才是一番论证。
我们给一位肾内科医生演示这个系统时,他把这一点说得很透。他看完一位病人的证据链,说大部分他都认同,但有一个因素被看得太重了,因为实际的处方背景和系统假定的并不一样。他说得对。而他能够提出这样的观察,点出具体是哪个因素,拿出自己的专业判断,这恰恰是临床决策支持应该做到的。换成黑箱,他会得到同样的概率,却无从展开这场对话。
我们不回避的局限
贝叶斯推断假定,在给定疾病的条件下,各项证据彼此独立。可在临床医学里,它们往往并不独立。在慢性肾病中,肌酐和蛋白尿就是相关的。这是一个已知的局限,如何完美解决,至今仍是这个领域悬而未决的难题。
输出好不好,取决于证据权重准不准。有些权重在已发表的文献里早有定论,另一些则是近似值,需要我们通过验证不断修正。校准是一项持续的工作,我们不假装它已经完成。
贝叶斯推断擅长处理结构化、可量化的证据:化验、生命体征、用药、编码诊断。面对非结构化的病程记录和病人自述的症状,它就没那么得心应手。所以,针对不同类型的临床数据,我们用不同的方法,让工具去适配问题。
我们选择贝叶斯推断,是因为它本就是医生思考的方式。一位好医生凭直觉做的事,系统把它形式化,再规模化地、对每一位病人、不间断地做下去。仅此而已。没有魔法,只是把临床推理背后的那套数学明明白白地写了出来。
