DCA曲线简介
DCA是一种评估临床预测模型、诊断试验和分子标记物的简单方法。传统的诊断试验指标如:敏感性,特异性和ROC曲线下面积仅测量预测模型的诊断准确性,未能考虑特定模型的临床效用,而 DCA的优势在于它将患者或决策者的偏好整合到分析中。这种理念的提出满足了临床决策的实际需要,在临床分析中的应用日益广泛。
DCA曲线案例
不同风险预测模型的DCA图
imageDCA曲线的解释
下图中作者构建了3个诊断模型:A:u-PCX单变量模型;B:除u-PCX以外的临床参数模型(临床模型);C:u-PCX和临床参数的组合模型。分别在建模和验证人群中通过DCA曲线来比较三个模型的临床诊断价值。
image图中有AB两个图形,A图表示在训练人群中进行DCA分析,而B图则在验证人群中进行DCA分析。我们主要以A图为例进行介绍:A图的横坐标为阈概率:在风险评价工具中,患者i诊断为膜性肾病的概率记为Pi;当Pi达某个阈值(记为Pt),就界定为阳性,采取治疗措施。此时会有病人治疗的获益(利),也会有非病人治疗的伤害以及病人未治疗的损失(弊)。而纵坐标就是利减去弊之后的净获益(Net Benefit, NB)。A图中的三条曲斜线分别代表三种不同的临床诊断模型(见图例标识),除此之外,还有两条线,它们代表两种极端情况。横的那条表示所有样本都是阴性(Pi < Pt),所有人都不治疗,净获益为0。斜的那条表示所有样本都是阳性,所有人都接受了治疗,净获益是个斜率为负值的反斜线。
从图中可以看出,model-A曲线和两条极端曲线很接近,也就是说它没什么应用价值。而在一个很大的Pt区间范围内,model-B和model-C的获益都比极端曲线高,所以它们可选的Pt范围都比较大,相对安全。而model-C又比model-B更好一些。
接下来,我们来看一下如何对曲线上的点进行解释:假定我们选择预测概率为60%诊断膜性肾病并进行治疗,那么每100人使用模型C的患者,有18人能从中获益而不损伤任何其它人的利益; 每100人使用模型B的患者,有8人能从中获益而不损伤任何其它人的利益, 每100人使用模型A的患者,没有人能获益。
图片来源:Urinary Podocalyxin as a Biomarker to Diagnose Membranous Nephropath,文章主要讲述了利用尿Podocalyxin标志物诊断膜性肾病的故事。
DCA曲线的绘制
DCA的绘制方法,这里主要针对cox回归模型进行分析。以下具体代码展示的是临床研究与医学统计公共号的生存资料的决策曲线分析 (Decision Curve Analysis )这篇教程中内容,代码流程很清楚,易于初学者理解。
#该数据下载链接:https://www.mskcc.org/sites/default/files/node/4509/documents/decisioncurveanalysis.zip
#该数据就是临床信息数据,若有自己的数据,用自己的数据即可。
data.set <- read.table("dca.txt", header=TRUE, sep="\t")
attach(data.set)
str(data.set)
# 这是一个数据框结构的生存数据,750个观测,10个变量:
# patientid : 编号 。
# cancer : 是否发生癌症,二分类,1表示罹患癌症,0表示未患癌症。因变量 。
# dead : 是否死亡,二分类,1表示死亡,0表示存活 。
# ttcancer : 从随访开始到发生癌症的时间,连续变量。时间变量 。
# risk_group : 危险因素分组,因子变量,等级变量,3 = “high”, 2 = “intermediate”, 1 =“low”
# casecontrol : 分组变量,二分类,1 = “case”,0 = “control” $ age : 年龄,连续变量 。
# famhistory : 家族史,0 = no, 1 = yes $ marker : 某标志物水平,连续变量 。
# cancerpredmarker: 肿瘤标志物水平,连续变量。
#使用source()函数载入MSKCC网站上下载的源代码,需提前下载该源代码并保存至当前工作路径中
# 具体下载地址:https://www.mskcc.org/sites/default/files/node/4509/documents/downloadrcode.zip
source("stdca.R")
# 后续我们直接使用该函数定义的生存资料DCA分析的stdca()函数即可。
# 函数用法如下:
# stdca(data, outcome, predictors, timepoint, xstart=0.01, xstop=0.99, xby=0.01, ymin=-0.05,
# probability=NULL, harm=NULL, graph=TRUE,
# intervention=FALSE, interventionper=100, smooth=FALSE, loess.span=0.10, cmprsk=FALSE)
#--------------------------------多因素cox的DCA分析-----------------------------------------
library(survival)
#要定义一个生存函数对象,该对象包含研究的结局及发生结局的时间,即本例中即数据框的“cancer”和“ttcancer”两个变量。
Srv = Surv(data.set$ttcancer, data.set$cancer)
#使用survival包中的coxph函数构建Cox回归模型
coxmod <- coxph(Srv ~ age + famhistory + marker, data=data.set)
#根据coxmod生存函数计算1.5年时点的癌症发生率的补数,即未患癌症的发生率
data.set$pr_failure18 <- c(1 - (summary(survfit(coxmod,newdata=data.set), times=1.5)$surv))
#此步骤是必须的,根据前文所述及stdca()函数predictors参数项的规定,此处只能传入一个变量,显然使用模型的预测概率作为新的变量传入反应了整个模型的预测能力。
#此处如果只传入一个预测因素,则仅代表某个因素的因素对于结局的预测能力,而非整个模型的预测能力。
#使用stdca()函数进行DCA分析
stdca(data=data.set, outcome="cancer", ttoutcome="ttcancer", timepoint=1.5, predictors="pr_failure18", xstop=0.5, smooth=TRUE)
#data=data.set指定数据集, outcome=“cancer”定义二分类结局,
#ttoutcome=“ttcancer”定义时间变量, timepoint=1.5定义时间点1.5年,
#predictors=“pr_failure18”传入根据Cox回归模型计算的预测概率,此处需要指定这里传入的是概率,probability=TRUE,这也是默认设置。
# 如果用单个因素取值预测,则需设置为FALSE.
#接下来构建两个Cox回归模型
coxmod1 <- coxph(Srv ~ age + famhistory + marker, data=data.set)
coxmod2 <- coxph(Srv ~ age + famhistory + marker + risk_group, data=data.set)
#根据生存函数分别计算2个模型的1.5年时点的癌症发生率的补数,即未患癌症的发生率
data.set$pr_failure19 <- c(1 - (summary(survfit(coxmod1,newdata=data.set), times=1.5)$surv))
data.set$pr_failure20 <- c(1 - (summary(survfit(coxmod2,newdata=data.set), times=1.5)$surv))
#用stdca()函数对两个模型进行DCA分析
stdca(data=data.set, outcome="cancer", ttoutcome="ttcancer", timepoint=1.5,predictors=c("pr_failure19","pr_failure20"), xstop=0.5, smooth=TRUE)
#---------------------------------单因素Cox回归DCA分析------------------------------------------
# 使用MASS包中自带数据集Melanoma.
# 数据框结构,含7个变量,共205观测:
# time: 时间,连续变量。
# status: 结局变量,1表示死于黑色素瘤,2表示存活,3表示死去其他原因 。
# sex: 性别,1代表男,0代表女 。
# age: 连续变量 $ year: 手术年代,连续变量 。
# thickness: 肿瘤厚度,单位:mm 。
# ulcer: 肿瘤是否溃疡,1代表有溃疡,0代表无溃疡。
source("stdca.R")
library(MASS)
data.set <- Melanoma
data.set$diedcancer = ifelse(data.set$status==1, 1, 0)
stdca(data=data.set, outcome="diedcancer", ttoutcome="time",
timepoint=545,predictors="thickness", probability=FALSE, xstop=.25)
# 注意此处我们是用单个变量去预测结局,故“probability=FALSE”,其他参数设置基本相同!
往期回顾
TCGA+biomarker——常见结果展示
TCGA+biomarker——Sample基线表
TCGA+biomarker——单因素Cox回归
TCGA+biomarker——多因素Cox回归
TCGA+biomarker——Cox回归森林图
TCGA+biomarker——Calibration curve
TCGA+biomarker——C-index
更多内容可关注公共号“YJY技能修炼”~~~
网友评论