逻辑回归模型的阈值是特定于流行的吗?

机器算法验证 r 回归 物流 临界点 流行率
2022-03-29 18:39:00

我想知道逻辑回归模型的阈值是否是特定于流行的。我假设他们是,但是,我不确定它背后的基本统计原理以及如何处理对临床实践的影响。

例子:

一家医院想要部署逻辑回归模型来预测前列腺癌患者的淋巴结转移。该模型由专家协会推荐,并在医学界广泛接受。

对于模型开发,一个研究小组使用了一个大型数据集,其中淋巴结转移的患病率很低(15%)。他们使用实验室值 (PSA) 和年龄作为预测指标。在使用来自具有相似患病率 (15%) 的医院的数据进行外部验证、决策曲线分析和讨论治疗的利弊后,专家协会发现对于患者是否需要特定手术(医学上合理的数量)的决定,阈值概率≥0.10真阳性和假阳性结果)。

现在医院正在他们的手术咨询时间内部署该模型(淋巴结转移患者的预期患病率 = 30%)。

问题:

  1. 如果他们想要获得相似的真阳性和假阳性结果,他们能否部署相同的阈值概率?
  2. 如果不是,应该如何调整模型和/或阈值概率(以获得相似的真阳性和假阳性结果)?

我已经在这个主题上找到了什么:

一个关于流行率和概率的有趣博客,然而,它没有回答我关于阈值的问题。

个体预后或诊断 ( TRIPOD ) 声明 (W17)的多变量预测模型的透明报告:

一般而言,当新人口的病例组合在发展人口的病例组合范围内时,模型将更具普遍性(186)。然而,正如我们在第 10e 项中所描述的(另见框 C 和表 3),人们可以调整或更新先前开发的预测模型,该模型应用于另一种环境,以适应新环境的当地情况,以提高模型的可移植性。

来自 W17 表 3:

更新方法:调整截距(基线风险/危害)

更新原因:开发和验证样本之间的结果频率(流行率或发病率)差异

R中的可重现示例:

#library
library(tidyverse)
library(rmda)

# train data (prevalence= 15%)
train <- tibble(id=1:1000,
                    class=c(rep(1,150),rep(0,850)))

set.seed(1)
train %>% 
  group_by(id) %>% 
  mutate(
  PSA=case_when(class==1 ~ runif(1,1,100),TRUE ~ runif(1,1,40)),
  Age=case_when(class==1 ~ runif(1,30,80),TRUE  ~runif(1,30,60))) -> d.train
  

# test data same prevalence (15%)
test <- tibble(id=1:1000,
                class=c(rep(1,150),rep(0,850)))

set.seed(23)
test %>% 
  group_by(id) %>% 
  mutate(
    PSA=case_when(class==1 ~ runif(1,1,100),TRUE ~ runif(1,1,50)),
    Age=case_when(class==1 ~ runif(1,30,80),TRUE  ~runif(1,25,60))) -> d.test_same_prev



# test data high prevalence (30%)
test1 <- tibble(id=1:1000,
               class=c(rep(1,350),rep(0,650)))

set.seed(123)
test1 %>% 
  group_by(id) %>% 
  mutate(
    PSA=case_when(class==1 ~ runif(1,1,100),TRUE ~ runif(1,1,50)),
    Age=case_when(class==1 ~ runif(1,30,80),TRUE  ~runif(1,25,60))) -> d.test_higher_prev


# train logistic regression model
glm(class ~ Age+PSA, data=d.train,family = binomial) -> model


# make predictions in cohort with same prevalence
predict(model,d.test_same_prev, type="response") -> preds1
plot(preds1)

# make predictions in cohort with high prevalence
predict(model,d.test_higher_prev, type="response") -> preds2
plot(preds2)



# decision curve analysis same prevalence
d.dca.same <- data.frame(reference=d.test_same_prev$class,predictor=preds1)

dca.same <-decision_curve(reference ~predictor,d.dca.same,fitted.risk=TRUE, bootstraps = 10)

plot_decision_curve(dca.same,confidence.intervals=FALSE)



# decision curve analysis high prevalence
d.dca.high <- data.frame(reference=d.test_higher_prev$class,predictor=preds2)

dca.high <-decision_curve(reference ~predictor,d.dca.high,fitted.risk=TRUE, bootstraps = 10)

plot_decision_curve(dca.high,confidence.intervals=FALSE)

reprex 包于 2021-08-08 创建 (v2.0.0 )

3个回答

需要解开三个相互交织的问题:(1)概率模型的校准,(2)该模型是否应该用于生成硬概率阈值,以及(3)如果是,阈值应该在哪里。让我们以相反的顺序来处理它们。

(3) 如果你有一个校准良好的概率模型并且有一个概率阈值,那么选择应该基于对每个类别的真假分配的成本和收益。这个答案解释了二类情况的选择,并链接到多类模型的复杂性。

阈值不是逻辑回归的一部分,尽管这个问题的标题似乎另有暗示。在概率模型(无论设计如何,不一定是逻辑回归)到位之后,根据预期应用程序的成本和收益选择阈值。

(2) 正如弗兰克哈雷尔在评论中所说,“最佳决策与流行率无关,但完全取决于个人结果的概率。” 个人结果的概率可能取决于概率模型中捕获的内容之外的临床考虑。

此外,上面讨论的成本/收益权衡可能因人而异。与 60 岁的人相比,85 岁的前列腺癌患者可能不太愿意接受手术以寻找潜在的阳性淋巴结。所有这些都反对仅基于模型为个人设定坚定的概率阈值。

(1) 因此,这个问题的核心是基于“淋巴结转移患病率低 (15%) 的大型数据集”的概率模型是否可以用于“手术咨询时间”(预期患病率淋巴结转移 = 30%)。" 这是一个关于模型校准的更复杂的问题,特别是逻辑回归截距是否应该针对该流行度差异进行调整。

概率的逻辑回归模型p的条件(D) 作为协变量的函数X

logp1p=α+βTX

有一个拦截α表示对数几率D 当协变量值为 0(或分类预测变量的参考水平)时,在基线情况下的抽样总体中。(@Eoin 的答案探讨了人群基线流行率不同时的情况。)D给定X在同一人群中是:

p(D|X)=exp(α+βTX)1+exp(α+βTX).

McCullagh 和 Nelder展示了(第 4.3.3 节)可能需要调整截距以将抽样总体考虑在内的情况。回顾性研究可能会评估所有病例D但只有一部分没有条件(D¯)。然后估计p(D|X)在整个人口中使用上述公式,您需要将截距调整为α=α+log(π0/π1), 在哪里π0,π1是案例的分数D和非案件D¯分别采样。但他们警告说:

这里重要的是采样比例仅取决于D而不是X.

在您在“手术咨询时间”中评估的前列腺癌患者的阳性节点概率示例中,情况可能并非如此。选择这些患者的部分原因是他们的协变量值X(可能包括 PSA 和年龄)表明他们的淋巴结扩散风险已经高于前列腺癌患者的总体人群。

如果原始概率模型针对前列腺癌患者的总体人群(15% 淋巴结阳性)进行了适当校准,那么问题是该总体人群是否足以代表您的总体前列腺癌人群。部分原因是:原始研究中基线协变量条件下节点阳性的概率是否与您的相似?

在“手术咨询时间”中讨论的患者可能不在基线协变量条件下。它们是根据怀疑的更高风险预先选择的,因此应该具有更高的预期节点阳性概率。如果原始模型针对您的整个前列腺癌人群进行了很好的校准,那么将其应用于这个预先选择的高风险子集应该没有问题。

尽管有@Frank Harrels 的评论,但我认为根据逻辑回归模型中的截距或偏差项而不是阈值来考虑这一点是有用的。我对这种方法并不完全有信心,但它应该很有用!

假设你只有一个预测器,x. 为方便起见,让x居中0在训练数据中。那么模型就是P(yi=1)=logit1(α+βxi), 截距α是正面结果的对数几率,当x=0(平均值)。

给定一组预测变量值x1,x2,,xN, 和参数αβ,预测的患病率只是预测概率的平均值(我认为), i=1Nlogit1(α+βxi)N.

现在,如果您的训练上下文中的流行率为 15%,而您的测试上下文中为 30%,则有一些可能的解释。

  • 首先是预测变量的分布——只是x在这里,但实际上有很多事情 - 上下文之间存在差异,这种差异解释了阳性病例总数的差异。如果是这种情况,您的模型可以在测试上下文中使用而无需修改。
  • 第二个是预测变量的分布没有改变,但是你的模型没有捕捉到的一些额外的因素已经改变了。这可以通过调整α直到阳性结果的平均预测概率与您对测试数据的预期流行率相匹配 (30%)。
  • 第三种也是最有可能的解释是上述两种情况的混合:模型捕捉到的一些东西发生了变化,而一些没有捕捉到的东西也发生了变化。我认为,但我不能肯定地说,这可以通过调整α直到平均预测概率与预期流行率相匹配。

现在,如果您的预测变量与结果之间的关系在训练和测试环境之间存在差异,那么这些都无济于事,但我们对此无能为力。


更新

对于我自己的 L&D,我尝试过模拟这个,它似乎按照描述的那样工作。代码在这里: https ://gist.github.com/EoinTravers/656ac7b77a5cfa966c706888185afcd5

在此处输入图像描述

在此处输入图像描述

从某种意义上说,是的。这是逻辑回归的默认设置。它不被视为需要补救的“问题”,但也许应该如此。这里的“患病率”是指样本内患病率:具体而言,如果您计算逻辑回归样本中每个患者的拟合概率,并进行平均,您将获得样本内患病率。R中的一个例子:

set.seed(123)
x <- seq(-3, 3, 0.01)
y <- rbinom(length(x), 1, plogis(-3 + 0.4 * x))
f <- glm(y ~ x, family=binomial)
sum(f$fitted)
sum(y)

> sum(f$fitted)
[1] 42
> sum(y)
[1] 42

即 7% 的流行率。

然而,可以构建复杂的层次模型,或加权来处理问题,例如病例对照研究中的病例过采样。或处理嵌套样本。Scott 和 Wild (1999) 讨论了通过结果的“已知患病率”来加权病例对照病例样本,而对照则相反。这将校正模型中的截距项,以便校准适合参考流行度。当然,即使是“已知流行度”也可能存在不确定性,目前还没有任何最佳方法来解释这些错误层。

一个相关的例子是 COVID 测试。我不确定逻辑模型是否参与预测疾病的存在,但令人震惊的是,在流行病的特定时间开发用于诊断有症状人群中疾病存在的测试在执行方面基本没有变化稍后在无症状人群中进行相同的测试。直到最近才调整 PCR 循环的数量,从而减少了假阳性病例的数量。