DCA(Decision Curve Analysis)临床决策曲线是一种用于评价诊断模型诊断准确性的方法,在2006年由AndrewVickers博士创建,我们通常判断一个疾病喜欢使用ROC曲线的AUC值来判定模型的准确性,但ROC曲线通常是通过特异度和敏感度来评价,实际临床中我们还应该考虑,假阳性和假阴性对病人带来的影响,因此在DCA曲线中引入了阈概率和净获益的概念。
据我所知目前R语言官网CRAN上(github上没有查过),能做竞争风险模型决策曲线的R包非常少,除了dcurves包,几乎就是目前我写的ggscidca包了。在新版的ggscidca包支持竞争风险模型决策曲线绘制,咱们使用下面代码安装ggscidca包,安装了旧版本的在安装一次就可以更新到新版本。
install.packages("ggscidca")
下面我来演示一下怎么使用ggscidca包进行竞争风险模型决策曲线绘制,一共需要3步,我自认为还是相对简单的。ggscidca包对于竞争风险模型生存概率的计算依赖于cmprsk包
我们先导入R包和数据,数据使用ggscidca自带的df_surv数据
library(survival)
library(reshape2)
library(ggplot2)
library(ggscidca)
library(cmprsk)
df_surv<-df_surv
这个数据我简单介绍一下,cancer_cr是结局变量,diagnosed with cancer是死于癌症,dead other causes表示死于其他原因,算是竞争因素了,censor
表示生存,ttcancer表示生存时间,其他的是一些协变量 。刚才我说了,绘制竞争风险模型需要3步,
第一步就是整理数据,建立生存分析模型,整理数据中最重要的一步就是把结局变量变成0,1,2形式,0表示生存,1表示你感兴趣的结局,2表示竞争风险。这步不做就没法分析,你原先就是0,1,2形式的不用改,直接下一步就行
df_surv$cancer_cr<-ifelse(df_surv$cancer_cr=="diagnosed with cancer",1,
ifelse(df_surv$cancer_cr=="dead other causes",2,0))
改好后就是建立生存分析模型,这里因为有两个结局变量,因此咱们要选取自己感兴趣的结局变量。
cox_model <- coxph(Surv(ttcancer, cancer_cr==1) ~ age + famhistory + marker, data = df_surv)
建立好模型后,第一步完成,第二部就是把模型转成竞争风险模型类型
cox_model1<-newcrr(cox_model)
这样第二部也完成了,第三步直接绘图就行,和生存分析一样,timepoint不填入的话就自动选择中位数生存时间,这里我选择1.5年
scidca(cox_model1,timepoint=1.5,newdata = df_surv)
这样就绘制完成啦,还算比较简单的把,如果你需要验证集的决策曲线,newdata这里填入验证集的数据就可以了。
还有一些调整,可以参看既往文章《R语言使用 ggscidca包优雅的绘制随机森林决策曲线》,例如加上虚线
加上阈值
scidca(cox_model1,timepoint=1.5,newdata = df_surv,threshold.line = T,threshold.text = T)
表明在模型6%-87%这个阈值是获益的,位置还可以调,我这里就不调了。来个普通决策曲线也是可以的
scidca(cox_model1,timepoint=1.5,newdata = df_surv,colbar = F)
普通的决策曲线也是可以加阈值的
scidca(cox_model1,timepoint=1.5,newdata = df_surv,colbar = F,threshold.text = T)
然而对于df_surv这个数据,ggscidca包绘制的竞争风险决策曲线和dcurves包是不一样的,下图左边是dcurves包,右边是ggscidca包
对于不同的结果, ggscidca包的结果是根据决策曲线发明者大佬AndrewVickers博士提供的stdca.R函数生成结果的,stdca.R函数其实是可以进行竞争风险模型分析的,但是stdca.R单独生成结果有点小问题(其实不算问题,应该认知不同),我稍微修改了一点,让它更易于分析竞争风险模型(核心代码没有动),我反复比对了stdca.R的代码原理和数据生成的结果,认为没有错,那只能是dcurves包错了。
欢迎斧正。