问题引入
小明在医院被检测出癌症,已知仪器的误诊率是1%,问:小明得癌症的概率是多少?
看到这里,小东不假思索地认为答案是“1-1%=99%”,但如果你认为这个答案是毫无疑问的,则代表你的思考还不够严谨。
换个场景思考
如果把仪器的误诊率换成50%,那么按照小东的思路,小明得癌症的概率为1-50%=50% 。
如果再把疾病换成“埃博拉”,那么按照小东的思路,小明得“埃博拉”的概率仍然为1-50%=50% 。
但我们知道,埃博拉病毒早已消失了,因此小明得“埃博拉”的真实概率为0。
但由于仪器的准确率只有50%,因此每检测2个人,就会有1个是“埃博拉阳性”。
答案取决于哪些因素?
设小明患癌症的先验概率为B,仪器的准确率为Q,被检测出癌症的概率为Y,则:
- Y = 有病且诊断正确的概率 + 无病但误诊的概率
- 无病的先验概率为(1-B)
- 仪器的错误率为(1-Q)
- Y = BQ + (1-B)(1-Q)
于是我们便知道了:Y是关于B和Q的函数,即:
Y = f(B, Q)
设“已被仪器诊出癌症的前提下”真实患癌的条件概率为Z,则:
- 显然Z是关于Y的函数
- 设:Z = g(Y)
- 又因为Y = f(B, Q),因此:Z=g(f(B, Q)),即:Z = g_f(B, Q)
显然:Z是关于B和Q的函数,即:
小明“患癌的条件概率”同时取决于“患癌的先验概率”和“仪器的准确率”。
注:“患癌症的先验概率”可以理解为“人群中随机抽样一个人,这个人是癌症患者的概率”,也即:人群中的患病整体概率。
用贝叶斯公式计算患病的条件概率
根据贝叶斯公式,有:
占位 p(癌|诊出) = p(癌∩诊出) / p(诊出)
占位 p(癌|诊出) = p(癌∩诊出) / Y
占位 p(癌|诊出) = p(癌∩诊出) / [BQ + (1-B)(1-Q)]
显然:
占位 p(癌∩诊出) = BQ
因此:
占位 p(癌|诊出) = (BQ) / [BQ + (1-B)(1-Q)]
用Python统计患病的条件概率
根据上面贝叶斯公式的结果,我们借助Python来统计不同“患病整体概率”下“小明患病的条件概率”
from numpy import linspaceimport pandas as pddef get条件概率(患病整体概率, 准确率):健康概率 = 1 - 患病整体概率错误率 = 1 - 准确率Y = 患病整体概率*准确率 + 健康概率*错误率患病条件概率 = (患病整体概率*准确率) / Yreturn 患病条件概率results = []for 仪器准确率 in linspace(0, 1, num=10)[1:-1]:for 患病整体概率 in linspace(0, 1, num=10)[1:-1]:results.append(dict(仪器准确率 = 仪器准确率,患病整体概率 = 患病整体概率,患病条件概率 = get条件概率(患病整体概率, 仪器准确率)))df = pd.DataFrame(results)df.to_excel('条件概率统计.xlsx', index=False)
结论
根据下图的统计表,很明显:“患病条件概率”与“患病整体概率”正相关。
诊断的价值
有人会说:既然患癌的“条件概率”受“整体患病概率”的影响这么大,那做检测还有什么价值?
实际上,在现实中,精密的仪器+经验丰富的医生,可以把综合误诊率降到很低,我们以 0.1% 的误诊率,再统计一份数据看看:
可以看到:当误诊率足够低时,“患病条件概率”受“患病整体概率”的影响已经很小了。
