临床预测模型之生存资料的ROC曲线绘制

2023-11-07

本文首发于公众号:医学和生信笔记

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

生存资料的ROC曲线考虑了时间因素,在画ROC时,需要指定是哪个时间点的ROC。

生存资料的ROC曲线绘制,最常见的那肯定是timeROCsurvivalROC了,这两个包非常像,我比较喜欢用timeROC

加载R包和数据

rm(list = ls())
library(timeROC)
library(survival)

load(file = "../000files/timeROC.RData")

多个时间点ROC

首先看一下数据结构,对于多个时间点的ROC,需要3列数据:time, event, marker(比如你计算得到的risk score)

# 看一下画图所需的数据长什么样子,event这一列,0代表living,1代表dead,futime这一列单位是年,也可以改成其他的

str(df)
## 'data.frame': 297 obs. of  3 variables:
##  $ event    : num  0 0 1 0 0 1 0 0 0 0 ...
##  $ riskScore: num  -0.249 -0.511 -0.211 -0.427 0.279 ...
##  $ futime   : num  3.03 1.16 1.82 1.52 1.34 ...

数据结构上面这样,下面就是画图。

# 构建timeroc

ROC <- timeROC(T=df$futime,   
               delta=df$event,   
               marker=df$riskScore,   
               cause=1,                #阳性结局指标数值
               weighting="marginal",   #计算方法,默认为marginal
               times=c(123),       #时间点,选取1年,3年和5年的生存率
               iid=TRUE)

ROC   #查看模型变量信息
## Time-dependent-Roc curve estimated using IPCW  (n=297, without competing risks). 
##     Cases Survivors Censored AUC (%)   se
## t=1    57       203       37   71.02 3.68
## t=2    66       106      125   69.23 3.94
## t=3    68        74      155   65.53 4.85
## 
## Method used for estimating IPCW:marginal 
## 
## Total computation time : 0.07  secs.

画图很简单:

plot(ROC, 
     time=1, col="red", lwd=2, title = "")   #time是时间点,col是线条颜色
plot(ROC,
     time=2, col="blue", add=TRUE, lwd=2)    #add指是否添加在上一张图中
plot(ROC,
     time=3, col="orange", add=TRUE, lwd=2)

#添加标签信息
legend("bottomright",
       c(paste0("AUC at 1 year: ",round(ROC[["AUC"]][1],2)), 
         paste0("AUC at 2 year: ",round(ROC[["AUC"]][2],2)), 
         paste0("AUC at 3 year: ",round(ROC[["AUC"]][3],2))),
       col=c("red""blue""orange"),
       lty=1, lwd=2,bty = "n"
alt

多指标ROC

首先也是看一下所需要的数据结构,其中futime和event是必须的,另外的几列是你想要用来画ROC曲线图的指标,可以自己添加,在这里我使用了riskScore, gender, TNM分期。 在gender这一列,1是female,2是male,t,n,m这3列,数字代表不同的分期

str(df2)
## 'data.frame': 297 obs. of  8 variables:
##  $ event    : num  0 0 1 0 0 1 0 0 0 0 ...
##  $ age      : int  59 63 65 73 59 66 56 42 61 48 ...
##  $ riskScore: num  -0.249 -0.511 -0.211 -0.427 0.279 ...
##  $ futime   : num  3.03 1.16 1.82 1.52 1.34 ...
##  $ gender   : num  2 2 2 1 2 2 1 2 2 2 ...
##  $ t        : num  4 4 4 3 3 3 5 3 NA 4 ...
##  $ n        : num  1 5 1 1 1 1 3 1 NA 1 ...
##  $ m        : num  1 1 1 1 1 3 1 1 3 3 ...

多指标的ROC曲线非常简单,就是构建多个ROC,依次添加即可:

# riskScore的ROC曲线
ROC.risk <- timeROC(T=df2$futime,
                    delta=df2$event,   
                    marker=df2$riskScore,   
                    cause=1,                
                    weighting="marginal",   
                    times=3,   
                    iid=TRUE)


# gender的ROC曲线
ROC.gender <- timeROC(T=df2$futime,   
                      delta=df2$event,   
                      marker=df2$gender,   
                      cause=1,   
                      weighting="marginal",   
                      times=3,   
                      iid=TRUE)


# age的ROC曲线
ROC.age <- timeROC(T=df2$futime,   
                   delta=df2$event,   
                   marker=df2$age,   
                   cause=1,   
                   weighting="marginal",   
                   times=3,   
                   iid=TRUE)


# T分期的ROC曲线
ROC.T <- timeROC(T=df2$futime,
                 delta=df2$event,  
                 marker=df2$t,   
                 cause=1
                 weighting="marginal"
                 times=3
                 iid=TRUE)


# N分期的ROC曲线
ROC.N <- timeROC(T=df2$futime,   
                 delta=df2$event,   
                 marker=df2$n,   
                 cause=1,   
                 weighting="marginal",   
                 times=3,   
                 iid=TRUE)


# M分期的ROC曲线
ROC.M <- timeROC(T=df2$futime,   
                 delta=df2$event,   
                 marker=df2$m,   
                 cause=1,   
                 weighting="marginal",   
                 times=3,   
                 iid=TRUE)

把每个曲线拼在一起即可,添加一个图例:

plot(ROC.risk, time = 3, col="#E41A1C", lwd=2, title = "")
plot(ROC.gender, time = 3, col="#A65628", lwd=2, add = T)
plot(ROC.age, time = 3, col="#4DAF4A", lwd=2, add = T)
plot(ROC.T, time = 3, col="#377EB8", lwd=2, add = T)
plot(ROC.N, time = 3, col="#984EA3", lwd=2, add = T)
plot(ROC.M, time = 3, col="#FFFF33", lwd=2, add = T)
legend("bottomright",
       c(paste0("Risk score: ",round(ROC.risk[["AUC"]][2],2)), 
         paste0("gender: ",round(ROC.gender[["AUC"]][2],2)), 
         paste0("age: ",round(ROC.age[["AUC"]][2],2)),
         paste0("T: ",round(ROC.T[["AUC"]][2],2)),
         paste0("N: ",round(ROC.N[["AUC"]][2],2)),
         paste0("M: ",round(ROC.M[["AUC"]][2],2))
         ),
       col=c("#E41A1C""#A65628""#4DAF4A","#377EB8","#984EA3","#FFFF33"),
       lty=1, lwd=2,bty = "n")  
alt

本文首发于公众号:医学和生信笔记

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

本文由 mdnice 多平台发布

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

临床预测模型之生存资料的ROC曲线绘制 的相关文章

  • Spring Boot入门&整合常用框架整理丨深度好文

    一 SpringBoot简介 1 1 原有Spring优缺点分析 1 1 1 Spring的优点分析 Spring是Java企业版 Java Enterprise Edition JEE 也称J2EE 的轻量级代替品 无需开发重量级的Ent
  • 程序员思维模式 - 主调试循环

    文章目录 主调试循环 验证在图层中进行 优化循环时间 为什么快速循环更好 短循环时间是通用的吗 一些综合测试是必要的 复杂性是否会导致测试验证循环 救援的暂存环境 结论 仅通过测试进行验证基本上是在仪器上驾驶飞机 而不是能够向外看挡风玻璃
  • 腾讯、阿里多位大佬共同推荐!封神级Python学习路线+核心知识点笔

    人工智能时代下 Python毫无疑问是最热的编程语言 有人夸它功能强大还上手轻松 有人说它学习曲线不那么陡峭 但是更多的人 在推开Python的大门后却发现 Python入门容易但精通却不易 你是否也曾傻傻分不清 列表 元组 字典 集合 等
  • Jmeter实现webservice接口测试

    其实可以用jmeter两种sampler进行webservice的测试 1 SOAP XML RPC Request 但是在jmeter3 2以后版本中已经取消了这个取样器 2 HTTP请求 下面分别介绍两种方式 一 首先需要使用soupU
  • Python 简介和用途

    什么是Python Python是一种流行的编程语言 由Guido van Rossum创建 并于1991年发布 它用于以下领域 网页开发 服务器端 软件开发 数学 系统脚本编写 Python能做什么 Python可用于在服务器上创建Web
  • redis性能测试

    redis性能测试 redis提供了一个性能测试工具redis benchmark 可以使用redis benchmark命令来了解redis的性能 redis benchmark q c 50 q 表示简化输出结果 c 50 表示有五十个
  • 浅谈Django之单元测试

    一 什么是 单元测试 单元测试 是用来对一个模块 一个函数或者一个类来进行正确性检验的测试工作 如果测试通过则说明我们这个函数或功能能够正常工作 如果失败要么 测试用例 不正确 要么函数有bug需要修复 二 如何使用单元测试 from dj
  • 还记得当初自己为什么选择计算机?

    还记得当初自己为什么选择计算机 当初你问我为什么选择计算机 我笑着回答 因为我梦想成为神奇的码农 我想像编织魔法一样编写程序 创造出炫酷的虚拟世界 谁知道 我刚入门的那天 电脑却故障了 我只能用巨大的打字机来编程 我感叹道 果然这个魔法圈子
  • 网络安全之等保 2.0 测评

    一 身份鉴别 a 应对登录的用户进行身份标识和鉴别 身份标识具有唯一性 身份鉴别信息具有复杂度要求并定期更换 1 登录 mysql 查看是否使用了口令和密码的组合鉴别身份 mysql h 192 168 100 16 u root p 2
  • 外包干了5个月,技术退步太明显了。。。。。

    先说一下自己的情况 本科生生 18年通过校招进入武汉某软件公司 干了差不多4年的功能测试 今年国庆 感觉自己不能够在这样下去了 长时间呆在一个舒适的环境会让一个人堕落 而我已经在一个企业干了5个月的功能测试 已经让我变得不思进取 谈了2年的
  • 达芬奇18.6DaVinci ResolveStudio(Win/Mac)激活版

    DaVinci Resolve Studio 18是一款业界领先的视频后期制作软件 它集成了剪辑 调色 视觉特效 动态图形和音频后期制作等功能 为用户提供了完整的创作解决方案 该软件不仅适用于电影 电视和网页内容的制作 还广泛应用于广告 纪
  • 独立搭建UI自动化测试框架分享

    今天给大家分享一个selenium testng maven ant的UI自动化 可以用于功能测试 也可按复杂的业务流程编写测试用例 今天此篇文章不过多讲解如何实现CI CD 只讲解自己能独立搭建UI框架 如果有其他好的框架也可以联系我 分
  • 达芬奇18.6DaVinci ResolveStudio(Win/Mac)激活版

    DaVinci Resolve Studio 18是一款业界领先的视频后期制作软件 它集成了剪辑 调色 视觉特效 动态图形和音频后期制作等功能 为用户提供了完整的创作解决方案 该软件不仅适用于电影 电视和网页内容的制作 还广泛应用于广告 纪
  • 校招失败后,在小公司熬了 2 年终于进了字节跳动,竭尽全力....

    其实两年前校招的时候就往字节投了一次简历 结果很明显凉了 随后这个理想就被暂时放下了 但是这个种子一直埋在心里这两年除了工作以外 也会坚持写博客 也因此结识了很多优秀的小伙伴 从他们身上学到了特别多东西 把这次面试分享出来 也是希望可以帮助
  • 软件测试|Pydantic详细介绍与基础入门

    简介 Pydantic 是一个强大的 Python 库 用于数据验证和解析 特别是用于处理 JSON 数据 它的主要目标是使数据验证和解析变得简单 直观和可维护 本文将介绍 Pydantic 的基础知识 包括如何定义模型 验证数据以及处理错
  • Go 语言运算符详解:加法、算术、赋值、比较、逻辑和位运算符全面解析

    运算符用于对变量和值执行操作 加号运算符 将两个值相加 如下面的示例所示 示例代码 package main import fmt func main var a 15 25 fmt Println a 尽管加号运算符通常用于将两个值相加
  • 《Spring 测试指南》:JPA、MockMvc 和 @SpringBootTest 详解

    测试 Spring 提供了一组测试工具 可以轻松地测试 Spring 应用程序的各个组件 包括控制器 服务 存储库和其他组件 它具有丰富的测试注释 实用程序类和其他功能 以帮助进行单元测试 集成测试等 JPA 测试 Spring JPA J
  • 编程和数值计算平台:MATLAB R2023a(Win/Mac)激活版

    MATLAB R2023a是一款强大的数值计算和科学编程软件 广泛应用于工程 科学和数学领域 win版 https soft macxf com soft 3541 html id MzE5MTM 3D mac版 https www mac
  • 掌握 C# 变量:在代码中声明、初始化和使用不同类型的综合指南

    C 变量 变量是用于存储数据值的容器 在 C 中 有不同类型的变量 用不同的关键字定义 例如 int 存储整数 没有小数点的整数 如 123 或 123 double 存储浮点数 有小数点 如 19 99 或 19 99 char 存储单个
  • 如何打赢稳定性之战?

    文章目录 前言 为什么总会出现问题呢 如何证明你的稳定性做的有效果 既是持久战 也是防御战 1 提前建筑好防御工事 2 以攻为守 3 找外部支援和配合 前言 随着23年年末期间 各大厂争先恐后的出现的各种线上

随机推荐

  • nacos默认用户名密码_Nacos 权限控制介绍及实战

    转自 阿里巴巴中间件 作者 朱鹏飞 Nacos权限控制设计方案 方案背景 Nacos 自开源依赖 权限控制一直需求比较强烈 这也反应了用户需求将 Nacos 部署到生产环境的需求 最新发布的 Nacos 1 2 0版本已经支持了服务发现和配
  • 文件夹选择对话框 JS实现的两种方案

    文件夹选择对话框 JS实现的两种方案 browseFolder js 该文件定义了BrowseFolder 函数 它将提供一个文件夹选择对话框 以供用户实现对系统文件夹选择的功能
  • 监听器,过滤器,拦截器

    参考博文 文章目录 作用 三者区别 启动顺序 拦截器 简要说明 实现接口 HandlerInterceptor 自定义拦截器 配置拦截器 过滤器 简要说明 在springboot 启动类添加该注解 ServletComponentScan
  • 在word如何显示左侧的索引目录

    https jingyan baidu com article 2c8c281df82bd80008252a23 html
  • 自动控制原理知识点梳理——6.线性系统的校正方法

    主要内容是书上6 1 6 2 6 3 目录 一 系统的设计与校正问题 1 控制系统的性能指标 2 系统带宽的选择 3 校正方法 4 基本控制规律 1 比例 P 控制规律 2 比例 微分 PD 控制规律 3 积分 I 控制规律 4 比例 积分
  • osgEarth的Rex引擎原理分析(六十)TileNode与DrawTileCommand的关系

    目标 五十五 中的问题131 TileNode与DrawTileCommand的关系 DrawTileCommad的几何图形和瓦片编号从TileNode来 最终绘制是用DrawTileCommand的draw函数来实现的 DrawTileC
  • 服务器显示post是什么意思,post请求 post请求是什么

    在HTTP协议的请求类型中 post请求是一个比较常见的请求类型 也是一个使用比较频繁的请求 那么这一个请求到底是什么意思呢 这就是今天我们所要了解的内容 快来一起看一看吧 post请求 post请求的含义 向指定资源提交数据进行处理请求
  • Golang Channel通道使用简介

    Golang Channel通道使用简介 一 channel简介 chan 是 Golang 中内置的数据类型 不像 Mutex 等需要引入 它是 first class 类型 在 Go 的并发控制中起着相当重要的作用 chan 的思想来自
  • CWnd指针和HWnd

    HWND是Windows系统中对所有窗口的一种标识 即窗口句柄 这是一个SDK概念 CWnd是MFC类库中所有窗口类的基类 微软在MFC中将所有窗口的通用操作都封装到了这个类中 如 ShowWindow等等 同时它也封装了窗口句柄即m hW
  • linux下编译dbus源码,ubuntu安装dbus

    下载地址 编译安装 configure prefix home ubuntu dbus 1 13 18 install make make install 出现如下错误 configure error The pkg config scri
  • qt Graphic View 学习

    是一种基于图形项的 Graphic Item 模型 视图模式 由场景 视图 图形项组成 1 场景 QGraphicScence类 场景不可见 是管理图像项的容器 场景坐标 等价于Qpainter的逻辑坐标 窗口坐标 setwindow 一般
  • 查询及删除重复记录

    查询及删除重复记录的方法大全 1 查找表中多余的重复记录 重复记录是根据单个字段 peopleId 来判断select from peoplewhere peopleId in select peopleId from people gro
  • Notepad++ 代码格式化

    在阅读别人的代码时偶尔会遇到格式很乱 阅读起来很费劲的情况 若手动改 很容易出错且很费时间 这时可以借助一些专业的编辑器来格式化代码 NotePad 是一个轻量级的代码编辑器 占用内存少 运行速度快 但是Notepad 本身是不带这个格式化
  • Unity基础(06)—— 动画(Animation)的录制与播放

    一 录制动画 将物体移动 操作的过程录制下来保存到一个物理文件 在下次使用的时候直接用代码来调用它即可 如让物体TheCh1 绕Y轴转动90度的动画录制 1 在Unity中打开动画视图 2 选择指定物体 为其添加 Animation 组件
  • python3GUI--PyQt5打包心得(详细图文演示)

    文章目录 一 前言 二 准备工作 介绍 1 准备 2 介绍 1 pyinstaller 2 pipenv 三 项目打包 1 准备 2 打包 1 打包参数 2 虚拟环境 三 总结 一 前言 有朋友私信问我 如何把项目打包和如何减小打包后的文件
  • Handsontable 的数据保存(增删改查+导出excel)

    项目用到handsontable 插件 根据官网 API写的handsontable初始化 数据展示 ajax请求 参数封装 Controller参数接受 全局容器 var AllData var updatelist var delids
  • 基于PyQt5实现简易饮品自动售货机

    记录一个最近Python课程的作业 编写一个简易的饮品自动售货机 购物者选择需要的饮品 通过使用购物卡的方式支付 支付成功后从出货口取出饮品 使用环境 Python3 8 6 PyQt5 5 15 4 搭建的界面GUI 使用的核心代码解析
  • C++ 动态数组

    C 语言和标准库提供了两种一次分配一个对象数组的方法 C 语言定义了另一种new表达式语法 可以分配并初始化一个对象数组 标准库中包含一个名为allocator的类 允许我们将分配和初始化分离 使用allocator通常会提供更好的性能和更
  • Windows 配置双网卡

    1 内网的IP地址要提前知晓备份 外网的IP地址是自动获取的 2 查看当前路由 输入命令 route print 则会看到如下的地址 第一条是默认的外网地址 表示无论访问什么地址都是需要从该IP访问 3 删除原来路由 配置的时候 需要先删除
  • 临床预测模型之生存资料的ROC曲线绘制

    本文首发于公众号 医学和生信笔记 医学和生信笔记 专注R语言在临床医学中的使用 R语言数据分析和可视化 主要分享R语言做医学统计学 meta分析 网络药理学 临床预测模型 机器学习 生物信息学等 生存资料的ROC曲线考虑了时间因素 在画RO