TCGA+biomarker——决策曲线分析法(DCA)

DCA曲线简介

DCA是一种评估临床预测模型、诊断试验和分子标记物的简单方法。传统的诊断试验指标如:敏感性,特异性和ROC曲线下面积仅测量预测模型的诊断准确性,未能考虑特定模型的临床效用,而 DCA的优势在于它将患者或决策者的偏好整合到分析中。这种理念的提出满足了临床决策的实际需要,在临床分析中的应用日益广泛。

DCA曲线案例

不同风险预测模型的DCA图

image

DCA曲线的解释

下图中作者构建了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技能修炼”~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351