診斷準確度研究
敏感度與特異度是檢驗的性質,但它們的數值取決於你收了誰、驗了誰——本章用實跑數字示範兩種讓好檢驗看起來更好的偏誤,以及為什麼同一個檢驗在不同科別會給出差三倍的敏感度。
這一章與方法頁的分工
敏感度、特異度、概似比、ROC 曲線怎麼算與怎麼讀,在方法頁(B4 那一組)。
這一章問的是設計層次的問題:這些數字是從哪一群人身上得到的、有誰被排除、 參考標準本身可不可靠。因為診斷準確度最麻煩的地方在於——
參考標準:整個研究的地基
診斷準確度研究把待測檢驗的結果與參考標準(reference standard,舊稱 gold standard)比對。 所有數字的意義都建立在「參考標準是對的」這個前提上。
實務上這個前提從來不是完全成立的:
| 情況 | 後果 |
|---|---|
| 參考標準本身有誤差 | 待測檢驗的準確度通常被低估(它答對但被判成錯);但這要在兩者的誤差彼此獨立時才成立,誤差相關時偏誤可能反向(見下方 incorporation bias) |
| 參考標準是侵入性的(切片、血管攝影) | 不可能對每個人都做 → 見下一節的驗證性偏誤 |
| 沒有單一參考標準 | 得用綜合參考標準(多項檢查加臨床追蹤的共識),但那本身就可能納入待測檢驗 |
| 參考標準的判讀者知道待測檢驗結果 | 判讀被污染,兩者的一致性被人工抬高 |
驗證性偏誤:只驗陽性的人會怎樣
最常見的設計妥協是:參考標準太侵入或太貴,所以只對待測檢驗陽性的人做。 陰性的人直接當作沒病。這叫驗證性偏誤(verification bias,或 work-up bias)。
它的方向是可以推導的,而且用同一份資料模擬就能看到。下表是把「陰性者接受參考標準的比例」 從全部驗證逐步降到只驗證一成時,算出來的表面敏感度與特異度:
| 陰性者被驗證的比例 | 預期接受參考標準的人數 | 表面敏感度 | 表面特異度 |
|---|---|---|---|
| 100% | 113.0 | 0.634 | 0.806 |
| 70% | 91.1 | 0.712 | 0.744 |
| 50% | 76.5 | 0.776 | 0.674 |
| 30% | 61.9 | 0.852 | 0.554 |
| 10% | 47.3 | 0.945 | 0.293 |
(人數欄是期望值,不是某一次抽樣的結果——腳本直接把比例乘上陰性人數,所以會出現小數。)
真值固定在敏感度 0.634、特異度 0.806。 只驗證一半的陰性者時,表面敏感度爬到 0.776、 特異度掉到 0.674。
那張流程圖長這樣:
figures/scripts/D4-stard.R三個待測檢驗結果各自分出「有做參考標準」與「沒做參考標準」兩格:陽性的 214 人裡 205 人做了,陰性的 590 人裡只有 236 人做了,剩下 354 人(紅框那一格)沒有。上表最左邊那一直行「陰性者被驗證的比例」指的就是這一格與它左邊那一格的比值——這張圖是 40%,落在表中 50% 與 30% 兩列之間。
圖裡的 2×2 也只畫在「有做參考標準」底下——而且還不是全部。接受待測檢驗的 822 人裡,有 455 人做了參考標準,但 2×2 表是建在 441 人身上:那 14 位結果不確定者雖然也做了參考標準,卻沒有格子可放——不確定既不是陽性判讀也不是陰性判讀,STARD 要求把它們單獨報出來,不要併進任何一直行。這件事本身就是重點:論文報出來的敏感度與特異度,分母是 441 人,讀者要自己把它找出來相減,才知道被留在表外的是誰——367 位從未被驗證的,加上 14 位驗證了卻算不進去的。
還有一個較溫和的變形叫差別驗證偏誤(differential verification bias):檢驗陽性的人做侵入性的參考標準, 檢驗陰性的人則做一個較弱的參考標準——例如臨床追蹤,或另一項影像檢查。沒有人沒被驗證, 所以流程圖看起來是完整的,但兩群人並不是用同一把尺量的。這與只驗陽性的偏誤不是同一件事, 方向取決於那個較弱的標準怎麼誤判:追蹤如果漏掉進展緩慢的病例,那些人會被記成真陰性、敏感度被抬高; 反過來過度判定則相反。抓它的問題就是 QUADAS-2 直接問的那一句——是不是每一個病人都接受了同一個參考標準?
光譜效應:同一個檢驗,差三倍的敏感度
把同一份資料依疾病嚴重度(WFNS 分級)切開,同一個檢驗、同一個切點:
| 族群 | n | 有病 n | 沒病 n | 盛行率 | 敏感度(95% CI) | 特異度(95% CI) |
|---|---|---|---|---|---|---|
| WFNS 1-2 | 71 | 14 | 57 | 19.7% | 0.286(0.12–0.55) | 0.947(0.86–0.98) |
| WFNS 3-5 | 42 | 27 | 15 | 64.3% | 0.815(0.63–0.92) | 0.267(0.11–0.52) |
輕症族群的敏感度是 0.286,重症族群是 0.815—— 差了將近三倍,而且兩個信賴區間不重疊。特異度則是反方向。
特異度為什麼反過來掉?一個合理的解釋是:WFNS 分數較高的那一層裡,連「結果好」的個案腦部受損也比較嚴重,S100β 因此偏高,於是更常跨過同一個切點、被判成偽陽性——沒病的人裡被誤判的比例上升,特異度就掉下來。這是依分層資料與標記濃度的關係提出的合理解釋,不是這份資料能證實的因果機制:要證實它,得直接比較兩層裡「結果好」個案的 S100β 分布,而不是只看準確度指標。
表裡新增的兩欄也提醒了分母的來源:敏感度的精確度只由「有病 n」決定,特異度只由「沒病 n」決定。重症那層只有 15 個沒病的人,它的特異度信賴區間因此寬到幾乎沒有資訊量——這個下降有多少是真的、有多少是抽樣雜訊,這份資料分不出來。
這叫光譜效應(spectrum effect)。原因很直白:病得重的人生物標記濃度高,比較容易被驗出來; 而「健康對照」如果收的是完全沒症狀的人,也比較容易被判成陰性。
樣本量:信賴區間會告訴你夠不夠
上表也示範了另一件事:輕症那組的敏感度信賴區間是 0.12 到 0.55——寬到幾乎沒有資訊量。 那組只有 14 個有病的人,敏感度的分母就是這個數字。
診斷準確度研究的樣本量取決於病例數與對照數,不是總人數。 一個收了 1000 人但只有 20 個確診的研究,敏感度的精確度就是由那 20 個人決定的。
設計上的選擇
| 設計 | 做法 | 優點 / 風險 |
|---|---|---|
| 連續納入(consecutive) | 把符合條件的病人依序全收 | 最接近臨床實況,光譜完整;慢、貴 |
| 兩組式(two-gate) | 分開招募確診者與健康對照 | 快、便宜;準確度系統性高估,見上一節 |
| 巢式於世代 | 在既有世代裡取樣 | 光譜合理且效率高;受限於世代原本收了什麼 |
| 隨機化的診斷試驗 | 隨機分配到不同檢驗策略,比較臨床結果而非準確度 | 唯一能回答「用這個檢驗病人會不會比較好」的設計 |
盲性
三個方向都要盲:
- 待測檢驗的判讀者不知道參考標準的結果
- 參考標準的判讀者不知道待測檢驗的結果
- 兩者都不知道其他臨床資訊(除非那些資訊在實務上本來就會有——那就要說明)
影像與病理這類需要人判讀的檢驗,這一點特別關鍵,而且要報判讀者之間的一致性——通常是 kappa,而它有一個很容易踩的性質:一致率相同的兩份資料,只因為異常判讀的盛行率不同,kappa 可以差三倍。
常見誤用
| 誤用 | 為什麼錯 |
|---|---|
| 只對陽性者做參考標準,陰性者當作沒病 | 驗證性偏誤:同時高估敏感度、低估特異度 |
| 參考標準的定義裡包含待測檢驗 | Incorporation bias,系統性高估 |
| 用「確診病人 vs 健康志願者」做研究 | 兩組式抽樣,光譜兩極,準確度大幅高估 |
| 把某研究的敏感度直接套用到自己的病人 | 光譜效應:同一檢驗在不同嚴重度族群可差三倍 |
| 報敏感度不報信賴區間 | 分母是病例數,常常小到區間寬得沒有資訊量 |
| 拿準確度當作「病人會受益」的證據 | 需要以臨床結果為終點的試驗 |
| 判讀不設盲 | 兩個結果互相污染,一致性被人工抬高 |
| 在同一份資料上挑最佳切點再報準確度 | 樂觀偏誤,切點需要獨立驗證 |
這一章的數字從哪來
本頁引用的數字全部來自方法頁 B4-01 與 B4-02 的分析腳本:
/opt/homebrew/bin/Rscript figures/scripts/B4-01-sens-spec.R
/opt/homebrew/bin/Rscript figures/scripts/B4-02-ppv-npv.R
/opt/homebrew/bin/Rscript figures/scripts/D4-stard.R
第三支腳本只產 STARD 流程圖與它的 figures/out/D4-stard.stats.json;那個檔標了 hypothetical: true,因為圖裡的人數是為了示範結構而構造的假設值,不是從 pROC::aSAH 量出來的——那份資料每個病人都做了參考標準,畫不出未驗證的那條分支。
讀讀看這張圖
答案取自產生本頁圖表的同一份統計輸出,不是另外打上去的。
只對檢驗陽性的人做參考標準、陰性的人直接當作沒病。表面敏感度與表面特異度會往哪個方向動?
看答案與解析
正確答案: 敏感度被高估、特異度被低估。只驗一半的陰性者時表面敏感度爬到 0.776
沒被驗證的陰性者裡,真陰性遠多於偽陰性——那正是「檢驗有一定準確度」的意思。把他們整批排除,等於從特異度的分母裡拿掉大量真陰性,於是表面特異度掉到 0.674;同時敏感度的分母也少掉了偽陰性,表面敏感度爬到 0.776。真敏感度自始至終是 0.634,檢驗本身沒有變,變的是被算進去的人。所以這兩個指標動的方向相反,不是一起變差。第三個說法錯在「敏感度的分母不受影響」:偽陰性是有病而檢驗陰性的人,他們正好落在被略過驗證的那一群裡。這個偏誤在論文裡不會標示自己,只能從「有多少人接受了參考標準」這個數字去推,那正是 STARD 流程圖存在的理由。
同一份資料依疾病嚴重度切成兩層,同一個檢驗、同一個切點,兩層的敏感度差了將近三倍。這說明什麼?
看答案與解析
正確答案: 說明敏感度依賴收了哪些病人。重症那層的敏感度是 0.815,病得重的人標記濃度高,比較容易跨過同一個切點
敏感度與特異度不隨盛行率改變,所以 0.197 那個說法把兩件事混在一起了。它們依賴的是被檢驗的人是誰:0.286 與 0.815 來自同一個檢驗、同一個切點,差別只在一邊是輕症、一邊是重症。這也不是量測不穩定——病得重的人標記濃度高,本來就比較容易跨過切點,那是可預期的方向,不是雜訊。這正是為什麼「確診病人對健康志願者」那種兩極設計的準確度會非常漂亮卻用不上:它回答的是能不能分辨重症與健康人,而臨床上的問題是面對一個症狀不明確的病人時這個檢驗幫不幫得上忙。順帶一提,重症那層只有十幾個沒病的人,它的特異度信賴區間寬到幾乎沒有資訊量。
輕症那層的敏感度信賴區間寬到幾乎沒有資訊量。決定這個寬度的是哪一個數字?
看答案與解析
正確答案: 有病的人數 14——敏感度的分母只有有病的人
敏感度是「有病的人裡被驗出來的比例」,分母只有有病的人。輕症那層有 71 人,但其中只有 14 個有病,敏感度的精確度就由這 14 個人決定;剩下的 57 個沒病的人只影響特異度。所以一個收了一千人卻只有二十個確診的研究,敏感度的精確度就是那二十個人的精確度。這也是為什麼診斷準確度研究報樣本量時,要報病例數與對照數,而不是總人數——總人數看起來大,跟你要的那個指標可能沒有關係。
示範的 STARD 流程圖裡,接受待測檢驗的有 822 人,做了參考標準的有 455 人,而 2×2 表建在 441 人身上。455 與 441 之間那個差額是什麼?
看答案與解析
正確答案: 是結果不確定的 14 人。他們做了參考標準,但不確定既不是陽性也不是陰性判讀
822 減 455 等於 367,那是從未被驗證的人,他們在更上一層就離開了。455 減 441 等於 14,那才是這一題問的差額:做了參考標準卻沒有格子可放的人。這兩群人都被留在 2×2 表外,但理由完全不同,而論文報出來的敏感度與特異度分母是 441,讀者要自己相減才知道誰不在裡面。354 是陰性分支裡沒被驗證的那一格,它是 367 的一部分,也是驗證性偏誤住的地方。把不確定的結果併進陽性或陰性任何一欄,都會讓那一欄的準確度被一群本來就分不出來的人拉動。
示範流程圖裡,檢驗陽性的 214 人幾乎全部做了參考標準,檢驗陰性的 590 人只有一部分做了。這個不對稱代表什麼?
看答案與解析
正確答案: 代表陰性那一支只有 236 人真的被驗證,其餘的人是被「當作」沒病,而不是被確認沒病
陽性那一支 214 人裡有 205 人做了參考標準,陰性那一支 590 人裡只有 236 人做了。這個不對稱正是部分驗證:沒被驗證的陰性者被當作沒病寫進表裡,而他們裡面本來就會有偽陰性。第二個說法錯在假設陽性分支能涵蓋所有有病的人——如果檢驗真的抓得到全部,就不需要做準確度研究了。第三個說法把絕對人數拿來比:陽性那支漏掉的是個位數,陰性那支漏掉的是三百多人,不對稱的程度正是這裡的重點。讀論文時要做的是同一件事——把接受參考標準的人數跟納入人數相減,然後問剩下的人是怎麼被處理的。
主分析的敏感度附了一個 95% 信賴區間。這個區間的寬度告訴讀者什麼?
看答案與解析
正確答案: 敏感度的下界只到 0.481,這份資料無法排除每兩個有病的人就漏掉一個
0.634 是點估計,它不告訴你這份資料能排除什麼。下界 0.481 才是要看的地方:這份資料容得下「有病的人裡只有不到一半被驗出來」。0.700 是特異度的下界,而特異度的分母是沒病的人——這個世代裡沒病的人比有病的人多,所以特異度的區間本來就比較窄,兩個指標的精確度不會一樣。報敏感度而不報信賴區間,等於把一個由幾十個人決定的估計呈現成一個確定的數字。
本章用到的統計方法
延伸觀看
Cohort Studies: A Brief Overview素材來源與授權
- STARD 2015: an updated list of essential items for reporting diagnostic accuracy studiesCC BY本章的節次順序依 STARD 2015 的項目編排,文字為原創改寫。