開檢查,不是為了盼它陽性
醫師開肌鈣蛋白檢驗時,她心裡問的並不是「這個病人是不是心肌梗塞」,而是「看了這個結果,我的判斷該修正多少」。這是兩個不同的問題。
檢查還沒開,她心裡已經有了一個估計。一位62歲男性,胸痛轉移到左臂,伴隨冒冷汗,急性冠心症的檢驗前機率很高;一位28歲女性,同樣的主訴,但她剛喝了三杯義式濃縮,檢驗前機率就很低。同一個肌鈣蛋白結果,對這兩個人的意義並不相同。第一位病人肌鈣蛋白輕微上升,印證的是她原本的懷疑;第二位病人出現同樣的結果,比較可能是偽陽性。檢查本身並不完美,而把一項不完美的檢查用在一個多半沒病的人身上,數學就不站在你這邊。
每一項檢查都有敏感度和特異度。敏感度說的是,疾病確實存在時,檢查有多常能把它驗出來;特異度說的是,對沒有這種病的人,檢查有多常能正確排除。沒有哪項檢查在這兩點上能做到100%。敏感度95%的檢查,仍會漏掉5%的真實病例;特異度90%的檢查,仍會把10%的健康人誤判為陽性。這些數字是檢查的屬性,不是病人的屬性。它們意味著,每一個結果都帶著不確定性,這份不確定性應該用來調整你的把握,而不是取而代之。
這就是貝氏推理。你從已知的病人狀況出發,得到一條新資訊,再依這條資訊有多可靠來修正估計。然後,拿下一條資訊再來一遍。
大多數臨床AI反其道而行
醫療領域的大多數AI系統,都是倒著推的。它們把一堆結果收攏起來,生命徵象、檢驗、診斷、用藥,回過頭去和訓練資料裡學到的模式比對。系統看到肌酸酐1.6、糖尿病史、用藥清單上有一種ACE抑制劑,便輸出「可能是慢性腎臟病」,因為在它訓練過的病例裡,這幾樣東西經常一起出現。
聽起來合情合理,直到你想一想它漏掉了什麼。系統不知道肌酸酐是在上升還是持平;不知道那種ACE抑制劑是為了保護腎臟還是為了降血壓;不知道這位病人兩年前肌酸酐還是0.9,此後一路穩定攀升;也沒有考慮到,在這個族群裡,尿液白蛋白檢驗有15%的偽陽性率。它只是拿眼前的一張快照去套歷史模式,然後貼上一張標籤。
換一位醫師來看同一個病人,她會往前推。她先依病人的年齡、性別和危險因子,定下慢性腎臟病的事前機率;再根據肌酸酐修正,但修正的幅度,取決於她對單次肌酸酐測量有多信任。她看趨勢,而不只看今天這個數字。她也會考慮那種ACE抑制劑,但在把它算作腎臟病的證據之前,會先問清楚為什麼開了它。每一條證據都會推動機率,而每一條證據的分量,都取決於它有多可靠。
回溯式的方法問:這看起來像什麼?前瞻式的方法問:在我們目前已知的一切之上,這條新資訊又說明了什麼?我們該信它幾分?
看見整個人,還是只看見結果
臨床訓練最早教你的道理之一,是治療病人,不是治療檢驗報告。溶血檢體裡的血鉀5.8,說明不了任何事;一個一路跑著趕來門診的病人,量出血壓160,也不等於高血壓。一個結果是訊號還是雜訊,取決於脈絡;而要掌握脈絡,就得認識今天這份病歷之外的那個人。
通用型AI處理的是結果。它讀數字,讀病程紀錄,讀編碼後的診斷,再根據文字模式給出輸出。這件事它做得很好:摘要一份出院病歷,比任何人都快;從雜亂的臨床文字裡擷取結構化資料,也不在話下。但它讀病歷的方式,就像你讀教科書裡的病例討論:一切都是事後。
即時面對病人的醫師,做的是另一件事。她在不確定之中推理,順著時間往前走,每來一條新資訊就修正一次評估,並依自己對這條資訊的信任程度加權。她知道,低風險病人的D-dimer陽性多半是偽陽性;她知道,胸部X光正常並不能排除早期肺炎。事前機率一直放在她心裡,每多一項發現就調整一次,不是等量地調,而是依每項發現的診斷價值按比例地調。
我們打造Chroneme時,想讓系統像她那樣推理,而不是像搜尋引擎那樣。往前推,而不是往回套。每多一條證據就更新一次機率,並依這條證據實際的可靠程度加權。
實際上怎麼運作
一位58歲的第2型糖尿病男性來做例行檢驗。依年齡、性別和糖尿病診斷,他罹患慢性腎臟病的基線機率落在某個水準。不是零,因為糖尿病是慢性腎臟病的首要成因;也不高,因為他沒有症狀,過去也沒有任何腎臟方面的異常。
他的肌酸酐結果是1.2。嚴格說來仍在正常範圍,但比上一次高。系統隨之更新,但幅度不大,因為單次肌酸酐輕微上升的診斷價值有限。就慢性腎臟病而言,單次肌酸酐的敏感度和特異度,單獨拿出來看都不算強。
十個月後,他的肌酸酐升到1.4,eGFR掉到60以下。這一次更新的幅度更大,因為eGFR低於60對慢性腎臟病的診斷價值高得多。不只如此,系統還看到了靜態模型看不到的東西:軌跡。肌酸酐不只是偏高,它上升的速度,照這樣推算下去,會進入令人擔憂的範圍。
又過了一年,出現了蛋白尿。此時的機率已經高到需要採取行動。但臨床上真正要緊的是:早在蛋白尿出現之前幾個月,系統就已經在標記這位病人了。不是斬釘截鐵,而是一個正在攀升、值得留意的機率。審閱病歷的醫師能看到每一次更新,看到它因何而起,再決定自己是否認同。如果她認為那種ACE抑制劑是為了降血壓而開、並非為了保護腎臟,她可以在自己的臨床判斷裡給這個因素換一個分量。系統攤開它的推理,她運用她的判斷。
軌跡本身就成了證據,無須仰賴任何一個單獨的數字。
為什麼這攸關信任
神經網路說「罹患慢性腎臟病的機率為73%」時,你沒辦法問為什麼。這個數字來自數以百萬計的參數,而這些參數並不對應任何臨床概念。醫師不可能看著它說:「肌酸酐那部分我同意,但用藥史你看得太重了。」根本沒有肌酸酐那部分,也沒有用藥那部分,只有一個數字。
貝氏系統說73%時,醫師可以問為什麼。她能看到是哪些證據推動了機率,各推動了多少;她可以對某一個具體因素提出異議,運用自己的判斷。臨床AI要真正改變醫療照護,靠的就是這樣的對話。沒有它,輸出只是一句斷言;有了它,輸出才是一番論證。
我們向一位腎臟科醫師展示這套系統時,他把這一點說得很透徹。他看完一位病人的證據鏈,說大部分他都認同,但有一個因素被看得太重,因為實際的處方情境和系統假定的並不一樣。他說得沒錯。而他能提出這樣的觀察,點出具體是哪個因素,拿出自己的專業判斷,這正是臨床決策支援應該做到的。換成黑盒子,他會得到同樣的機率,卻無從展開這場對話。
我們不迴避的限制
貝氏推論假定,在給定疾病的條件下,各項證據彼此獨立。可是在臨床醫學裡,它們往往並不獨立。在慢性腎臟病中,肌酸酐和蛋白尿就是相關的。這是一個已知的限制,如何完美解決,至今仍是這個領域懸而未決的難題。
輸出好不好,取決於證據權重準不準。有些權重在已發表的文獻裡早有定論,另一些則是近似值,需要我們透過驗證不斷修正。校準是一項持續的工作,我們不假裝它已經完成。
貝氏推論擅長處理結構化、可量化的證據:檢驗、生命徵象、用藥、編碼診斷。面對非結構化的病程紀錄和病人自述的症狀,它就沒那麼得心應手。所以,針對不同類型的臨床資料,我們用不同的方法,讓工具去配合問題。
我們選擇貝氏推論,是因為它本來就是醫師思考的方式。一位好醫師憑直覺做的事,系統把它形式化,再大規模地、對每一位病人、不間斷地做下去。僅此而已。沒有魔法,只是把臨床推理背後的那套數學清清楚楚地寫了出來。
