R数据分析:生存分析的列线图的理解与绘制详细教程
bigegpt 2024-10-30 01:48 9 浏览
列线图作为一个非常简单明了的临床辅助决策工具,在临床中用的(发文章的)还是比较多的,尤其是肿瘤预后:
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数据分析:纵向分类结局的分析-马尔可夫多态模型的理解与实操
R数据分析:潜增长模型LGM的做法和解释,及其与混合模型对比
R机器学习:分类算法之logistics回归分类器的原理和实现
R数据分析:嵌套数据分析为什么要用加随机效应?终于解释清楚了
R数据分析:二分类因变量的混合效应,多水平logistics模型介绍
R数据分析:结合APA格式作图大法讲讲ggplot2和ggsci,请收藏
R数据分析:做量性研究的必备“家伙什”-furniture包介绍
Mplus数据分析:性别差异gendergap的相关研究如何做?
R数据分析:Lasso回归筛选变量构建Cox模型并绘制列线图
R数据分析:结合APA格式作图大法讲讲ggplot2和ggsci,请收藏
相关推荐
- 悠悠万事,吃饭为大(悠悠万事吃饭为大,什么意思)
-
新媒体编辑:杜岷赵蕾初审:程秀娟审核:汤小俊审签:周星...
- 高铁扒门事件升级版!婚宴上‘冲喜’老人团:我们抢的是社会资源
-
凌晨两点改方案时,突然收到婚庆团队发来的视频——胶东某酒店宴会厅,三个穿大红棉袄的中年妇女跟敢死队似的往前冲,眼瞅着就要扑到新娘的高额钻石项链上。要不是门口小伙及时阻拦,这婚礼造型团队熬了三个月的方案...
- 微服务架构实战:商家管理后台与sso设计,SSO客户端设计
-
SSO客户端设计下面通过模块merchant-security对SSO客户端安全认证部分的实现进行封装,以便各个接入SSO的客户端应用进行引用。安全认证的项目管理配置SSO客户端安全认证的项目管理使...
- 还在为 Spring Boot 配置类加载机制困惑?一文为你彻底解惑
-
在当今微服务架构盛行、项目复杂度不断攀升的开发环境下,SpringBoot作为Java后端开发的主流框架,无疑是我们手中的得力武器。然而,当我们在享受其自动配置带来的便捷时,是否曾被配置类加载...
- Seata源码—6.Seata AT模式的数据源代理二
-
大纲1.Seata的Resource资源接口源码2.Seata数据源连接池代理的实现源码3.Client向Server发起注册RM的源码4.Client向Server注册RM时的交互源码5.数据源连接...
- 30分钟了解K8S(30分钟了解微积分)
-
微服务演进方向o面向分布式设计(Distribution):容器、微服务、API驱动的开发;o面向配置设计(Configuration):一个镜像,多个环境配置;o面向韧性设计(Resista...
- SpringBoot条件化配置(@Conditional)全面解析与实战指南
-
一、条件化配置基础概念1.1什么是条件化配置条件化配置是Spring框架提供的一种基于特定条件来决定是否注册Bean或加载配置的机制。在SpringBoot中,这一机制通过@Conditional...
- 一招解决所有依赖冲突(克服依赖)
-
背景介绍最近遇到了这样一个问题,我们有一个jar包common-tool,作为基础工具包,被各个项目在引用。突然某一天发现日志很多报错。一看是NoSuchMethodError,意思是Dis...
- 你读过Mybatis的源码?说说它用到了几种设计模式
-
学习设计模式时,很多人都有类似的困扰——明明概念背得滚瓜烂熟,一到写代码就完全想不起来怎么用。就像学了一堆游泳技巧,却从没下过水实践,很难真正掌握。其实理解一个知识点,就像看立体模型,单角度观察总...
- golang对接阿里云私有Bucket上传图片、授权访问图片
-
1、为什么要设置私有bucket公共读写:互联网上任何用户都可以对该Bucket内的文件进行访问,并且向该Bucket写入数据。这有可能造成您数据的外泄以及费用激增,若被人恶意写入违法信息还可...
- spring中的资源的加载(spring加载原理)
-
最近在网上看到有人问@ContextConfiguration("classpath:/bean.xml")中除了classpath这种还有其他的写法么,看他的意思是想从本地文件...
- Android资源使用(android资源文件)
-
Android资源管理机制在Android的开发中,需要使用到各式各样的资源,这些资源往往是一些静态资源,比如位图,颜色,布局定义,用户界面使用到的字符串,动画等。这些资源统统放在项目的res/独立子...
- 如何深度理解mybatis?(如何深度理解康乐服务质量管理的5个维度)
-
深度自定义mybatis回顾mybatis的操作的核心步骤编写核心类SqlSessionFacotryBuild进行解析配置文件深度分析解析SqlSessionFacotryBuild干的核心工作编写...
- @Autowired与@Resource原理知识点详解
-
springIOCAOP的不多做赘述了,说下IOC:SpringIOC解决的是对象管理和对象依赖的问题,IOC容器可以理解为一个对象工厂,我们都把该对象交给工厂,工厂管理这些对象的创建以及依赖关系...
- java的redis连接工具篇(java redis client)
-
在Java里,有不少用于连接Redis的工具,下面为你介绍一些主流的工具及其特点:JedisJedis是Redis官方推荐的Java连接工具,它提供了全面的Redis命令支持,且...
- 一周热门
- 最近发表
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- resize函数 (64)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- mybatis大于等于 (64)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- linuxlink (65)
- pythonwget (67)
- androidinclude (65)
- logstashinput (65)
- hadoop端口 (65)
- vue阻止冒泡 (67)
- oracle时间戳转换日期 (64)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)