分享

R数据分析:生存分析的列线图的理解与绘制详细教程

 CodewarCodewar 2023-03-30 发布于山东

列线图作为一个非常简单明了的临床辅助决策工具,在临床中用的(发文章的)还是比较多的,尤其是肿瘤预后:

Nomograms are widely used for cancer prognosis, primarily because of their ability to reduce statistical predictive models into a single numerical estimate of the probability of an event, such as death or recurrence, that is tailored to the profile of an individual patient.

找个公开数据库做生存分析出个列线图,然后出个文章是很多临床同学可以依赖的较容易的实现路径,之前有给大家介绍过列线图,今天开始再给大家比较详细地写写生存分析列线图系列,希望可以对大家有帮助。

理解列线图

要弄明白生存分析的列线图的出图逻辑。我们首先来回顾下cox模型究竟是拟合是什么东西,看下图:

在基础风险确定后,乘上以e为底数的指数函数(我们关心的协变量的线性部分是在指数上)就可以得到风险函数(为什么能这么做就涉及到比例风险假设)。通过线性部分的指数函数和基础风险我们cox模型最终得到的是hazard function。

通过hazard function我们可以得到hazard rate,但是对于临床应用来讲,临床医师关心的东西更直观,他们关心的是具体协变量条件下个体的生存概率,画出的列线图常常如下面所示:

列线图中的结局常常是某个时间点的生存概率,这就要求我们在统计处理上做出转换。就是将风险函数转换成生存函数进而得到预测的生存概率。

接下来我们就来详细地过一遍实操重点。

本文中涉及到的文献图片和方法描述均来自JAMA Surg杂志的文章,文章引用如下:

Hyder O, Marques H, Pulitano C, et al. A Nomogram to Predict Long-term Survival After Resection for Intrahepatic Cholangiocarcinoma: An Eastern and Western Experience. JAMA Surg. 2014;149(5):432–438. doi:10.1001/jamasurg.2013.5168

变量选择

首先看变量筛选,经常我们用来做模型的数据库中有很多变量,列线图作为一个临床应用工具,变量肯定是越少越好的(让医生算分算半个多小时总分总是不合适推广的嘛,虽然大家做论文都不关心临床转换,但是还要有这个意识比较好),所以必须精选,这篇文章用到的方法叫做Backward stepwise selection:

Backward stepwise selection using the AIC in Cox proportional hazards regression modeling identified 6 variables that were the most associated with survival: age, tumor size, multiple lesions, nodal status, vascular invasion, and presence of cirrhosis of the underlying liver

我看生存分析列线图的文章这个方法用得还是比较普遍的哈,基本都是单变量筛过之后再来个stepwise selection:

整体这个方法在R中操作也是非常方便的,像rms包中专门就有fastbw函数进行倒退法的逐步筛选。

可以用aic为标准,也可以用p值为标准进行筛,很方便的。

用生存分析模型出列线图

首先明确,同学们不要再称呼“列线图模型”了,列线图只是具体模型的可视化、工具化表示,他本身不是模型。模型本身具体要看你到底做的是什么统计模型,比如逻辑模型,比如线性回归模型,再比如今天写的COX模型,这个才叫模型。

A nomogram is a graphical representation of a mathematical model involving several pre- dictors to predict a particular endpoint based on traditional statistical methods such as Cox proportional hazards model for survival data or logistic regression for binary outcome

好多同学问我能不能帮忙做一个列线图模型,其实这种表达我是摸不着头脑的。

出列线图,首先要确定内在的统计模型,比如今天写生存数据的列线图,我就要先做一个COX模型,然后再借助nomogram函数出图,这个函数的参数很多,下图只是部分参数:

可以看到这个函数需要的第一个参数就是一个做好的模型fit。具体到生存分析的列线图,我们就需要先跑一个cox模型出来,然后对跑模型的数据集d进行下面的操作:

ddist <- datadist(d); options(datadist='ddist')

生存分析的列线图需要调节的地方可以有很多。

比如我们做一个生存分析,在nomogram函数中不设定任何参数直接去出列线图的话,出出来的图是这样的:

图中只会有cox模型线性部分的预测值,这个时候我们需要将线性预测值转换为生存概率才符合临床应用实际,就像下图发表中的文献一样:

此时要做的就是进行风险函数和生存概率函数的转换。我们需要设定转换的代码如下:

surv <- Survival(f)

通过上面的代码我们就可以将cph函数拟合出来的风险函数转换成生存函数,从而在列线图的绘制中我们可以规定显示具有临床意义的时间点的某个个体的生存概率。比如我想得到3年和6年的生存概率为结局的列线图,我就可以写出如下代码:

plot(nomogram(f, fun=list(function(x) surv(3, x),
function(x) surv(6, x)),
funlabel=c("age 3 Survival Probability",
"age 6 Survival Probability"))

上面的代码中f是cph对象,fun中给定的就是将线性预测值转换成生存概率的函数,运行代码即可出图如下:

并且针对nomogram可以做很多的个性化的修饰,比如lp参数可以控制是否显示线性预测值的打分轴,lp.at和fun.at可以控制线性预测值打分轴和转换函数显示的点。比如对于上图,我希望线性预测值的轴只显示0到4的点,我就可以写参数:

lp.at = c(0,1,2,3,4)

就可以实现。

还有,有时候我们分类变量的水平比较多,名字比较长,我们可能会将abbrev参数设定为TRUE来缩略显示长度,比如你注意下面的图和上面的在sex水平上的显示区别就是因为我们将abbrev参数设定为了T:

我们还可以很方便地改变列线图的轴标签,只需要将变量打上我们想要的标签,比如将两个变量标签分别设定为“关注”和“Codewar”后,将下面的参数在nomogram函数中设定一下:

vnames='labels'

运行后查看效果:

对于上面的列线图,我可能还觉得我们的图轴和标签离得有点远,这个时候我就可以将xfrac设定小一点比如我设定为0.2,这个时候图就会紧凑很多;我们还可以通过tcl参数设定轴的刻度标线的长度,比如我设定为1,这时候图的刻度线就会变长,读图就会更轻松。

xfrac=.2,tcl=1

参数像上面设定后,我们的图就如下所示:

调了一下还是蛮有效果的哈,但是我还是不满意,看人家jama的列线图,背景色都有,淡淡的蓝色显得就很高级,这个操作大家只需要在出图前设定:

par(bg = "aliceblue")

然后再plot效果就有了:

这下一看就是高分杂志的的图,背景色中的aliceblue你也可以任意改成你喜欢的颜色。

nomogram函数还有很多的参数可调,一篇文章肯定是写不完的,其余的调节功能留给大家自己探索了吧。

接下来写读图的部分。

学会读图

为了更加的加深大家对模型本身和列线图这个可视化工具的区别的理解,我们今天带大家结合cox模型来读cox模型的列线图。

首先我们学会读线性预测值,首先再一次回忆模型的表达:

线性部分就是表达式中指数函数的指数部分,比如我现在跑了一个cox模型结果如下:

那么我知道age的线性系数0.0419,sex中male的线性系数是-0.5975 ,所以我们的模型对一个10岁的男性线性部分预测值就应该为10*0.0419-0.5975=-0.178,回到我们这个模型的列线图中

回到列线图:我们可以看到10岁的得分是0分,男性得分为0,总分0分,对应的线性预测值大概也为-0.18(大家可以用尺子比个大概哈),达成一致。

我们再看生存概率的读法,比如对于一个100岁的男人来讲,依照下面的列线图,她的年龄得分应该是100,性别得分是0,总分是100,对应的3年的生存概率应该大约是0.62(大家可以用把尺子比对下哈):

然后我们出列线图的内在模型再一次验证,我们用predictSurvProb函数,将新数据设定为1个100岁的男性,times设定为3,用原来的cox模型预测出来的生存概率确实也是0.627。依然达成一致。

上面就是读图方法与模型结果的相互验证,希望能够进一步加深列线图只是模型的可视化的表示这一概念的理解。

好了,今天的文章重点就放在列线图出图上,文章中还有报告决策曲线和校准曲线,C指数等下一次再给大家详细写。

小结

今天给大家写了生存分析列线图的比较详细的做法说明和读图验证方法,希望大家有一个唯一的收获就是理解列线图只是模型表达方式,不是具体模型。感谢大家耐心看完,自己的文章都写的很细,重要代码都在原文中,希望大家都可以自己做一做,请转发本文到朋友圈后私信回复“数据链接”获取所有数据和本人收集的学习资料。如果对您有用请先记得收藏,再点赞分享。

也欢迎大家的意见和建议,大家想了解什么统计方法都可以在文章下留言,说不定我看见了就会给你写教程哦,有疑问欢迎私信,有合作意向请直接滴滴我。

如果你是一个大学本科生或研究生,如果你正在因为你的统计作业、数据分析、模型构建,科研统计设计等发愁,如果你在使用SPSS, R,Mplus中遇到任何问题,都可以联系我。因为我可以给您提供最好的,最详细和耐心的数据分析服务。

如果你对Z检验,t检验,方差分析,多元方差分析,回归,卡方检验,相关,多水平模型,结构方程模型,中介调节,量表信效度等等统计技巧有任何问题,请私信我,获取详细和耐心的指导。

如果你或你的团队需要专业的科研数据清洗,建模服务,教学培训需求等等。请联系我。

If you are a student and you are worried about you statistical #Assignments, #Data #Analysis, #Thesis, #Reports, #Composing, #Quizzes, Exams.. And if you are facing problem in #SPSS, #R-Programming, #Excel, Mplus, then contact me. Because I could provide you the best services for your Data Analysis.

Are you confused with statistical Techniques like z-test, t-test, ANOVA, MANOVA, Regression, Logistic Regression, Chi-Square, Correlation, Association, SEM, multilevel model, mediation and moderation etc. for your Data Analysis...??

Then Contact Me. I will solve your Problem...

If You or Your Research Team Need Professional Scientific Data Cleaning, Model Building Services or Statistical Consulting... Please Contact Me.

往期精彩

R数据分析:PLS结构方程模型介绍,论文报告方法和实际操作

R数据分析:如何计算问卷的组合信度,实例操练

R数据分析:如何做数据的非线性关系,多项式回归的做法和解释

R数据分析:跟随top期刊手把手教你做一个临床预测模型

R数据分析:变量间的非线性关系,多项式,样条回归和可加模型

R数据分析:鸢尾花数据集的聚类分析实操

R数据分析:潜类别轨迹模型LCTM的做法,实例解析

R文本挖掘:中文词云生成,以2021新年贺词为例

R机器学习:分类算法之判别分析LDA,QDA的原理与实现

R语言作图:分类变量与连续变量关系的图形化表达

R数据分析:如何用层次聚类分析做“症状群”,实例操练

R数据分析:孟德尔随机化中介的原理和实操

R数据分析:独立样本t检验的统计效能和样本量的计算

R机器学习:重复抽样在机器学习模型建立过程中的地位理解

R数据分析:cox模型如何做预测,高分文章复现

R数据分析:用lme4包拟合线性和非线性混合效应模型

R数据分析:如何用mice做多重插补,实例解析

R数据分析:工具变量回归与孟德尔随机化,实例解析

R数据分析:广义估计方程式GEE的做法和解释

R数据分析:潜类别轨迹模型LCTM的做法,实例解析

R数据分析:生存分析与有竞争事件的生存分析的做法和解释

R数据分析:潜变量与降维方法(主成分分析与因子分析)

R数据分析:如何给结构方程画路径图,tidySEM包详解

R机器学习:朴素贝叶斯与支持向量机的原理与实现

R数据分析:孟德尔随机化分析文献解析和实例操练

R数据分析:混合效应模型的可视化解释,再不懂就真没办法

R数据分析:纵向分类结局的分析-马尔可夫多态模型的理解与实操

R数据分析:如何用lavaan包做结构方程模型,实例解析

R数据分析:潜增长模型LGM的做法和解释,及其与混合模型对比

R数据分析:论文中的轨迹的做法,潜增长模型和增长混合模型

R数据分析:跟随top期刊手把手教你做一个临床预测模型

R机器学习:分类算法之logistics回归分类器的原理和实现

R数据分析:嵌套数据分析为什么要用加随机效应?终于解释清楚了

R数据分析:二分类因变量的混合效应,多水平logistics模型介绍

R数据分析:结合APA格式作图大法讲讲ggplot2和ggsci,请收藏

R数据分析:用R建立预测模型

R数据分析:再写stargazer包,如何输出漂亮的表格

R数据分析:做量性研究的必备“家伙什”-furniture包介绍

R数据分析:ROC曲线与模型评价实例

R数据分析:用R语言做潜类别分析LCA

R数据分析:变量间的非线性关系,多项式,样条回归和可加模型

Mplus数据分析:性别差异gendergap的相关研究如何做?

R数据分析:Lasso回归筛选变量构建Cox模型并绘制列线图

R数据分析:结合APA格式作图大法讲讲ggplot2和ggsci,请收藏

R数据分析:跟随top期刊手把手教你做一个临床预测模型

R数据分析:嵌套数据分析为什么要用加随机效应?终于解释清楚了

R数据分析:PLS结构方程模型介绍,论文报告方法和实际操作

R机器学习:分类算法之logistics回归分类器的原理和实现

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多