Logistic、Cox生存分析结果如何可视化?用Nomogram肯定没问题






Logistic、Cox生存分析结果如何可视化?用Nomogram肯定没问题

大海哥  生信果  2023-08-08 19:02:28

点击蓝字 关注我们


小伙伴们大家好啊,大海哥之前分享过KM曲线图之后,有的小伙伴就问,Cox生存分析只用这个KM曲线展示不能够展示各个变量的表达趋势,有没有能够展示各个变量对于生存概率的作用展示的图,答案一定是有的,大海哥今天准备了一个Nomogram图分析案例给大家解疑答惑,不知道是啥?别着急,大海哥给你介绍一二。


Nomogram,也被称为诺莫图或者列线图,最早由爱尔兰数学家和工程师Joseph Fry于1885年发明,并且在20世纪上半叶得到广泛的使用。该图由一系列平行线段和轴线组成,每个线段表示一个特定变量。它被广泛应用于医学、统计学、生物学、环境科学等领域,用于预测风险、评估患者疾病风险、制定决策等,在医学领域的期刊出现频率也越来越多,常用于预测模型结果可视化和解释,它是一种直观而有效的工具,用于将复杂的预测模型转化为易于理解和使用的简单图表。正是由于Nomogram图能够将预测模型中的各个变量的影响程度可视化,并通过简单的几何形状展示各个变量之间的相对权重,所以我们一般都用其对Logistic回归或Cox回归的结果进行可视化呈现。


本次分析,大海哥就用TCGA-STAD胃癌临床数据来展开今天的分析,首先我们对数据进行一些简单的处理,使得其呈现下图这个格式



处理完后,我们开始我们的代码部分:

# 载入R包library(rms)library(survival)
# 读取LIHC数据STAD <- read.table("TCGA-STAD.txt",header=TRUE,sep= "t")head(STAD)



#注意数据的规范,必须是数值型数据或者分类型数据,不然是没办法开始分析的!#关键步骤:按照nomogram要求“打包”数据#可以输入??datadist查看详细说明#这一步是必须的哦!因为绘制nomogram图对于数据的格式有特殊要求,所以必须用其指定的datadist函数对数据进行处理,如果想只针对几个变量做处理,那就把变量名写进去就好了,例如这样ddist <- datadist(age, sex, Grade)dd=datadist(STAD)options(datadist="dd")
#构建逻辑回归模型f1 <- lrm(Status ~ Age + Sex + Grade , data =  STAD)#还可以使用fun.at属性指定结果范围区间,例如fun.at=c(.001, .01, .05, seq(.1,.9, by=.1), .95, .99, .999),有需要的小伙伴自行添加nom <- nomogram(f1, fun=plogis, lp=F, funlabel="Risk")#然后看看可视化结果吧!plot(nom)



#Cox回归模型相对来说要麻烦一点点,因为还需要涉及到不同时间点(3年、5年等等),那大海哥也准备了对应的代码教程,接下来就先构建COX回归模型然后进行可视化吧!#COX回归模型绘制Nomogram有两种方式,这里先展示COX回归中位生存时间的Nomogram## 构建COX比例风险模型f2 <- psm(Surv(OS,Status) ~ Age+Gender+Grade,data =  STAD, dist='lognormal')
med <- Quantile(f2) # 计算中位生存时间surv <- Survival(f2) # 构建生存概率函数
## 绘制COX回归中位生存时间的Nomogram图nom <- nomogram(f2, fun=function(x) med(lp=x),funlabel="Median Survival Time")plot(nom)



下面简单说下Nomogram怎么看?欲知年龄30岁的女性(sex=FEMALE)的生存概率,首先确定患者年龄为30岁,那就在列线图年龄为30岁的地方向上画一条垂直线,即可得到其对应的Points;女性,则在女性的地方画一条垂直线,以此类推,找出每个变量状态下对应的得分,相加得到总得分。

最后将患者的总得分再向下画一条垂直线,将此数值在Total points轴上向生存时间概率轴投射,就可以知道该患者对应的中位生存时间啦!

下面例子也一样,可以知道未来1年、5年的生存率,当然也可以是其他时间节点


#绘制COX回归生存概率的Nomogram图## STAD数据的time是以”天“为单位,此处绘制1年,3年的生存概率nom <- nomogram(f2, fun=list(function(x) surv(365, x),                            function(x) surv(1080, x),                            function(x) med(lp=x)),                            funlabel=c("1-year Survival Probability", "3-year Survival Probability","Median Survival Time"))plot(nom, xfrac=.2)



当然除了大海哥计算的1年和3年,大家也可以计算其他时间节点的生存率,同样加到list中即可,非常方便。总结一下Nomogram图,一共就五个基本元素包括:

轴:通常包含水平和垂直轴,每个轴表示模型中的一个预测变量。水平轴通常用于表示连续变量,而垂直轴通常用于表示分类变量。

刻度:每个轴上会有标记和刻度,用于显示变量的取值范围。

线:Nomogram图上会有一系列连接线,将各个变量的取值连接在一起。

点:每个变量的取值会用一个点在相应的轴上标记出来。

得分轴:Nomogram图的一侧通常会有一个额外的轴,用于显示最终预测结果的得分。


而Nomogram图的优点在于它能够直观地展示预测模型的效果,让非专业人士也能够轻松理解和使用预测结果。而且使用相对风险的指标(OR、HR)等统计之余,还可以结合列线图展示,能够起到预测生存概率的作用。总结而言它可以用于临床预测模型、风险评估、生存分析等领域,帮助医生、研究人员和决策者做出更好的决策。举例来说,一个医学Nomogram图可以用来评估患者的心血管疾病风险。在图上,横轴可能表示年龄,纵轴可能表示胆固醇水平,平行线段连接着这些变量,并标记着相应的数值。当医生知道患者的年龄和胆固醇水平时,只需在图上对应的线段交汇处,即可找到该患者的心血管疾病风险等级。


So,如此优秀的一种作图方式,屏幕前的你没有掌握的话岂不是说不过去?快快拿手头上的临床数据动手试一试吧!