7. 预测模型评价——DCA曲线

7. 预测模型评价——DCA曲线ROC 曲线分析 主要是评价模型的准确性 但无论如何选择 都会存在假阳性和 或假阴性的问题

大家好,欢迎来到IT知识分享网。

基本知识

背景

ROC曲线分析,主要是评价模型的准确性,但无论如何选择,都会存在假阳性和/或假阴性的问题。

如果疾病危害较小,尚无法治愈,则可以适当增加假阴性,避免假阳性;若疾病的危害大且晚发现预后差,则可以适当增加假阳性,避免假阴性。

DCA曲线

横坐标为阈概率(threshold probability),纵坐标为净获益( net benefit,NB)。

DCA曲线中存在两种极端情况的曲线:

1.横的曲线表示所有样本都是阴性,所有人都没有干预,净获益率为0.

2. 斜的曲线表示所有样本都是阳性,所有人都接受了干预,净获益率为一条斜率为负值的斜线。

临床解读

DCA曲线若和两条极端线很接近,则说明DCA曲线没有什么应用价值。

若在一个很大的横坐标范围内,DCA曲线的净获益率比极端曲线高,则说明DCA曲线其有一定的应用价值。

二分类资料

方法一:rmda包中的decision_curve函数

 载入数据集:

rm(list=ls()) library(readxl) data <- read_excel("data.xlsx") data<-na.omit(data) data<-as.data.frame(data)

建立模型公式

form.bestglm<-as.formula(group~age+BMI+ToS+CA153+CDU+transfusion+stage) form.all<-as.formula(group~ age+BMI+ToS+BL+DDimer+CA153+CDU+EKG+PF+ thoracotomy+lobectomy+transfusion+stage)

注意:只需要建立公式,不需要进行logistic建模

绘制DCA曲线:

#install.packages("rmda") library(rmda) DCA.1<- decision_curve(formula=form.bestglm, family = binomial(link ='logit'), thresholds= seq(0,1, by = 0.01), confidence.intervals =0.95, study.design = 'cohort', data = data) #查看结果 DCA.1$derived.data

formula指定你需要绘制的公式;

family设置为二分类资料binomial;

thresholds设置为计算时的阈值;

confidence.intervals设置可信区间;

study.design设置研究类型为队列。

7. 预测模型评价——DCA曲线

其中threshold表示阈值,NB表示净收益,sNB表示标准化净收益,cost.benefit.ratio表示损失收益比。

head(DCA.1$derived.data[,c("thresholds","NB","sNB","cost.benefit.ratio")])

7. 预测模型评价——DCA曲线 

绘制DCA曲线:

plot_decision_curve(DCA.1, curve.names= c("Model Bestglm"), xlim=c(0,0.8), cost.benefit.axis =TRUE, col = "#E64B35B2", confidence.intervals =FALSE, standardize = FALSE)

 curve.names设置曲线名称,cost.benefit.axis=T 表示显示损失收益比,col设置曲线颜色,confidence.interval=F不显示置信区间,standardize=F表示不进行标准化。

7. 预测模型评价——DCA曲线

纵坐标为净收益,第一条横坐标为阈概率,第二条横坐标为损失收益比,横线表示None,所有样本都是阴性,所有人都不接受干预,净获益为0。斜线表示ALL,所有的样本都是阳性,所有人都接受干预,净获益曲线为一条斜率为负值的斜线。

DCA曲线在0.1-0.7的横范围内,位于None,All两条无效线的上方,说明在此范围内,模型效果尚可。在小于0.1或大于0.7的范围内,DCA曲线与None,All两条无效线接近,说明在此范围内,模型效果欠佳。

绘制临床影响曲线:

plot_clinical_impact(DCA.1, population.size = 1000, cost.benefit.axis = TRUE, n.cost.benefits= 8, col =c("#E64B35B2","#4DBBD5B2"), confidence.intervals= FALSE) 

population设置人群数为1000,n.cost.benefits设置损失收益比的刻度数目,

7. 预测模型评价——DCA曲线

纵坐标为高危人群数,第一条横坐标为阈概率值,第二条横坐标为损失收益比;红色曲线表示高危人群数,蓝色表示高危人群中发生结局事件的人数。

在横坐标0-0.4的范围内,红色曲线与蓝色曲线偏离较大,而在横坐标大于0.4的范围内,两条曲线较为接近。理想的结果是红色曲线与蓝色曲线接近,说明模型效果好。

多模型DCA曲线

DCA.2<- decision_curve(formula=form.all, family = binomial(link ='logit'), thresholds= seq(0,1, by = 0.01), confidence.intervals =0.95, study.design = 'cohort', data = data) plot_decision_curve(list(DCA.1,DCA.2), curve.names= c('Model Bestglm','Model All'), xlim=c(0,1), cost.benefit.axis =TRUE, col = c("#E64B35B2","#4DBBD5B2"), confidence.intervals =FALSE, standardize = FALSE)

7. 预测模型评价——DCA曲线

 

方法二:dcurves包中的dca函数

构建logistic回归模型:

fit.1<-glm(formula = form.bestglm,family = binomial(),data = data) data$pred1<-predict(fit.1,type="response")

type指定预测值的类型为response

library(dcurves) dcurves::dca(formula=group~pred1, label = list(pred1 = "Model Bestglm"), data = data) %>% plot(smooth = TRUE) + ggplot2::labs(x = "Treatment Threshold Probability")

formula指定模型公式(因变量group与预测变量pred1),label指定图例中的DCA曲线的标签。

plot()中smooth=T表示进行平滑处理,ggplot2::labs()设置x轴的名称。

7. 预测模型评价——DCA曲线

 

多模型曲线:

fit.2<-glm(formula = form.all,family = binomial(),data = data) data$pred2<-predict(fit.2,type="response") dcurves::dca(formula=group~pred1+pred2, label = list(pred1 = "Model Bestglm", pred2 = "Model All"), data = data) %>% plot(smooth = TRUE,show_ggplot_code = TRUE) + ggplot2::labs(x = "Treatment Threshold Probability")

 formula指定模型公式(因变量group与预测变量pred1,pred2)

7. 预测模型评价——DCA曲线

 

生存资料

案例:750名患者发生癌症的风险

7. 预测模型评价——DCA曲线

id:病人编号;

cnacer:生存结局,是否发生肿瘤,0是否,1是是;

age:患者年龄;

familyhistory:是否有家族史,0表示否,1表示是;

marker:标记物;

ttcancer:从标记物检测到肿瘤发生所经历的时间,为生存时间。

创建一个生存模型:

dca<-read.csv("dca.csv",header = TRUE) library(survival) fit.cox = coxph(formula=Surv(ttcancer, cancer) ~ age + famhistory + marker, data=dca,x=TRUE)

单时点DCA曲线

1.5年的生存预测:

#install.packages("pec") library(pec) dca$p1 <- predictSurvProb(fit.cox,newdata=dca,times=1.5)

利用pec包中的predictSurvProb()函数进行预测,fit.cox拟合的生存模型,newdata选择需要分析的数据集,times表示需要预测的生存时间。

绘制DCA曲线:

library(dcurves) dcurves::dca(Surv(ttcancer, cancer) ~ p1, time = 1.5, label = list(p1 = "Model All"), data = dca) %>% plot(smooth = TRUE) + ggplot2::labs(x = "Treatment Threshold Probability")

7. 预测模型评价——DCA曲线

图形有点问题,不太好解释,大概看看就行。

多时点DCA曲线

比如在图中绘制1.5年和2年的DCA曲线

dca$p1 <- predictSurvProb(fit.cox,newdata=dca,times=1.5) dca$p.1 <- predictSurvProb(fit.cox,newdata=dca,times=2)

 需要用到stdca程序包(已经上传附件)

source("stdca.R") model_all.2<-stdca(data=dca, outcome="cancer", ttoutcome="ttcancer", timepoint=2, predictors="p.1", xstop=0.7, smooth=TRUE) plot(model_all$net.benefit.threshold, model_all$net.benefit.none, type = "l", lwd=2, xlim=c(0,.50), ylim=c(-.05, .20), xlab = "Threshold Probability", ylab = "Net Benefit") lines(model_all$net.benefit$threshold, model_all$net.benefit$all, type="l", col="red", lwd=2) lines(model_all$net.benefit$threshold, model_all$net.benefit$none, type="l", col="red", lwd=2, lty=2) lines(model_all$net.benefit$threshold, model_all$net.benefit$p1, type="l", col="blue") lines(model_all.2$net.benefit$threshold, model_all.2$net.benefit$p1.1, type="l", col = "green", lty=2) legend("topright", cex=0.8, legend=c("All", "18 Month", "24 Month", "None"), col=c("red", "blue", "green", "red"), lwd=c(2, 2, 2, 2), lty=c(1, 1, 2, 2)) 

 

7. 预测模型评价——DCA曲线

多模型DCA:

fit2.cox= coxph(formula=Surv(ttcancer, cancer) ~ marker, data=dca,x=TRUE) dca$p2 <- predictSurvProb(fit2.cox,newdata=dca,times=1.5)

方法一:stdca程序包

model_marker<-stdca(data=dca, outcome="cancer", ttoutcome="ttcancer", timepoint=1.5, predictors="p2", xstop=0.7, smooth=TRUE) plot(model_all$net.benefit.threshold, model_all$net.benefit.none, type = "l", lwd=2, xlim=c(0,.50), ylim=c(-.05, .20), xlab = "Threshold Probability", ylab = "Net Benefit") lines(model_all$net.benefit$threshold, model_all$net.benefit$all, type="l", col="red", lwd=2) lines(model_all$net.benefit$threshold, model_all$net.benefit$none, type="l", col="red", lwd=2, lty=2) lines(model_all$net.benefit$threshold, model_all$net.benefit$p1, type="l", col="blue") lines(model_marker$net.benefit$threshold, model_marker$net.benefit$p2, type="l", col = "green", lty=2) legend("topright", cex=0.8, legend=c("All", "Molde All", "Model Marker", "None"), col=c("red", "blue", "green", "red"), lwd=c(2, 2, 2, 2), lty=c(1, 1, 2, 2)) 

7. 预测模型评价——DCA曲线

方法二:dca法

dca$p3<-1-dca$p1 dca$p4<-1-dca$p2 dcurves::dca(Surv(ttcancer, cancer) ~ p3+p4, time = 1.5, label = list(p3 = "Model All",p4 = "Model Marker"), data = dca) %>% plot(smooth = TRUE) + ggplot2::labs(x = "Treatment Threshold Probability")

需要注意:对p1,p2计算其补数,用其补数绘图。

7. 预测模型评价——DCA曲线

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/120384.html

(0)
上一篇 2025-10-30 08:20
下一篇 2025-10-30 08:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信