Cox回归列线图(nomogram)的多种绘制方法

获取更多R语言知识,请关注公众号:医学和生信笔记

医学和生信笔记,专注R语言在临床医学中的使用,R语言数据分析和可视化。主要分享R语言做医学统计学、meta分析、网络药理学、临床预测模型、机器学习、生物信息学等。

Cox比例风险模型也是多因素回归模型的一种,在考虑结局时,还加入了时间因素的影响。

列线图(Alignment Diagram),又称诺莫图(Nomogram图),用来把多因素回归分析结果(logistic回归和cox回归)用图形方式表现出来,将多个预测指标进行整合,然后采用带有刻度的线段,按照一定的比例绘制在同一平面上,从而用以表达预测模型中各个变量之间的相互关系。

根据模型中各个影响因素对结局变量的贡献程度(回归系数的大小),给每个影响因素的每个取值水平进行赋分,然后再将各个评分相加得到总评分,最后通过总评分与结局事件发生概率之间的函数转换关系,从而计算出该个体结局事件的预测值。

列线图在生信文章中都快被用烂了,但是大部分都是垃圾,纯粹是为了凑图而已。

今天给大家介绍4种cox回归列线图的绘制方法

cox回归列线图

library(survival)
library(rms)
## 载入需要的程辑包:Hmisc
## 载入需要的程辑包:lattice
## 载入需要的程辑包:Formula
## 载入需要的程辑包:ggplot2
## 
## 载入程辑包:'Hmisc'
## The following objects are masked from 'package:base':
## 
##     format.pval, units
## 载入需要的程辑包:SparseM
## 
## 载入程辑包:'SparseM'
## The following object is masked from 'package:base':
## 
##     backsolve
rm(list = ls())

dim(lung)
## [1] 228  10
str(lung)
## 'data.frame': 228 obs. of  10 variables:
##  $ inst     : num  3 3 3 5 1 12 7 11 1 7 ...
##  $ time     : num  306 455 1010 210 883 ...
##  $ status   : num  2 2 1 2 2 1 2 2 2 2 ...
##  $ age      : num  74 68 56 57 60 74 68 71 53 61 ...
##  $ sex      : num  1 1 1 1 1 1 2 2 1 1 ...
##  $ ph.ecog  : num  1 0 0 1 0 1 2 2 1 2 ...
##  $ ph.karno : num  90 90 90 90 100 50 70 60 70 70 ...
##  $ pat.karno: num  100 90 90 60 90 80 60 80 80 70 ...
##  $ meal.cal : num  1175 1225 NA 1150 NA ...
##  $ wt.loss  : num  NA 15 15 11 0 0 10 1 16 34 ...

方法1

大多数情况下都是使用1代表死亡,0代表删失,这个数据集用2代表死亡。在这里没有影响,但有的R包会报错,需要注意!

dd <- datadist(lung)
options(datadist = "dd")

构建cox比例风险模型:

coxfit <- cph(Surv(time, status) ~ age + sex + ph.ecog + ph.karno + pat.karno,
              data = lung, x=T,y=T,surv = T
              )

# 构建生存函数,注意你的最大生存时间
surv <- Survival(coxfit) 
surv1 <- function(x) surv(365,x) # 1年OS
surv2 <- function(x) surv(365*2,x) # 2年OS

nom <- nomogram(coxfit,
                fun = list(surv1,surv2),
                lp = T,
                funlabel = c('1-year survival Probability',
                         '2-year survival Probability'),
                maxscale = 100,
                fun.at = c(0.95,0.9,0.8,0.7,0.6,0.5,0.4,0.3,0.2,0.1))

然后就是画图:

plot(nom, 
     lplabel="Linear Predictor",
     xfrac = 0.2# 左侧标签距离坐标轴的距离
     #varname.label = TRUE, 
     tcl = -0.2# 刻度长短和方向 
     lmgp = 0.1# 坐标轴标签距离坐标轴远近
     points.label ='Points'
     total.points.label = 'Total Points',
     cap.labels = FALSE,
     cex.var = 1# 左侧标签字体大小
     cex.axis = 1# 坐标轴字体大小
     col.grid = gray(c(0.80.95))) # 竖线颜色
image-20220511205637972
image-20220511205637972

方法2

会弹出一个窗口。

library(DynNom)

coxfit <- cph(Surv(time, status) ~ age + sex + ph.ecog + ph.karno + pat.karno,
              data = lung, x=T,y=T,surv = T
              )

DynNom(coxfit,
       DNxlab = "Survival probability",
       KMtitle="Kaplan-Meier plot"
       KMxlab = "Time (Days)"
       KMylab = "Survival probability")
2022051120530012
2022051120530012

方法3

library(regplot)

coxfit <- cph(Surv(time, status) ~ age + sex + ph.ecog + ph.karno + pat.karno,
              data = lung, x=T,y=T,surv = T
              )

regplot(coxfit,
        plots = c("violin""boxes"), ##连续性变量形状,可选"no plot" "density" "boxes" "ecdf" "bars" "boxplot" "violin" "bean" "spikes";分类变量的形状,可选"no plot" "boxes" "bars" "spikes"
        observation = lung[1,], #用哪行观测,或者T F
        center = T# 对齐变量
        subticks = T,
        droplines = T,#是否画竖线
        title = "nomogram",
        points = T# 截距项显示为0-100
        odds = T# 是否显示OR值
        showP = T# 是否显示变量的显著性标记
        rank = "sd"# 根据sd给变量排序
        interval="confidence"# 展示可信区间
        clickable = F # 是否可以交互
        )
## Regression  coxfit cph formula:
## Surv(time, status) `~` age + sex + ph.ecog + ph.karno + pat.karno
## CI: 0.931(4.82,57.5)
## [[1]]
##   pat.karno Points
## 1        30     61
## 2        50     49
## 3        70     37
## 4        90     25
## 
## [[2]]
##   ph.karno Points
## 1       50      1
## 2       60     11
## 3       70     20
## 4       80     29
## 5       90     39
## 6      100     48
## 
## [[3]]
##   ph.ecog Points
## 1     0.0      0
## 2     0.5     17
## 3     1.0     33
## 4     1.5     50
## 5     2.0     67
## 6     2.5     83
## 7     3.0    100
## 
## [[4]]
##   sex Points
## 1 1.0     45
## 2 1.4     31
## 3 1.8     18
## 
## [[5]]
##   age Points
## 1  35     13
## 2  45     20
## 3  55     26
## 4  65     33
## 5  75     40
## 6  85     47
## 
## [[6]]
##    Total Points Pr( time < 267 )
## 1            60           0.0889
## 2            80           0.1225
## 3           100           0.1676
## 4           120           0.2271
## 5           140           0.3034
## 6           160           0.3981
## 7           180           0.5097
## 8           200           0.6324
## 9           220           0.7546
## 10          240           0.8609
## 11          260           0.9373
image-20220511205802208
image-20220511205802208

方法4

library(VRPM)
library(survival)

cox_fit <- coxph(Surv(time, status) ~ age + sex + ph.ecog + ph.karno + pat.karno,
              data = lung,model = T)

colplot(cox_fit,coloroptions = 3,filename = "cox.png")
2022051121063564
2022051121063564

获取更多R语言知识,请关注公众号:医学和生信笔记

医学和生信笔记,专注R语言在临床医学中的使用,R语言数据分析和可视化。主要分享R语言做医学统计学、meta分析、网络药理学、临床预测模型、机器学习、生物信息学等。

本文由 mdnice 多平台发布

<think>嗯,用户想学习在R语言中进行生存分析并绘制列线图,需要示例代码和教程。首先,我需要回顾一下生存分析的基本概念和相关R包。生存分析通常涉及生存时间的建模,常用的方法有Kaplan-Meier估计、Cox比例风险模型等。列线图Nomogram)是一种直观展示模型结果的可视化工具,能将复杂的回归方程转化为图形,方便临床医生快速预测个体结局。 接下来,用户提到的列线图绘制可能涉及到的R包有哪些呢?根据引用中的内容,看到有提到library(rms)、library(survival),所以需要确认这些包的使用方法。rms包提供了构建列线图的函数,而survival包用于处理生存数据。此外,可能还需要foreign包来读取数据,比如SPSS的.sav文件。 然后,用户需要具体的步骤和代码示例。根据引用中的例子,绘制列线图的大致流程应该是:数据准备、建立Cox模型、构建nomogram对象、绘制图形。同时,校准曲线的绘制也是常见的需求,用于评估模型预测与实际结果的吻合程度。 需要注意的问题包括数据格式是否正确,比如生存时间、状态变量是否定义清楚。另外,Cox模型的假设检验,比如比例风险假设是否满足,可能需要检验,但用户的问题中可能暂时不需要深入这一点。此外,引用中提到在训练集和验证集中使用相同模型参数进行评估,避免传统方法的误区,这点可能在模型验证部分需要注意。 用户可能需要示例数据,这里可以考虑使用R内置的数据集,比如lung数据集,来自survival包,这样用户可以直接运行代码而无需准备外部数据。代码步骤大致分为加载包、处理数据、拟合模型、构建列线图绘制校准曲线等。 还需要注意代码中的变量名称是否与数据集中的一致,例如lung数据集中的time是生存时间,status是事件状态。此外,在构建nomogram时,需要指定预测时间点,比如1年或3年生存率,这会影响列线图的刻度。 可能遇到的问题包括包安装失败,比如rms包的依赖问题,或者数据预处理步骤中的缺失值处理。例如,lung数据集中有缺失值,需要用na.omit处理。此外,校准曲线的绘制可能需要使用calibrate函数,并指定Bootstrap重抽样次数,这可能需要较长时间运行。 最后,生成相关问题,可能涉及模型评估方法、优化策略、应用场景等,需要根据引用内容中的信息来设计,比如C-index的计算、模型验证的正确方法列线图在临床中的应用等。</think>以下是在R语言绘制生存分析列线图的详细教程,结合Cox回归模型和校准曲线绘制: ### 一、环境准备 ```r # 安装必要包(首次使用时运行) install.packages(c("survival","rms","foreign","Hmisc")) # 加载包 library(survival) # 生存分析核心包[^3] library(rms) # 列线图绘制工具[^1] library(foreign) # 数据读取支持 ``` ### 二、数据预处理 使用内置肺癌数据集`lung`进行演示: ```r data(lung) lung <- na.omit(lung) # 删除缺失值 dd <- datadist(lung) # 创建数据分布对象[^4] options(datadist="dd") # 设置数据分布 ``` ### 三、建立Cox回归模型 ```r # 构建Cox模型 cox_model <- cph(Surv(time, status) ~ age + sex + ph.ecog + ph.karno, data = lung, x=TRUE, y=TRUE, surv=TRUE, time.inc=365) # 设置1年预测时间点[^5] ``` ### 四、列线图绘制 ```r # 生成列线图对象 nomogram <- nomogram(cox_model, lp=FALSE, fun=function(x) 1/(1+exp(-x)), # 风险转换函数 fun.at=c(0.1,0.3,0.5,0.7,0.9), funlabel="Risk Probability") # 绘制列线图 plot(nomogram, col.grid=c("gray90", "gray70"), cex.var=1.2, lplabel="Linear Predictor") ``` ![示例列线图](https://via.placeholder.com/600x400?text=Nomogram+Example) ### 五、校准曲线绘制 ```r # 校准曲线计算(使用Bootstrap法) cal <- calibrate(cox_model, cmethod="KM", method="boot", u=365, # 1年生存率 m=50, # 分箱数量 B=1000) # Bootstrap次数 # 绘制校准曲线 plot(cal, xlim=c(0.3,0.7), ylim=c(0.3,0.7), subtitles=FALSE) ``` ![示例校准曲线](https://via.placeholder.com/600x400?text=Calibration+Curve) ### 六、模型验证 ```r # 计算C-index(一致性指数) rcorrcens(Surv(time, status) ~ predict(cox_model), data = lung) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值