本文首发于公众号:医学和生信笔记

医学和生信笔记,专注R语言在临床医学中的使用,R语言数据分析和可视化。主要分享R语言做医学统计学、meta分析、网络药理学、临床预测模型、机器学习、生物信息学等。

前面介绍了超多DCA的实现方法,基本上常见的方法都包括了,代码和数据获取方法也给了大家。

今天介绍的是如何实现其他模型的DCA,比如lasso回归、随机森林、决策树、SVM、xgboost等。

这是基于dca.r/stdca.r实现的一种通用方法,不过我在原本的代码上做了修改,原代码会在某些数据集报错。

  • 多个模型多个时间点DCA数据提取并用 ggplot2画图
  • lasso回归的DCA
  • 随机森林的DCA

多个时间点多个cox模型的数据提取

其实ggDCA包完全可以做到,只要1行代码就搞定了,而且功能还很丰富。

我给大家演示一遍基于stdca.r的方法,给大家开阔思路,代码可能不够简洁,但是思路没问题,无非就是各种数据整理与转换。

而且很定会有人对默认结果不满意,想要各种修改,下面介绍的这个方法非常适合自己进行各种自定义!

rm(list = ls())
library(survival)
library(dcurves)
data("df_surv")# 加载函数
source("../000files/stdca.R") # 原函数有问题# 构建一个多元cox回归
df_surv$cancer <- as.numeric(df_surv$cancer) # stdca函数需要结果变量是0,1
df_surv <- as.data.frame(df_surv) # stdca函数只接受data.frame
# 建立多个模型
cox_fit1 <- coxph(Surv(ttcancer, cancer) ~ famhistory+marker, data = df_surv)
cox_fit2 <- coxph(Surv(ttcancer, cancer) ~ age + famhistory + marker, data = df_surv)
cox_fit3 <- coxph(Surv(ttcancer, cancer) ~ age + famhistory, data = df_surv)# 计算每个模型在不同时间点的概率
df_surv$prob11 <- c(1-(summary(survfit(cox_fit1, newdata=df_surv), times=1)$surv))
df_surv$prob21 <- c(1-(summary(survfit(cox_fit2, newdata=df_surv), times=1)$surv))
df_surv$prob31 <- c(1-(summary(survfit(cox_fit3, newdata=df_surv), times=1)$surv))df_surv$prob12 <- c(1-(summary(survfit(cox_fit1, newdata=df_surv), times=2)$surv))
df_surv$prob22 <- c(1-(summary(survfit(cox_fit2, newdata=df_surv), times=2)$surv))
df_surv$prob32 <- c(1-(summary(survfit(cox_fit3, newdata=df_surv), times=2)$surv))df_surv$prob13 <- c(1-(summary(survfit(cox_fit1, newdata=df_surv), times=3)$surv))
df_surv$prob23 <- c(1-(summary(survfit(cox_fit2, newdata=df_surv), times=3)$surv))
df_surv$prob33 <- c(1-(summary(survfit(cox_fit3, newdata=df_surv), times=3)$surv))

计算threshold和net benefit:

cox_dca1 <- stdca(data = df_surv, outcome = "cancer", ttoutcome = "ttcancer", timepoint = 1, predictors = c("prob11","prob21","prob31"),smooth=TRUE,graph = FALSE)cox_dca2 <- stdca(data = df_surv, outcome = "cancer", ttoutcome = "ttcancer", timepoint = 2, predictors = c("prob12","prob22","prob32"),smooth=TRUE,graph = FALSE)cox_dca3 <- stdca(data = df_surv, outcome = "cancer", ttoutcome = "ttcancer", timepoint = 3, predictors = c("prob13","prob23","prob33"),smooth=TRUE,graph = FALSE)library(tidyr)
library(dplyr)

第一种数据整理方法

cox_dca_df1 <- cox_dca1$net.benefit
cox_dca_df2 <- cox_dca2$net.benefit
cox_dca_df3 <- cox_dca3$net.benefitnames(cox_dca_df1)[2] <- "all1"
names(cox_dca_df2)[2] <- "all2"
names(cox_dca_df3)[2] <- "all3"tmp <- cox_dca_df1 %>% left_join(cox_dca_df2) %>% left_join(cox_dca_df3) %>% pivot_longer(cols = contains(c("all","sm","none")),names_to = "models",values_to = "net_benefit")

画图:

library(ggplot2)
library(ggsci)ggplot(tmp, aes(x=threshold,y=net_benefit))+geom_line(aes(color=models),size=1.2)+scale_x_continuous(labels = scales::label_percent(accuracy = 1),name="Threshold Probility")+scale_y_continuous(limits = c(-0.05,0.3),name="Net Benefit")+theme_bw(base_size = 14)

image-20220620210549181

第二种数据整理方法

cox_dca_df1 <- cox_dca1$net.benefit
cox_dca_df2 <- cox_dca2$net.benefit
cox_dca_df3 <- cox_dca3$net.benefitcox_dca_long_df1 <- cox_dca_df1 %>% rename(mod1 = prob11_sm,mod2 = prob21_sm,mod3 = prob31_sm) %>% select(-4:-6) %>% mutate(time = "1") %>% pivot_longer(cols = c(all,none,contains("mod")),names_to = "models",values_to = "net_benefit")cox_dca_long_df2 <- cox_dca_df2 %>% rename(mod1 = prob12_sm,mod2 = prob22_sm,mod3 = prob32_sm) %>% select(-4:-6) %>% mutate(time = "2") %>% pivot_longer(cols = c(all,none,contains("mod")),names_to = "models",values_to = "net_benefit")cox_dca_long_df3 <- cox_dca_df3 %>% rename(mod1 = prob13_sm,mod2 = prob23_sm,mod3 = prob33_sm) %>% select(-4:-6) %>% mutate(time = "3") %>% pivot_longer(cols = c(all,none,contains("mod")),names_to = "models",values_to = "net_benefit")tes <- bind_rows(cox_dca_long_df1,cox_dca_long_df2,cox_dca_long_df3)

画图:

ggplot(tes,aes(x=threshold,y=net_benefit))+geom_line(aes(color=models,linetype=time),size=1.2)+scale_x_continuous(labels = scales::label_percent(accuracy = 1),name="Threshold Probility")+scale_y_continuous(limits = c(-0.05,0.3),name="Net Benefit")+theme_bw(base_size = 14)

image-20220620210600477

这种方法可以分面。

ggplot(tes,aes(x=threshold,y=net_benefit))+geom_line(aes(color=models),size=1.2)+scale_y_continuous(limits = c(-0.05,0.3),name="Net Benefit")+scale_x_continuous(labels = scales::label_percent(accuracy = 1),name="Threshold Probility")+scale_y_continuous(limits = c(-0.05,0.3),name="Net Benefit")+theme_bw(base_size = 14)+facet_wrap(~time)

image-20220620210611550

接下来演示其他模型的DCA实现方法,这里就以二分类变量为例,生存资料的DCA也是一样的,就是需要一个概率而已!

lasso回归

rm(list = ls())
suppressMessages(library(glmnet))
suppressPackageStartupMessages(library(tidyverse))

准备数据,这是从TCGA下载的一部分数据,其中sample_type是样本类型,1代表tumor,0代表normal,我们首先把因变量变为0,1。然后划分训练集和测试集。

df <- readRDS(file = "df_example.rds")df <- df %>% select(-c(2:3)) %>% mutate(sample_type = ifelse(sample_type=="Tumor",1,0))ind <- sample(1:nrow(df),nrow(df)*0.6)train_df <- df[ind,]
test_df <- df[-ind,]

构建lasso回归需要的参数值。

x <- as.matrix(train_df[,-1])
y <- train_df$sample_type

建立lasso回归模型:

cvfit = cv.glmnet(x, y, family = "binomial")
plot(cvfit)

image-20220620210638613

在测试集上查看模型表现:

prob_lasso <- predict(cvfit,newx = as.matrix(test_df[,-1]),s="lambda.1se",type="response") #返回概率

然后进行DCA,也是基于训练集的:

source("../000files/dca.r")test_df$lasso <- prob_lassodf_lasso <- dca(data = test_df, # 指定数据集,必须是data.frame类型outcome="sample_type", # 指定结果变量predictors="lasso", # 指定预测变量probability = T)

image-20220620210647973

这就是lasso的DCA,由于数据和模型原因,这个DCA看起来很诡异,大家千万要理解实现方法!

library(ggplot2)
library(ggsci)
library(tidyr)df_lasso$net.benefit %>% pivot_longer(cols = -threshold, names_to = "type", values_to = "net_benefit") %>% ggplot(aes(threshold, net_benefit, color = type))+geom_line(size = 1.2)+scale_color_jama(name = "Model Type")+ scale_y_continuous(limits = c(-0.02,1),name = "Net Benefit")+ scale_x_continuous(limits = c(0,1),name = "Threshold Probility")+theme_bw(base_size = 16)+theme(legend.position = c(0.2,0.3),legend.background = element_blank())

image-20220620210702828

随机森林

library(ranger)rf <- ranger(sample_type ~ ., data = train_df)prob_rf <- predict(rf,test_df[,-1],type = "response")$predictions
test_df$rf <- prob_rfdf_rf <- dca(data = test_df, # 指定数据集,必须是data.frame类型outcome="sample_type", # 指定结果变量predictors="rf", # 指定预测变量probability = T,graph = F)
df_rf$net.benefit %>% pivot_longer(cols = -threshold, names_to = "type", values_to = "net_benefit") %>% ggplot(aes(threshold, net_benefit, color = type))+geom_line(size = 1.2)+scale_color_jama(name = "Model Type")+ scale_y_continuous(limits = c(-0.02,1),name = "Net Benefit")+ scale_x_continuous(limits = c(0,1),name = "Threshold Probility")+theme_bw(base_size = 16)+theme(legend.position = c(0.2,0.3),legend.background = element_blank())

image-20220620210725069

logistic

logis <- glm(sample_type ~ ., data = train_df,family = binomial())prob_logis <- predict(logis, test_df[,-1],type = "response")
test_df$logis <- prob_logisdf_logis <- dca(data = test_df, # 指定数据集,必须是data.frame类型outcome="sample_type", # 指定结果变量predictors="logis", # 指定预测变量probability = T,graph = T)

image-20220620210736140

还有其他比如k最近邻、支持向量机等等等等,就不一一介绍了,实现原理都是一样的,就是需要一个概率而已。

需要修改后的 stdca.r 脚本的,赞赏5元,截图发我即可~

本文首发于公众号:医学和生信笔记

医学和生信笔记,专注R语言在临床医学中的使用,R语言数据分析和可视化。主要分享R语言做医学统计学、meta分析、网络药理学、临床预测模型、机器学习、生物信息学等。

本文由 mdnice 多平台发布

适用于一切模型的决策曲线分析DCA相关推荐

  1. R语言自定义变成进行决策曲线分析DCA曲线绘制(Decision Curve Analysis)

    R语言自定义变成进行决策曲线分析DCA曲线绘制(Decision Curve Analysis) 我们可能使用别的语言获得了机器学习模型以及对应的预测概率和标签,我们想直接使用这些信息进行DCA曲线的 ...

  2. 生存资料决策曲线分析DCA

    本文首发于公众号:医学和生信笔记 " 医学和生信笔记,专注R语言在临床医学中的使用,R语言数据分析和可视化.主要分享R语言做医学统计学.meta分析.网络药理学.临床预测模型.机器学习.生物 ...

  3. Python - matplotlib - 决策曲线分析(Decision Curve Analysis)

    文章目录 一.决策曲线分析概念 1. 阈值概率 2. 净获益 二.matplotlib实现 1. 计算模型带来的净获益 2. 计算treat all策略带来的净获益 3. 绘制决策曲线 三.完整代码 ...

  4. DecisionCurve决策曲线分析法

    这里有一份示例数据,是NHLBI(美国国家心肺血液研究所)的Framingham心脏研究专项数据集的一个子集,4000多个样本. 自变量分别为性别(sex).收缩压(sbp).舒张压(dbp).血清胆 ...

  5. 决策曲线拆解分析兼随机森林DCA绘制

    临床决策曲线(DCA)解析兼绘制随机森林的DCA曲线(R) 临床决策曲线的独特作用 协助决定阈值:cost-benefit 比值的概念和净收益的概念对临床决策阈值的选择都有重要的参考作用. 协助选择模 ...

  6. DCA决策曲线的解读和代码实现

    0.决策曲线 决策曲线分析法(Decision Curve Analysis,DCA)是个与ROC曲线相提并论的相对比较新的模型评价方法. 关于它的原理,长篇大论的医学统计学知识解读实在不是我的强项, ...

  7. Topic 15. 临床预测模型之决策曲线 (DCA)

    点击关注,桓峰基因 桓峰基因 前言 DCA (Decision Curve Analysis) 是一种评估临床预测模型.诊断试验和分子标记物的简单方法.传统的诊断试验指标如:敏感性,特异性和ROC曲线 ...

  8. 手把手教你使用stata制作临床决策曲线

    DCA(Decision Curve Analysis)临床决策曲线是一种用于评价诊断模型诊断准确性的方法,在2006年由AndrewVickers博士创建,我们通常判断一个疾病喜欢使用ROC曲线的A ...

  9. 决策曲线 Decision Curve

    本文转自:决策曲线分析法(Decision Curve Analysis,DCA) 简介 评价一种诊断方法是否好用,一般是作ROC曲线,计算AUC.但是,ROC只是从该方法的特异性和敏感性考虑,追求的 ...

最新文章

  1. STM32的串口函数_库函数USART_SendData问题和解决方法--硬件复位导致第一个字节丢失
  2. LeetCode 08字符串转整数09回文数
  3. Oracle ADF和Oracle Jet一起工作。 建筑模式
  4. 【WebRTC---序篇】(一)为什么要使用WebRTC
  5. php 逗号编码,php有几种编码
  6. rust卡领地柜权限_RFID智能医疗耗材柜,上海智能高值耗材柜,国药智能医用耗材柜...
  7. LeetCode 1580. 把箱子放进仓库里 II(排序)
  8. 如何编写一份合格的测试计划
  9. Crontab定时任务表达式
  10. 工商银行Java技术笔试题
  11. 不写一行代码,让Excel轻松制作动态图表​
  12. 用傅里叶卷积实现万物隐身!三星这个LaMa神器可试玩!
  13. 小功能⭐️U3D异步加载功能
  14. pgpool读写分离,配置设置及调研
  15. 调焦距离S远近与景深之关系
  16. 检测你的黑苹果系统主板是否支持原生NVRAM
  17. 3分钟教你图解Bitmap编码传输
  18. 经典C++笔试题目100例,接近实际,值得一看!
  19. Windows同步任意个人文件夹到OneDrive
  20. [洛谷] P1168 中位数

热门文章

  1. 智慧医疗应用现状分析
  2. python判断正数还是负数_python判断正负数方式
  3. 计算机辅助物理化学实验 唐典勇课后答案,表面张力测定数据的模型拟合及MATLAB处理.pdf...
  4. 【SLAM】LIO-SAM解析——后端优化mapOptimization(5)
  5. 如何轻松审核通过马甲包
  6. Python 实战之 什么是量化交易?它与python之间的关系
  7. python 离散化_数据离散化与Python实现
  8. 自动驾驶需要哪些关键技术?
  9. 第09篇 Compose-03 操作详解
  10. CPU数据预取对软件性能的影响