手把手教你绘制和解读实用R列线图(Nomogram):从入门到精通

简介: 手把手教你绘制和解读实用R列线图(Nomogram):从入门到精通

一、引言

列线图(Nomogram)是一种常用的数据可视化工具,它能够直观地展示多个变量之间的关系,并帮助我们理解和解释复杂的数据模式。通过绘制列线图,我们可以将各种变量的影响和相互关联转化为图形化的表示,使得数据解读更加直观和易于理解。

在数据可视化和解释方面,列线图有着独特的优势。首先,它可以帮助我们观察和发现变量之间的线性关系、非线性关系以及交互作用,从而提供更全面的数据分析结果。其次,列线图能够直接计算和显示各个变量对结果的贡献度,帮助我们评估其重要性和影响程度。此外,列线图还可以用于预测和决策支持,帮助我们做出更准确和可靠的预测或判断。

本文旨在通过R语言为工具,手把手教读者如何绘制和解读列线图。我们将提供详细的步骤和示例代码,以帮助读者快速上手并灵活运用列线图技术。通过学习本文,读者将能够在数据分析中充分利用列线图的优势,提升数据解读和决策的准确性和效果。

二、列线图基础

2.1 列线图的基本概念和用途

列线图(Nomogram),也叫做协方差图,是一种用来描述多个变量之间关系的图形化工具。它通常由一条直线和数条刻度线组成,每条刻度线代表一个变量,而每个刻度线上都标记有该变量取值的范围或者数值。通过在不同的刻度线上作出点的位置,可以表示不同变量之间的关系和相互作用。

列线图可以用于许多不同的目的,例如:

  • 探究多个变量之间的关系和交互作用;
  • 评估不同变量对某个结果的影响程度;
  • 预测未知变量的取值或者结果的发生概率;
  • 优化决策制定,帮助我们做出更好的决策。

2.2 数据准备以及数据格式的要求

为了绘制一张列线图,我们需要准备一些数据,并按照特定的格式进行存储。通常来说,列线图所需的数据应该是连续型的或者是已经经过分组、离散化处理的分类型变量。此外,数据还需要满足一些特定的格式要求,以便能够被R语言中的相关包或函数所识别和绘制。

下面是一些基本的数据格式要求:

  • 列线图通常需要至少2个变量,其中一个是目标变量(也叫做响应变量),其余的是预测变量。
  • 目标变量和预测变量必须是连续型的或者是已经离散化过的分类型变量。
  • 每个变量都需要有一个可供绘图的范围或者数值,通常用最小值和最大值来表示。
  • 数据应该被组织为一个数据框或矩阵的形式,其中每列代表一个变量,每行代表一个样本。

三、绘制列线图

  • 「安装和加载包」
library(rms)
library(survival)
  • 「数据集准备」
library(survival)
head(gbsg)

结果展示:

pid age meno size grade nodes pgr er hormon rfstime status
1  132  49    0   18     2     2   0  0      0    1838      0
2 1575  55    1   20     3    16   0  0      0     403      1
3 1140  56    1   40     3     3   0  0      0    1603      0
4  769  45    0   25     3     1   0  4      0     177      0
5  130  65    1   30     2     5   0 36      1    1855      0
6 1642  48    0   52     2    11   0  0      0     842      1
  • 「示例数据集介绍」
> str(gbsg)
'data.frame':   686 obs. of  10 variables:
 $ age    : int  49 55 56 45 65 48 48 37 67 45 ...
 $ meno   : int  0 1 1 0 1 0 0 0 1 0 ...
 $ size   : int  18 20 40 25 30 52 21 20 20 30 ...
 $ grade  : int  2 3 3 3 2 2 3 2 2 2 ...
 $ nodes  : int  2 16 3 1 5 11 8 9 1 1 ...
 $ pgr    : int  0 0 0 0 0 0 0 0 0 0 ...
 $ er     : int  0 0 0 4 36 0 0 0 0 0 ...
 $ hormon : int  0 0 0 0 1 0 0 1 1 0 ...
 $ rfstime: int  1838 403 1603 177 1855 842 293 42 564 1093 ...
 $ status : Factor w/ 2 levels "0","1": 1 2 1 1 1 2 2 1 2 2 ...
age:患者年龄
meno:更年期状态(0表示未更年期,1表示已更年期)
size:肿瘤大小
grade:肿瘤分级
nodes:受累淋巴结数量
pgr:孕激素受体表达水平
er:雌激素受体表达水平
hormon:激素治疗(0表示否,1表示是)
rfstime:复发或死亡时间(以天为单位)
status:事件状态(0表示被截尾,1表示事件发生)
  • 「拟合模型」

在绘制列线图之前,我们需要先拟合一个模型,以获得变量之间的关系和影响程度。这里我们使用逻辑回归模型作为例子。

ddist <- datadist(gbsg[,-1]); 
options(datadist='ddist')
# 拟合逻辑回归模型
model <- lrm(status ~ ., data = gbsg[,-1])
  • 「绘制列线图」
nomogram <- nomogram(model, fun = function(x)1/(1+exp(-x))) # 逻辑回归计算公式
# 绘制列线图
plot(nomogram)

四、结果解读

为了方便解释和演示过程,我们把列线图的自变量减少几个,我们以age,meno和nodes为自变量生成列线图。

model <- lrm(status ~ age + meno + nodes, data = gbsg[,-1])
nomogram <- nomogram(model, fun = function(x)1/(1+exp(-x))) # 逻辑回归计算公式
# 绘制列线图
plot(nomogram)

我们以第一行数据为例:

> head(gbsg,1)
  pid age meno size grade nodes pgr er hormon rfstime status
1 132  49    0   18     2     2   0  0      0    1838      0

从上面可以看出数据是age = 49,meno = 0;nodes = 2。

从图中可以看出,age 49时对应的分数是11分,然后meno为0对应的分值为0,nodes为2时对应的分数为3分,总分值为14分,总分值对应的预测值是0.3-0.4之间,小于0.5,所以其预测值应该是0,和实际结果一致。除了这些我们还可以看到哪些信息呢?

  1. 特征的取值范围:比如age的取值范围是20-80,meno取值范围是0-1(分类变量),nodes取值范围是0-55.
  2. 特征的权重(特征重要性):线越长代表权重越大,从图中可以看出:nodes > age > meno;
  3. 特征的影响趋势(正向、负向):age越大,发生事件的概率越低,所以是负向趋势;meno和nodes都是随着值越大发生事件的概率越大,所以是正向趋势;
  4. 得分:可以通过point得出单个病人某个指标对应的分值,然后通过分值累加即可获得total point;
  5. 预测概率:我们可以通过计算得出的total point比对出事件发生的概率。

五、高级技巧与应用

5.1 修改预测值的标签和刻度

ddist <- datadist(gbsg[,-1]); 
options(datadist='ddist')
model <- lrm(status ~ ., data = gbsg[,-1])
nomogram <- nomogram(model, fun = function(x)1/(1+exp(-x)),funlabel="Risk of Event",conf.int=F,lp=F,fun.at=c(.001,.01,.05,seq(.1,.9,by=.1),.95,.99,.99)) # 逻辑回归计算公式
# 绘制列线图
plot(nomogram)

5.2 添加高中低风险的色条

ddist <- datadist(gbsg[,-1]); 
options(datadist='ddist')
model <- lrm(status ~ ., data = gbsg[,-1])
nomogram <- nomogram(model, fun = function(x)1/(1+exp(-x)),funlabel="Risk of Event",conf.int=F,lp=F,fun.at=c(.001,.01,.05,seq(.1,.9,by=.1),.95,.99,.99)) # 逻辑回归计算公式
# 绘制列线图
plot(nomogram)
rect(0.191,0.095,0.65,0.11,col = "green") # 添加彩色条带
rect(0.65,0.095,0.705,0.11,col = "yellow") # 添加彩色条带
rect(0.705,0.095,1.003,0.11,col = "red") # 添加彩色条带
text(0.4,0.125,"Low")
text(0.68,0.125,"Medium")
text(0.85,0.125,"High")

5.3 动态nomogram

library(regplot)
ddist <- datadist(gbsg[,-1]); 
options(datadist='ddist')
model <- lrm(status ~ ., data = gbsg[,-1])
nomogram <- regplot(model,plots=c('violin','boxes'),observation=gbsg[2,-1],center=T,subticks=T,droplines=T,title='nomogram',points=T,odds=T,showP=T,rank='sd',interval='confidence',clickable=F)
plot(nomogram)

六、总结

在本文中,我们介绍了列线图的基本概念、绘制方法和应用场景。列线图是一种常用的数据可视化工具,它可以帮助我们探索变量之间的关系,解释模型的预测效果,并支持数据驱动的决策。

我们提供了一些实用的技巧和建议,如如何解释列线图的结果、如何定制样式、如何探索非线性关系和如何使用交互式可视化工具等。这些技巧可以帮助读者更好地理解和利用列线图。

未来,我们预计列线图将在数据分析中发挥更重要的作用。随着数据量的不断增加和机器学习的广泛应用,列线图将成为处理大规模数据和评估复杂模型的有力工具。我们鼓励读者继续学习和实践列线图的应用,以应对数据分析领域的挑战。

*「未经许可,不得以任何方式复制或抄袭本篇文章之部分或全部内容。版权所有,侵权必究。」

目录
相关文章
|
12月前
|
Linux
R语言笔记丨绘图基础知识:饼图、条形图
R语言笔记丨绘图基础知识:饼图、条形图
|
12月前
|
数据格式
如何绘制热图?ggplot2入门笔记
如何绘制热图?ggplot2入门笔记
|
3月前
手把手带你绘制条形图
手把手带你绘制条形图
73 0
|
编解码 数据可视化 数据挖掘
Python可视化学习(饼状图,坐标系...)
Python可视化学习(饼状图,坐标系...)
162 0
Python可视化学习(饼状图,坐标系...)
|
数据可视化 Python