临床预测模型之生存资料的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曲线绘制 的相关文章

  • C语言经典100例题(18)--题目:求s=a+aa+aaa+aaaa+aa...a的值

    目录 题目 问题分析 代码 测试结果 题目 求s a aa aaa aaaa aa a的值 其中a是一个数字 例如2 22 222 2222 22222 此时共有5个数相加 几个数相加有键盘控制 问题分析 加数之间的规律 a a 0 10
  • 使用Jmeter进行http接口性能测试

    在进行网页或应用程序后台接口开发时 一般要及时测试开发的接口能否正确接收和返回数据 对于单次测试 Postman插件是个不错的Http请求模拟工具 但是Postman只能模拟单客户端的单次请求 而对于模拟多用户并发等性能测试 就必须借助其他
  • 如何利用Requestly提升前端开发与测试的效率

    前端测试 在进行前端页面开发或者测试的时候 我们会遇到这一类场景 在开发阶段 前端想通过调用真实的接口返回响应 在开发或者生产阶段需要验证前端页面的一些 异常场景 或者 临界值 时 在测试阶段 想直接通过修改接口响应来验证前端页面是否正常
  • Go 语言注释教程

    注释是在执行时被忽略的文本 注释可用于解释代码 使其更易读 注释还可用于在测试替代代码时防止代码执行 Go支持单行或多行注释 Go单行注释 单行注释以两个正斜杠 开头 在 和行尾之间的任何文本都将被编译器忽略 不会被执行 示例 This i
  • Python 简介和用途

    什么是Python Python是一种流行的编程语言 由Guido van Rossum创建 并于1991年发布 它用于以下领域 网页开发 服务器端 软件开发 数学 系统脚本编写 Python能做什么 Python可用于在服务器上创建Web
  • Linux学习教程 Linux入门教程(超全面 超详细)收藏这一篇就够了

    Linux是什么 linux是一个开源 免费的操作系统 其稳定性 安全性 处理多并发能力已经得到业界的认可 目前大多数企业级应用甚至是集群项目都部署运行在 linux操作系统 之上 很多软件公司考虑到开发成本都首选linux 在中国软件公司
  • APP测试设计要点

    app的安装与升级 升级中用户数据 设置 状态的保留 特别注意新版本已去掉的状态或设置 是否可以隔开版本覆盖安装 是否可以覆盖安装更低版本 卸载安装 安装目录清理 SD卡存储数据不被清理 在没有更新或网络时 需要给予用户正确的信息表达 如果
  • 卖过房,进过厂,毕业两年后这个99年的小哥哥毅然转行车载测试,收入翻番!

    21年大学毕业的时候 我就知道可能接下来找工作是个难题 这年头 大学生早就不值钱了 毕业生人数一年比一年高 但企业的招聘岗位却只有那么几个 再加上疫情影响 各行各业都在缩减开支 减少招聘 985 211等重点大学的人才人家还挤破头 哪里还有
  • 现在的00后,实在是太卷了......

    现在的小年轻真的卷得过分了 前段时间我们公司来了个00年的 工作没两年 跳槽到我们公司起薪18K 都快接近我了 后来才知道人家是个卷王 从早干到晚就差搬张床到工位睡觉了 最近和他聊了一次天 原来这位小老弟家里条件不太好 一大家子指望他一个人
  • 浅谈Django之单元测试

    一 什么是 单元测试 单元测试 是用来对一个模块 一个函数或者一个类来进行正确性检验的测试工作 如果测试通过则说明我们这个函数或功能能够正常工作 如果失败要么 测试用例 不正确 要么函数有bug需要修复 二 如何使用单元测试 from dj
  • 移动端APP自动化测试框架-UiAutomator2基础

    很早以前 我用 uiautomator java实践过Android APP自动化测试 不过今天要提的不是uiautomator 而是uiautomator2 听起来uiautomator2像是uiautomator的升级版 但是这两款框架
  • GoLong的学习之路,进阶,Viper(yaml等配置文件的管理)

    本来有今天是继续接着上一章写微服务的 但是这几天有朋友说 再写Web框架的时候 遇到一个问题 就是很多的中间件 redis 微信 mysql mq 的配置信息写的太杂了 很不好管理 希望我能写一篇有管理配置文件的 所以这篇就放到今天写吧 微
  • 从一个程序员的角度看东方甄选“小作文”事件

    最近东方甄选 小作文 风波愈演愈烈 开始小编和观众吵架 后面东方小孙本来想要平息风波 而 摔手机 和泄漏董宇辉薪资待遇有激起更大的风波 导致东方甄选粉丝每天都几万 几十万的下降 作为一个消费者 开始是不太能理解东方甄选的这些骚操作 东方甄选
  • 独立搭建UI自动化测试框架分享

    今天给大家分享一个selenium testng maven ant的UI自动化 可以用于功能测试 也可按复杂的业务流程编写测试用例 今天此篇文章不过多讲解如何实现CI CD 只讲解自己能独立搭建UI框架 如果有其他好的框架也可以联系我 分
  • 恐怖单机游戏:坤坤之夜 KUNKUNNIGHT 中文免安装版

    坤坤之夜 是一款结合了恐怖和恶搞元素的独立游戏 开发时长约为两年半 游戏以第一人称视角展开 讲述了一个虚构的恐怖故事 在游戏中 玩家将与一个名叫坤坤的男子进行一场惊心动魄的逃生经历 游戏特点 恐怖与恶搞元素 游戏在恐怖氛围的营造上十分用心
  • MySQL忘记密码了怎么办

    MySQL忘记密码 今天在写jdbc时很悲催的发现自己的MySQL密码忘记了 没有办法了 重新设置一下密码吧 先关闭mysql服务mysql server stop 跳过权限检验 在使用该命令的时候要确保mysql服务是关闭的 不然是无法正
  • MySQL忘记密码了怎么办

    MySQL忘记密码 今天在写jdbc时很悲催的发现自己的MySQL密码忘记了 没有办法了 重新设置一下密码吧 先关闭mysql服务mysql server stop 跳过权限检验 在使用该命令的时候要确保mysql服务是关闭的 不然是无法正
  • Docker CLI 实战指南:从基础命令到 Dockerfile 构建和 Docker Compose

    Docker CLI 命令行界面 是一个强大的工具 可让您与 Docker 容器 映像 卷和网络进行交互和管理 它为用户提供了广泛的命令 用于在其开发和生产工作流中创建 运行和管理 Docker 容器和其他 Docker 资源 安装 要开始
  • 软件测试|Pydantic处理时间类型数据

    简介 我们之前介绍过使用 pydantic 验证数据 比如校验数据的格式等 但是在我们的日常工作中 还有一种数据是需要我们验证的 比如时间数据 时间数据不同于字符串 列表等数据 与他们的验证不一样 本文就来为大家介绍一下 pydantic
  • 深入了解 Python MongoDB 查询:find 和 find_one 方法完全解析

    在 MongoDB 中 我们使用 find 和 find one 方法来在集合中查找数据 就像在MySQL数据库中使用 SELECT 语句来在表中查找数据一样 查找单个文档 要从MongoDB的集合中选择数据 我们可以使用 find one

随机推荐

  • 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