查看原文
其他

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

阿越就是我 医学和生信笔记 2023-06-15
关注公众号,发送R语言Python,获取学习资料!

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

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

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

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

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

  • cox回归列线图

    • 方法1

    • 方法2

    • 方法3

    • 方法4

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

方法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

方法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

方法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


以上就是今天的内容,希望对你有帮助哦!欢迎点赞、在看、关注、转发

欢迎在评论区留言或直接添加我的微信!




欢迎关注公众号:医学和生信笔记

医学和生信笔记 公众号主要分享:1.医学小知识、肛肠科小知识;2.R语言和Python相关的数据分析、可视化、机器学习等;3.生物信息学学习资料和自己的学习笔记!



往期回顾

R语言处理因子之forcats包介绍(3)


R语言画多时间点ROC和多指标ROC曲线


TCGA批量差异分析并可视化


1万个基因批量wilcoxon检验?


R语言和网络药理学:批量处理ETCM的数据

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存