药物研发充满不确定性,但决策常常被表述成非黑即白(「这个系列有希望/没希望」)。用概率的方式表达信念并随数据更新,能显著改善决策质量——尤其是在数据稀少、噪声大的早期阶段。
贝叶斯更新的基本框架
# 后验 ∝ 似然 × 先验
#
# 在药物研发中的含义:
# 先验 = 基于既往知识的初始信念
# (历史成功率、同类项目经验、机制合理性)
# 似然 = 新数据在不同假设下的可能性
# 后验 = 结合两者后的更新信念
#
# 关键洞察:
# 一个「阳性结果」应该让你的信念提升多少,
# 取决于「先验有多低」和「这个实验的判别力有多强」
#
# 常见错误:
# 看到一个阳性结果就认为「成功了」,
# 忽略了先验概率很低时,阳性结果的后验仍可能很低
一个具体例子
# 场景:某靶点的某系列,做了一个动物药效实验,结果阳性
# 这个系列成功的概率有多大?
def bayes_update(prior, sensitivity, specificity, result_positive=True):
"""
prior: 实验前认为「该系列真的有效」的概率
sensitivity: 若真有效,实验给出阳性的概率
specificity: 若真无效,实验给出阴性的概率
"""
if result_positive:
p_pos_given_true = sensitivity
p_pos_given_false = 1 - specificity
else:
p_pos_given_true = 1 - sensitivity
p_pos_given_false = specificity
num = p_pos_given_true * prior
den = num + p_pos_given_false * (1 - prior)
return num / den
# 情形一:先验较低(新靶点,机制证据一般)
print(bayes_update(prior=0.20, sensitivity=0.80, specificity=0.70))
# → 0.40,从 20% 升到 40%,有提升但远未确定
# 情形二:先验较高(有遗传学证据支持)
print(bayes_update(prior=0.50, sensitivity=0.80, specificity=0.70))
# → 0.73
# 情形三:实验判别力弱(模型转化相关性差)
print(bayes_update(prior=0.20, sensitivity=0.80, specificity=0.40))
# → 0.25,几乎没有信息增益
#
# 关键教训:
# 在一个特异性差的模型上做实验,
# 阳性结果几乎不改变你的信念 ——
# 这样的实验不值得做
这个框架最实用的产出是:判断一个实验值不值得做。如果无论结果阳性还是阴性,你的后验都不会明显改变,那这个实验就没有决策价值。
先验从哪来
| 来源 | 说明 |
|---|---|
| 历史成功率 | 该阶段、该治疗领域的行业平均成功率 |
| 遗传学证据 | 有人类遗传学支持的靶点成功率约翻倍(见 250《Open Targets Genetics》) |
| 同靶点先例 | 该靶点此前项目的成败与原因 |
| 同家族先例 | 同类靶点的可成药性 |
| 机制合理性 | 专家判断(需注意主观偏差) |
| 内部历史 | 自家项目的历史成功率是最贴合的先验 |
用自家历史数据校准先验是最有价值的做法:「我们过去 10 个项目中,在这个阶段看起来同样有希望的有 6 个,最终成功 2 个」——这比行业平均数字更贴合你的实际情况。
常见的推理谬误
- 忽略基础率:最常见的谬误。只看「这个数据看起来很好」,不考虑「这类项目本来成功率就低」。基础率低时,需要更强的证据才能达到同样的后验。
- 把「未证伪」当「已证实」:没有观察到毒性,不等于没有毒性——可能只是样本量不足或未测到那个终点;
- 多重比较不校正:测了 50 个终点,有 2 个「显著」——这在纯随机下也会发生;
- 确认偏差:更容易注意支持既有假设的数据;
- 忽略「实验的判别力」:在一个几乎所有化合物都能通过的模型上得到阳性结果,信息量接近零;
- 过度更新:单个实验的结果不应让信念发生剧变,除非该实验判别力极强。
用概率表达决策
# 与其说「这个系列有希望」,不如说:
#
# 「基于当前数据,我认为该系列达到候选化合物标准的概率约 35%。
# 主要不确定性在于选择性能否做到 30 倍以上。
# 如果下一轮的选择性实验达标,我会把估计提高到约 60%;
# 如果不达标,会降到 15% 以下并考虑终止。」
#
# 这种表述的好处:
# 1) 明确了当前的信念水平
# 2) 指出了关键不确定性
# 3) 预先声明了「什么数据会改变判断」
# → 避免事后为数据找理由
# 4) 可以事后校准(回顾预测的准确性)
# 团队实践:
# 在关键决策点记录每个人的概率估计,
# 项目结束后回顾校准情况
# → 长期能显著改善团队的判断质量
「预先声明什么数据会改变判断」是最有价值的一条:它防止了事后合理化——数据不好时找理由说服自己继续。
决策树与期望价值
# 在有多个选项时,可以计算期望价值
def expected_value(options):
"""options: [{name, p_success, value_if_success, cost}]"""
results = []
for o in options:
ev = o["p_success"] * o["value_if_success"] - o["cost"]
results.append({**o, "expected_value": ev})
return sorted(results, key=lambda x: -x["expected_value"])
options = [
{"name": "推进现有系列", "p_success": 0.35,
"value_if_success": 100, "cost": 10},
{"name": "骨架跃迁重来", "p_success": 0.20,
"value_if_success": 120, "cost": 25},
{"name": "先做选择性实验再决定", "p_success": None, "cost": 2},
]
# 第三个选项的价值在于「信息价值」:
# 花小成本获得能改变后续决策的信息
#
# 信息的价值 = 有信息时的期望价值 - 无信息时的期望价值
#
# 这解释了为什么「先做一个便宜的判别性实验」
# 常常是最优决策 —— 即使它本身不推进项目
关键要点
- 阳性结果该让信念提升多少,取决于先验高低与实验判别力;
- 判别力弱的实验(阳性阴性都不改变后验)不值得做;
- 预先声明「什么数据会改变判断」,防止事后合理化;
- 用自家历史项目校准先验,比用行业平均数字更贴合实际。
延伸资源
- 计算与实验的差距:417《计算与实验的差距》;候选提名:411《Clinical Candidate Nomination》;
- 失败复盘:423《失败复盘》。