查看原文
其他

R语言画多时间点ROC和多指标ROC曲线

阿越 医学和生信笔记 2023-02-25

本次例子用到的R包有timeROCsurvival等。

多个时间点的ROC曲线和多个指标的ROC曲线在生信文章中很常见,今天简单介绍一下这两种图的R语言画法。

大佬曾说过,数就是图,图就是数,你想画出什么样的图,你就得提前准备好什么样的数据,只要数据格式正确,剩下的就是输入数据,输出图。

多个时间点的ROC曲线

加载R包和数据

rm(list = ls())
library(timeROC)
library(survival)

load(file = "../000files/timeROC.RData") # 这是我自己的数据,可以根据数据格式自己造一个

看一下画图所需的数据长什么样子,event这一列,0代表living,1代表dead,futime这一列单位是年,也可以改成其他的。数据很长,这里只展示前几行。

eventriskScorefutime
0-0.24932573.0275000
0-0.51110571.1558333
1-0.21130561.8191667
.........

画图

#下面是画图代码

ROC <- timeROC(T=df$futime,
delta=df$event,
marker=df$riskScore,
cause=1, #阳性结局指标数值
weighting="marginal", #计算方法,默认为marginal
times=c(1, 2, 3), #时间点,选取1年,3年和5年的生存率
iid=TRUE)

plot(ROC,
time=1, col="red", lwd=2, title = "") #time是时间点,col是线条颜色
plot(ROC,
time=2, col="blue", add=TRUE, lwd=2) #add指是否添加在上一张图中
plot(ROC,
time=3, col="orange", add=TRUE, lwd=2)

#添加标签信息
legend("bottomright",
c(paste0("AUC at 1 year: ",round(ROC[["AUC"]][1],2)),
paste0("AUC at 2 year: ",round(ROC[["AUC"]][2],2)),
paste0("AUC at 3 year: ",round(ROC[["AUC"]][3],2))),
col=c("red", "blue", "orange"),
lty=1, lwd=2,bty = "n")

这就是一张简单的多个时间点的ROC曲线,可以根据自己的喜好继续更改。

多指标的ROC曲线

加载数据和R包

首先也是看一下所需要的数据结构,其中futime和event是必须的,另外的几列是你想要用来画ROC曲线图的指标,可以自己添加,在这里我使用了riskScore, gender, TNM分期。在gender这一列,1是female,2是male,t,n,m这3列,数字代表不同的分期

knitr::kable(df2[1:10,])

数据结构如下所示:

接下来就是画图

# riskScore的ROC曲线
ROC.risk <- timeROC(T=df2$futime,
delta=df2$event,
marker=df2$riskScore,
cause=1,
weighting="marginal",
times=3,
iid=TRUE)
# gender的ROC曲线
ROC.gender <- timeROC(T=df2$futime,
delta=df2$event,
marker=df2$gender,
cause=1,
weighting="marginal",
times=3,
iid=TRUE)
# age的ROC曲线
ROC.age <- timeROC(T=df2$futime,
delta=df2$event,
marker=df2$age,
cause=1,
weighting="marginal",
times=3,
iid=TRUE)
# T分期的ROC曲线
ROC.T <- timeROC(T=df2$futime,
delta=df2$event,
marker=df2$t,
cause=1,
weighting="marginal",
times=3,
iid=TRUE)
# N分期的ROC曲线
ROC.N <- timeROC(T=df2$futime,
delta=df2$event,
marker=df2$n,
cause=1,
weighting="marginal",
times=3,
iid=TRUE)
# M分期的ROC曲线
ROC.M <- timeROC(T=df2$futime,
delta=df2$event,
marker=df2$m,
cause=1,
weighting="marginal",
times=3,
iid=TRUE)
# 拼图
plot(ROC.risk, time = 3, col="#E41A1C", lwd=2, title = "")
plot(ROC.gender, time = 3, col="#A65628", lwd=2, add = T)
plot(ROC.age, time = 3, col="#4DAF4A", lwd=2, add = T)
plot(ROC.T, time = 3, col="#377EB8", lwd=2, add = T)
plot(ROC.N, time = 3, col="#984EA3", lwd=2, add = T)
plot(ROC.M, time = 3, col="#FFFF33", lwd=2, add = T)
legend("bottomright",
c(paste0("Risk score: ",round(ROC.risk[["AUC"]][2],2)),
paste0("gender: ",round(ROC.gender[["AUC"]][2],2)),
paste0("age: ",round(ROC.age[["AUC"]][2],2)),
paste0("T: ",round(ROC.T[["AUC"]][2],2)),
paste0("N: ",round(ROC.N[["AUC"]][2],2)),
paste0("M: ",round(ROC.M[["AUC"]][2],2))
),
col=c("#E41A1C", "#A65628", "#4DAF4A","#377EB8","#984EA3","#FFFF33"),
lty=1, lwd=2,bty = "n")

代码很长,但是并不复杂,只是简单的重复不同的指标,然后拼到一张图上即可,最后加上图例就大功告成了!出图如下:以上就是今天的内容,希望大家都能学会。如有不足敬请留言!

欢迎大家关注我的公众号:医学和生信笔记

医学和生信笔记 公众号主要分享:1.医学小知识、肛肠科小知识;2.R语言和Python相关的数据分析、可视化、机器学习等;3.生物信息学学习资料和自己的学习笔记!


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存