醫學統計及模型評估指標簡介

Sigrid C.
MDBros
Published in
9 min readAug 24, 2022
Photo by Khyta on Unsplash

醫療決定關乎性命、健康、生活品質,如果要把演算模型套用到活生生的病人身上,我們最好要能確認這個模型的效果,用來衡量的標準包含 Sensitivity、Specificity、Predictive Values、ROC Curves。

Source: DeepAI

你可能會好奇,為什麼推薦的衡量指標沒有 Accuracy 呢?首先我們來看看它的定義,準確分類的比例:「模型正確分類的病例數量」/「病例總數量」,舉例來說,10 個病人裡,8 個是正常的、2 個人有病。Model 1 預測所有人都沒病,準確度是 8 / 10 = 0.8;Model 2 正確把兩個病人分類成有病,但也把兩個沒病的人分類成有病,準確度同樣是 8 / 10 = 0.8。因此,這兩個模型的準確度是一模一樣的,但以你的直覺來看,你應該也會覺得 Model 2 比較可靠吧?至少它有嘗試要把健康和有病的人區分開來,不像 Model 1 直接無腦全猜沒病。

講到這裡,我們可以把 Accuracy 想成「正確的機率有多大」,並細分成兩個機率的總和:1️⃣ 有病且正確被分類、2️⃣ 健康沒病且正確被分類。接下來,我們要回憶高中時期學的條件機率,〖 A 且 B 的機率 〗=〖 在 B 條件下 A 發生的機率 〗X〖 B 的機率〗,因此我們可以把公式展開如下:

Source: DeepAI

Accuracy=〖 有病的人被正確分類成有病(陽性)的機率 〗X〖 生病的機率 〗+〖 沒病的人被正確分類成健康(陰性)的機率 〗X〖 沒生病的機率 〗

Source: DeepAI

這就帶出了醫學最常用的兩個衡量指標:

〖 有病的人被正確分類成有病(陽性)的機率 〗= 敏感度 Sensitivity(又稱 True Positive Rate)

〖 沒病的人被正確分類成健康(陰性)的機率 〗= 特異度 Specificity(又稱 True Negative Rate)

Source: DeepAI

圖的左側 Ground Truth 是有沒有罹病的「事實」,右側 Model 是演算法預測的結果。Sensitivity 的分母是「有罹病的人」,在這個例子中有 3 位,分子是 2 位「模型正確分成有病的人」,相除結果是 0.67;Specificity 的分母是「沒有罹病的人」,在這個例子中有 7 位,分子是 6 位「模型正確分成沒有病的人」,相除結果是 0.86。

Prevalence 是「罹病的比例 P(disease)」,在這個例子中總人數 10 位,其中有 3 位生病,因此 Prevalence 是 3 / 10 = 0.3。

Accuracy 套用前述公式 = Sensitivity X Prevalence + Specificity X (1 — Prevalence) = 0.67 X 0.3 + 0.86 X (1–0.3) = 0.8,意即這個模型的正確率有 8 成。

Source: DeepAI

聊完研究常見的 Sensitivity 和 Specificity,接下來要導入另外兩個相關的指標:PPV 和 NPV。

臨床上,醫師可能會更想知道:如果我手上的 AI 模型預測出眼前這位病人有病,那這位病人實際上真的有病的機率是多少?這個機率就稱作陽性預測率 Positive Predictive Value, PPV;而陰性預測率 Negative Predictive Value, NPV 指的是,如果 AI 模型預測出眼前這位病人沒病,實際上真的沒病的機率。

用同一個樣本來舉例,PPV 的分母是「模型預測出有病的人」,這個例子中有 4 位,分子是 2 位「實際上真的有病的人」,相除結果是 0.5;NPV 的分母是「模型預測出沒有病的人」,在這個例子中有 6 位,分子是 5 位「實際上真的沒有病的人」,相除結果是 0.83。

Source: DeepAI

接下來,我們要來看看 Sensitivity、Specificity、PPV、NPV 四者之間的關係,這時就要引入「Confusion Matrix」的工具,來看一個 Classifier 的表現。像圖中的表格,兩列分別是 GT(Ground Truth)實際有病和沒病的人,兩欄則是 Model Output 把樣本分類成有病和沒病,而 2 X 2 的表格各個值則分別對應到「True Positive (TP) 實際有病且正確被分類成有病」(左上角)、「False Negative (FN) 實際有病卻錯誤被分類成沒病」(右上角)、「False Positive (FP) 實際沒病卻錯誤被分類成有病」(左下角)、「True Negative (TN) 實際沒病且正確被分類成沒病」(右下角)。

Source: DeepAI

每個格子相對於該欄 / 列的比例,其實就是 Sensitivity、Specificity、PPV、NPV 的其中一種:

Sensitivity = TP / ( TP + FN )

Specificity = TN / ( FP + TN )

PPV = TP / ( TP + FP )

NPV = TN / ( TN + FN )

Source: DeepAI

除了這四個指標,評估醫療模型最有效的工具之一非 ROC Curve 莫屬,讓我們可以視覺化評估模型在不同 Decision Threshold 的 Sensitivity 和 Specificity。我們的 AI 模型會根據設定的閾值 Threshold(或稱 Operating Point)決定計算出 X 光有問題的機率是落在「陽性」或是「陰性」,舉例來說,如果閾值設定在 0.5,如果計算出的 Probability = 0.7,因為超過了閾值,我們會說該病人「有病」。

Source: DeepAI

閾值設定會影響 Sensitivity、Specificity、PPV、NPV 的數值,當 Threshold = 0 時,每個病人都會被視為有病,此時 Sensitivity = 1、Specificity = 0;而當 Threshold = 1 時,每個病人都會被視為有病,此時 Sensitivity = 0、Specificity = 1。

舉例來說,我們把 15 個病人 X 光預測疾病的機率列在 0 到 1 的光譜上,紅色代表實際上有病,藍色代表實際上沒病,而 t 是我們所設定的閾值。當 t 落在下圖時,Sensitivity = 6(落在 t 右側被正確分類成有病的病人)/ 7(所有紅色的病人),Specificity = 6(落在 t 左側被正確分類成正常的無病人)/ 8(所有藍色的無病人)。

Source: DeepAI

但如果我們把 t 閾值設定得比較高,Sensitivity = 5(落在 t 右側被正確分類成有病的病人)/ 7(所有紅色的病人),Specificity = 7(落在 t 左側被正確分類成正常的無病人)/ 8(所有藍色的無病人)。因為我們讓模型比較不容易把人分成有病,Sensitivity 會下降、Specificity 會上升。

Source: DeepAI

更極端一點,我們把 t 閾值設成 1,Sensitivity = 0(落在 t 右側被正確分類成有病的病人)/ 7(所有紅色的病人),Specificity = 1(落在 t 左側被正確分類成正常的無病人)/ 8(所有藍色的無病人),這是因為我們讓模型永遠只會把人判為正常。

假設我們想檢驗模型的準確度,不太可能把醫院裡所有病人資料都跑過一遍,並和真實狀況比較,才能得到答案,因為這樣太耗時費力了。我們通常會採取另一種做法:以抽樣方式,例如隨機選出 100 人,先得到這個樣本的模型準確度是 0.8,並利用「信賴區間」的概念,告訴大家:我們有 95% 的信心水準,說模型的準確度落在 [0.72](下限 Lower Bound)和 [0.88](上限 Upper Bound)之間,通常會用:

0.80 (95% CI 0.72, 0.88)

的形式來表示。常見的誤區是把這個表述解釋成「95% 的機率準確度會落在 0.72 到 0.88 之間」,或是「95% 的樣本正確性落在 0.72 到 0.88 之間」,這兩個說法都是錯誤的。

Source: DeepAI

計算的流程,是我們會從醫院樣本裡多次抽取 100 人的樣本來計算每次的準確度、信賴區間,把每次抽樣的準確度結果及信賴區間上下限畫在圖上來看,我們會假設母群體的準確度大致上會落在各次樣本的上下限之間,而信心水準指的就是我們認為前述情況有多高的機率會發生,因此信賴區間可以解釋成「重複抽樣後,大約有 95% 的樣本信賴區間會包含母群體的準確度數值」。

Source: DeepAI
Source: DeepAI

不過事實上,我們不太會去多次做抽樣,而是只會做一次的模型運算,當然信賴區間可能會也可能不會囊括到母群體的準確度,但我們會說有 95% 的信心可以辦到。樣本數越多,信賴區間相對較窄,預測效果越好。

Source: DeepAI

#CC

--

--

Sigrid C.
MDBros
Editor for

Founder of ERRK|Visiting Scholar @ Stanford University|Innovation Enthusiast for a better Homo Sapiens Simulator