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

news2024/11/27 9:38:18

一、引言

列线图(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)

六、总结

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1349358.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2001-2021年各省高速公路里程数据

2001-2021年全国及各省高速公路里程数据 1、时间&#xff1a;2001-2021年 2、指标&#xff1a;高速公路里程 3、范围&#xff1a;全国及30个省市 &#xff08;不含西藏&#xff09; 4、来源&#xff1a;各省NJ、省TJGB、第三产业TJNJ &#xff08;无缺失&#xff09; 5、指…

鸿蒙项目方舟框架(ArkUI)之线性布局容器Stack组件

鸿蒙项目方舟框架&#xff08;ArkUI&#xff09;之线性布局容器Stack组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Stack组件 堆叠容器&#xff0c;子组件按照顺序依次入栈&#xff0c;后一个子组件覆盖前一个子组件。 …

docker Mysql-udf-http

1.Mysql-udf-http镜像已上传到dockerhub中 docker pull heidaodageshiwo/mysql-udf-http:v1 2.启动镜像(默认密码root1234) docker run -tid -p 3306:3306 --namemysql-udf-http --privilegedtrue heidaodageshiwo/mysql-udf-http:v1 3.命令 [rootlocalhost ~]# docker im…

Navisworks各版本安装指南

Navisworks 下载链接 https://pan.baidu.com/s/1DGD9TbSa6Xjd-HoySd5AYg?pwd0531 1.鼠标右击【Navisworks2024(64bit)】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;【解压到 Navisworks2024(64bit)】。 2.打开解压后的文件夹&#xff0c;双击打…

大甩卖-(CWRU)轴承故障诊数据集和代码全家桶

Python-凯斯西储大学&#xff08;CWRU&#xff09;轴承数据解读与分类处理 Python轴承故障诊断 (一)短时傅里叶变换STFT Python轴承故障诊断 (二)连续小波变换CWT_pyts 小波变换 故障-CSDN博客 Python轴承故障诊断 (三)经验模态分解EMD_轴承诊断 pytorch-CSDN博客 Pytorch…

大数据规模存储的几个核心问题

文章目录 三个关键问题RAID&#xff08;独立磁盘冗余阵列&#xff09;RAID是如何解决关于存储的三个关键问题&#xff1f;水平伸缩 大规模数据存储都需要解决几个核心问题&#xff0c;这些问题都是什么呢&#xff1f; 三个关键问题 1.数据存储容量的问题 既然大数据要解决的…

ROS TF坐标变换 - TF树

目录 一、TF树介绍二、TF2与TF三、构建TF树四、rviz查看TF坐标关系 一、TF树介绍 在机器人系统中&#xff0c;存在运动学模型和动力学模型。对于刚体机器人&#xff0c;动力学模型基于刚体动力学&#xff0c;代表机器人系统在运动过程中力/力矩与其运动状态的变化关系。而运动…

(五)分文件编程

文章目录 为什么要引入分文件编程.C文件怎么添加.H文件怎么书写以及如何进行链接.H书写格式&#xff1a;“有头有尾标识符”例如&#xff08;timer.h) .H链接链接到头文件所在路径的文件夹路径即可 提供一个分文件编程的一种代码最后附上视频演示 为什么要引入分文件编程 C程序…

Linux基础知识学习2

tree命令的使用 可以看到dir2目录下的这些文件&#xff0c;要想显示dir2的具体结构&#xff0c;可用tree命令 mv命令 它可以实现两个功能 1.将文件移动到另一个目录中 2.对某一个文件进行重命名 1.将文件移动到另一个目录中 这里将dir1中的2.txt移动到他的子目录dir3中 执行…

【linux】cat的基本使用

cat是一个常用的命令&#xff0c;用来显示文本的内容&#xff0c;合并和创建文本文件 类似命令还有显示文件开头的内容&#xff1a; 【linux】head的用法 输出文件开头的内容-CSDN博客 显示文件末尾的内容&#xff1a; 【linux】tail的基本使用-CSDN博客 当我们想到了想要…

JVM工作原理与实战(三):字节码文件的组成

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、基础信息 1.Magic魔数 2.主副版本号 3.其他信息 二、常量池 1.案例解析 三、方法 1.方法介绍 2.案例解析 四、字段 五、属性 总结 前言 JVM作为Java程序的运行环境&…

字母简化(UPC练习)

题目描述 给出一串全部为小写英文字母的字符串&#xff0c;要求把这串字母简化。简化规则是&#xff1a;统计连续出现的字母数&#xff0c;输出时先输出个数&#xff0c;再输出字母。比如&#xff1a;aaabbbaa&#xff0c;则简化为3a3b2a&#xff1b;而zzzzeeeeea&#xff0c;…

堆的应用:堆排序和TOP-K问题

上次才讲完堆的相关问题&#xff1a;二叉树顺序结构与堆的概念及性质&#xff08;c语言实现堆 那今天就接着来进行堆的主要两方面的应用&#xff1a;堆排序和TOP-K问题 文章目录 1.堆排序1.1概念、思路及代码1.2改良代码&#xff08;最初建立大堆用AdjustDow&#xff09; 2. TO…

个人简历范本(精选5篇)

HR浏览一份简历也就25秒左右&#xff0c;如果你连「好简历」都没有&#xff0c;怎么能找到好工作呢&#xff1f; 如果你不懂得如何在简历上展示自己&#xff0c;或者觉得怎么改简历都不出彩&#xff0c;那请你一定仔细读完。 个人求职简历第 1 篇 男 22 本科 AI简历 市场营…

听GPT 讲Rust源代码--library/alloc(2)

File: rust/library/alloc/src/vec/mod.rs 在Rust源代码中&#xff0c;rust/library/alloc/src/vec/mod.rs这个文件是Rust标准库中的Vec类型的实现文件。Vec是一个动态大小的数组类型&#xff0c;在内存中以连续的方式存储其元素。 具体来说&#xff0c;mod.rs文件中定义了以下…

基于RetinaFace+Jetson Nano的智能门锁系统——第一篇(烧录系统)

文章目录 设备1.首先在PC端安装VMware虚拟机和Ubuntu182.安装VMware Tools3.安装SDK Manager 设备 Jetson NanoMicro-USB - USB-A电源线HDMI线屏幕PC一台 1.首先在PC端安装VMware虚拟机和Ubuntu18 VMware下载地址&#xff1a;https://www.vmware.com/cn/products/workstatio…

Node.js+Express 路由配置,实现接口分类管理

首先创建一个路由目录及文件 routes/user.js代码 const express require(express); const router express.Router(); // 使用express提供的router对象 const db require(../dbserver/mysql);router.get(/api/user, (req, res) > {const sqlStr SELECT * FROM sys_user;…

【算法】NOIP2017奶酪(搜索)

题目描述 现有一块大奶酪&#xff0c;它的高度为 h&#xff0c;它的长度和宽度我们可以认为是无限大的&#xff0c;奶酪中间有许多半径相同的球形空洞。我们可以在这块奶酪中建立空间坐标系&#xff0c; 在坐标系中&#xff0c;奶酪的下表面为 z 0&#xff0c;奶酪的上表面为…

odoo17 | 创建一个新应用程序

前言 本章的目的是为创建一个全新的Odoo模块奠定基础。 我们将从头开始&#xff0c;以使我们的模块被Odoo识别所需的最低限度。 在接下来的章节中&#xff0c;我们将逐步添加功能以构建一个真实的业务案例。 教程 假设我门需要在odoo上开发一个新app模块例如房地产广告模块。…

详解Vue3中的事件监听方式

本文主要介绍Vue3中的事件监听方式。 目录 一、v-on指令二、使用符号简写三、事件修饰符四、动态事件名五、常见的监听事件六、自定义事件 在Vue3中&#xff0c;事件监听的方式与Vue2有一些不同。 下面是Vue3中事件监听方式的详细介绍&#xff1a; 一、v-on指令 Vue3中仍然使…