1. 程式人生 > 其它 >貝葉斯公式經典例題

貝葉斯公式經典例題

貝葉斯公式關於發病率的一個例題

先看原題:

某地區居民的肝癌發病率為0.0004 ,現用甲胎蛋白法進行普查。醫學研究表明,化驗結是有錯檢的可能的。已知患有肝癌的人其化驗結果99%呈陽性, 而沒患肝癌的人其化驗結果99.9% 呈陰性。現某人的檢查結果呈陽性,問他真的患有肝癌的概率是多少?

先說答案,一個人化驗結果呈陽性,則他患有肝癌的概率是28.4%

乍一看,覺得這個概率真的好小,看題設裡說的,患有肝癌的人,99%的概率是化驗結果呈陽性(1%的誤判是技術等其他原因導致的)。那為什麼反過來,一個人化驗結果呈陽性,則他患有肝癌的概率概率就變成了28.4%,這似乎有點違背常識。

解題

我們先把題設化成圖,便於取數計算。

解:

設A={該患者是肝癌患者},B={該患者檢驗呈陽性}

\(P(A|B)\)

\[P(A) = 0.9996 \\ P(\overline{A})=0.0004 \]

由貝葉斯公式可知:

\[P(A|B) ={P(AB)\over P(B)}= {P(A)P(B|A)\over P(A)P(B|A)+P(\overline{A})P(B|\overline{A}) } \]

這裡分子的展開使用了 乘法公式,分母的展開使用了 全概率公式

我們依次求每一項:

\(P(B|A)\)代表是肝癌患者的前提下,檢測呈陽性的概率。我們已經知道了是 0.99

\(P(B|\overline{A})\)代表不是肝癌患者的前提下,檢測呈陽性的概率。我們已經知道了是 0.001

即:

\[\begin{equation} P(B|A) = 0.99 \\ P(B|\overline{A}) = 0.001 \end{equation} \]

將公式(1)(3)代入(2)可得\(P(A|B)=0.284\),即 一個人在第一次化驗結果呈陽性的前提下,則他患有肝癌的概率是28.4%

分析

其實憑直覺,我們也應該能猜出,這與肝癌的發病率有關,因為在樣本空間(所有人)中,他的發病率只有0.0004。

對此,如果我們把樣本空間換成首次檢驗結果呈陽性的個體,也就是理解成,對首次檢查呈陽性的個體進行復查。再去計算

如果複查結果還是陽性,那麼此時患肝癌的概率的值。

由於首次檢驗結果呈陽性的患者,發病率是 0.284

(上面已經計算出來了),我們再去使用一次貝葉斯公式(2),

此時的引數是:

\[\begin{equation} P(A) = 0.284 \\ P(\overline{A})=0.716 \\ P(B|A) = 0.99 \\ P(B|\overline{A}) = 0.001 \end{equation} \]

代入(2),可得P = 0.997,可見若第二次化驗結果還是陽性,此時是肝癌患者的概率變成了99.7%,這也就是現實生活中,要複查的原因了

作圖

在目前技術水平不變的情況下,化驗結果的概率,我們假設是一個定值。

那麼對於公式

\[P(A|B) ={P(AB)\over P(B)}= {P(A)P(B|A)\over P(A)P(B|A)+P(\overline{A})P(B|\overline{A}) } \tag 2 \]

我們畫出\(P(A|B)\)關於\(P(A)\)的函式,即檢驗結果是陽性的前提下,該患者患肝癌的概率人群肝癌發病率的關係。

設人群肝癌發病率為x,檢驗結果是陽性的前提下,該患者患肝癌的概率為y。

可得:

\[y = {0.99x \over 0.99x + 0.001(1-x)} \]

作圖:

假設當疾病發病率為4%時,若檢測為陽性,則患肝癌的概率是97.63%。

程式碼:

# coding=gbk
import numpy as np
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定預設字型
mpl.rcParams['axes.unicode_minus'] = False # 解決儲存影象是負號'-'顯示為方塊的問題


def morbidity(x):
    y = x*0.99 / (x*0.99 + (1-x)*0.001)

    return y


if __name__ == '__main__':
    x = np.arange(0, 1, 0.01)
    y = morbidity(x)

    # 開始作圖
    fig = plt.figure(figsize=(20, 6))  # 設定畫布大小
    plt.grid(linestyle="-.", axis='y', alpha=0.4)
    plt.xlabel("人群發病率", fontsize=15)
    plt.ylabel("患肝癌概率", fontsize=15)
    plt.plot(x, y)
    plt.show()

總結

進一步降低錯檢率是提高檢驗精度的關鍵。但在實際中由於技術和操作等種種原因,降低錯檢率是很困難的。仔細分析一下會發現檢驗精度低的主要原因是肝癌發病率很低。所以在實際中,常採用複查的方法來減少錯誤。因為此時被懷疑的物件群體中,肝癌的發病率已大大提高了。

概率有時候與我們的經驗不太一樣,這也是其魅力之一。