问题引入

小明在医院被检测出癌症,已知仪器的误诊率是1%,问:小明得癌症的概率是多少?

看到这里,小东不假思索地认为答案是“1-1%=99%”,但如果你认为这个答案是毫无疑问的,则代表你的思考还不够严谨。

换个场景思考

  • 如果把仪器的误诊率换成50%,那么按照小东的思路,小明得癌症的概率为1-50%=50% 。

  • 如果再把疾病换成“埃博拉”,那么按照小东的思路,小明得“埃博拉”的概率仍然为1-50%=50% 。

  • 但我们知道,埃博拉病毒早已消失了,因此小明得“埃博拉”的真实概率为0。

  • 但由于仪器的准确率只有50%,因此每检测2个人,就会有1个是“埃博拉阳性”。

因此显然:“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(癌|诊出) = (B
Q) / [BQ + (1-B)(1-Q)]

用Python统计患病的条件概率

根据上面贝叶斯公式的结果,我们借助Python来统计不同“患病整体概率”下“小明患病的条件概率”

  1. from numpy import linspace
  2. import pandas as pd
  3. def get条件概率(患病整体概率, 准确率):
  4. 健康概率 = 1 - 患病整体概率
  5. 错误率 = 1 - 准确率
  6. Y = 患病整体概率*准确率 + 健康概率*错误率
  7. 患病条件概率 = (患病整体概率*准确率) / Y
  8. return 患病条件概率
  9. results = []
  10. for 仪器准确率 in linspace(0, 1, num=10)[1:-1]:
  11. for 患病整体概率 in linspace(0, 1, num=10)[1:-1]:
  12. results.append(dict(
  13. 仪器准确率 = 仪器准确率,
  14. 患病整体概率 = 患病整体概率,
  15. 患病条件概率 = get条件概率(患病整体概率, 仪器准确率)
  16. ))
  17. df = pd.DataFrame(results)
  18. df.to_excel('条件概率统计.xlsx', index=False)

结论

根据下图的统计表,很明显:“患病条件概率”与“患病整体概率”正相关。
3099fe905f67dc98b76a4cfac3beb47.png

诊断的价值

有人会说:既然患癌的“条件概率”受“整体患病概率”的影响这么大,那做检测还有什么价值?

实际上,在现实中,精密的仪器+经验丰富的医生,可以把综合误诊率降到很低,我们以 0.1% 的误诊率,再统计一份数据看看:
90a77b069309c9997deb9f3e35bfa69.png
可以看到:当误诊率足够低时,“患病条件概率”受“患病整体概率”的影响已经很小了。