416

决策中的概率思维:用贝叶斯更新看 DMTA 进展

用概率思维看待 DMTA 进展,能改善决策质量。这篇讲清贝叶斯更新的应用、先验设定与常见的推理谬误。

药物研发充满不确定性,但决策常常被表述成非黑即白(「这个系列有希望/没希望」)。用概率的方式表达信念并随数据更新,能显著改善决策质量——尤其是在数据稀少、噪声大的早期阶段。

贝叶斯更新的基本框架

# 后验 ∝ 似然 × 先验
#
# 在药物研发中的含义:
#   先验 = 基于既往知识的初始信念
#          (历史成功率、同类项目经验、机制合理性)
#   似然 = 新数据在不同假设下的可能性
#   后验 = 结合两者后的更新信念
#
# 关键洞察:
#   一个「阳性结果」应该让你的信念提升多少,
#   取决于「先验有多低」和「这个实验的判别力有多强」
#
# 常见错误:
#   看到一个阳性结果就认为「成功了」,
#   忽略了先验概率很低时,阳性结果的后验仍可能很低

一个具体例子

# 场景:某靶点的某系列,做了一个动物药效实验,结果阳性
#      这个系列成功的概率有多大?

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},
]

# 第三个选项的价值在于「信息价值」:
#   花小成本获得能改变后续决策的信息
#
# 信息的价值 = 有信息时的期望价值 - 无信息时的期望价值
#
# 这解释了为什么「先做一个便宜的判别性实验」
# 常常是最优决策 —— 即使它本身不推进项目

关键要点

  • 阳性结果该让信念提升多少,取决于先验高低与实验判别力
  • 判别力弱的实验(阳性阴性都不改变后验)不值得做;
  • 预先声明「什么数据会改变判断」,防止事后合理化;
  • 用自家历史项目校准先验,比用行业平均数字更贴合实际。

延伸资源