我想知道逻辑回归模型的阈值是否是特定于流行的。我假设他们是,但是,我不确定它背后的基本统计原理以及如何处理对临床实践的影响。
例子:
一家医院想要部署逻辑回归模型来预测前列腺癌患者的淋巴结转移。该模型由专家协会推荐,并在医学界广泛接受。
对于模型开发,一个研究小组使用了一个大型数据集,其中淋巴结转移的患病率很低(15%)。他们使用实验室值 (PSA) 和年龄作为预测指标。在使用来自具有相似患病率 (15%) 的医院的数据进行外部验证、决策曲线分析和讨论治疗的利弊后,专家协会发现对于患者是否需要特定手术(医学上合理的数量)的决定,阈值概率≥0.10真阳性和假阳性结果)。
现在医院正在他们的手术咨询时间内部署该模型(淋巴结转移患者的预期患病率 = 30%)。
问题:
- 如果他们想要获得相似的真阳性和假阳性结果,他们能否部署相同的阈值概率?
- 如果不是,应该如何调整模型和/或阈值概率(以获得相似的真阳性和假阳性结果)?
我已经在这个主题上找到了什么:
一个关于流行率和概率的有趣博客,然而,它没有回答我关于阈值的问题。
个体预后或诊断 ( 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 )

