survival包学习笔记——cox回归(二)

上一篇关注单因素多因素cox模型的构建并在lung数据集中进行了实战
survival包学习笔记——cox回归(一) - 简书 (jianshu.com)
接下来我们继续上一篇谈一谈如何评价我们构建的模型,并且进一步可视化回归结果。

一、函数介绍

上篇我们已经介绍了cox回归的一大函数,survival包中的coxph函数,今天我们来说说另一自产自销的函数,rms::cph

cph(formula = formula(data), data=environment(formula),
weights, subset, na.action=na.delete,
method=c("efron","breslow","exact","model.frame","model.matrix"),
singular.ok=FALSE, robust=FALSE,
model=FALSE, x=FALSE, y=FALSE, se.fit=FALSE,
linear.predictors=TRUE, residuals=TRUE, nonames=FALSE,
eps=1e-4, init, iter.max=10, tol=1e-9, surv=FALSE, time.inc,
type=NULL, vartype=NULL, debug=FALSE, ...)
formula: 公式与coxph一致,使用Surv包装一下。Surv(time, status) ~ 变量
data:数据集
x:默认值为 FALSE。设置为 TRUE 可将扩展的design matrix作为返回的拟合对象的元素 x
y:默认值为 FALSE。设置为 TRUE 以返回响应值的向量(Surv 对象)作为拟合的元素 y

二、如何评价模型?

1. 区分度评价指标:C指数(C-Index),重新分类指数(Net reclassification index,NRI)
2. 一致性评价指标:校正曲线(Calibration plot)
3. 临床有效性评价指标:决策分析曲线(Decision Curve Analysis, DCA)

C指数: survival::coxph函数构建模型后自动计算,校正曲线和DCA都是通过rms构建的

1、Concordance index:

在使用survival::coxph时,C指数倒是不需要再求,summary一下拟合模型就可以看到:

image.png

或者
image.png

一般而言,我们将0.51-0.7认为是低可信度,0.71-0.9为中等可信度,> 0.9为高可信度

2、校正曲线(Calibration plot)

【参考】
临床预测模型列线图的评估:校准曲线 - 简书 (jianshu.com)
calibration_curve(校准曲线): 分类模型可视化技术之一 - 知乎 (zhihu.com)

模型构建完成后需要对模型进行评估和验证其性能。模型预测的生存率与实际的差距有多大呢?一般是看校准曲线。

例:一个模型(其C指数为0.8)评估某位患者5年复发率为70%。说明该模型有80%的把握确认复发率=70%。那70%这个数与实际相差有多大呢,那就需要看校准曲线了。

从这个例子可以看出,C指数或AUC值是判断模型的区分能力的,即有多大把握预测复发率为70%,而校准曲线是看与预测与实际相符程度的,即预测的这个70%复发率与实际复发率有多大差别。

3、决策分析曲线(Decision Curve Analysis, DCA)

【参考】
决策曲线分析法(Decision Curve Analysis,DCA)曲线 | Public Library of Bioinformatics (plob.org)
手把手教你用R画列线图(Nomogram)及解读结果 - 知乎 (zhihu.com)

三、cox回归结果展示

Cox结果主要包括:HR, HR_95%low, HR_95%high, P
我们最常用的展示方式就是森林图,同时森林图也是我们展示cox回归的最佳方式,我们来看发表的森林图:


JIM
image.png
Cancer Immunology Research
森林图绘制

数据准备,将cox回归的结果读入,

rm(list = ls())
load("RData/7. Clinical/MSC cox result.RData")

#森林图unicox_OS----
df <- unicox_OS[unicox_OS$p_val<0.1,]
rownames(df)[1] <- "MSC1"

gene <- rownames(df)
colnames(df)

hr <- sprintf("%.3f",df$"HR")
hrLow  <- sprintf("%.3f",df$"HR_l")
hrHigh <- sprintf("%.3f",df$"HR_H")
Hazard.ratio <- paste0(hr," (",hrLow,"-",hrHigh,")")

pVal <- ifelse(df$p_val<0.01, "<0.01", sprintf("%.3f", df$p_val))

使用基础函数绘制森林图,大致思路:将画布按照3:2分为两部分,将字和线段逐个打印上


#森林图
if(T){
  pdf(file="unicox_OS.pdf", width = 8,height = 3.5)
  
  n <- nrow(df)
  nRow <- n+1
  ylim <- c(1-0.5,nRow+0.5)
  layout(matrix(c(1,2),nc=2),width=c(3,2))
  
  #绘制森林图左边的基因信息
  par(mar=c(4,0.5,1,0))#上左下右
  xlim = c(0.4,2.5)
  plot(1,xlim=xlim,ylim=ylim,type="n",axes=F,xlab="",ylab="")
  text.cex=1
  text(0.4,n:1,gene,adj=0,cex=text.cex)
  text(1.3,n:1,pVal,adj=1,cex=text.cex)
  text(2.5,n:1,Hazard.ratio,adj=1,cex=text.cex)
  text(1.35,n+1,'P-value',cex=text.cex,font=2,adj=1)
  text(2.35,n+1,'HR (95% CI)',cex=text.cex,font=2,adj=1,)
  abline(h=n+1.3,col="black",lty=1,lwd=2);
  abline(h=n+0.6,col="black",lty=1,lwd=2);
  abline(h=0.6,col="black",lty=1,lwd=2)
  
  #绘制森林图
  par(mar=c(4,0,2,1),mgp=c(2,0.5,0))
  xlim = c(0,3)
  plot(1,xlim=xlim,ylim=ylim,type="n",axes=F,ylab="",xaxs="i",xlab="")
  arrows(as.numeric(hrLow),n:1,
         as.numeric(hrHigh),n:1,
         angle=0,code=3,length=0.01,col="black",lwd=2.5)
  abline(v=1.0,col="black",lty=2,lwd=1.5)
  boxcolor ="black"
  points(as.numeric(hr), n:1, pch = 18, cex=2,col = boxcolor)
  axis(1)
  
  dev.off()
}

image.png

当然,还有不少包装好的R包可以直接绘制森林图,感兴趣的小伙伴可以探索一下
总之呐,图是为了更好的展示,因此,结果最重要,对吧

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

推荐阅读更多精彩内容