R|生存分析 - KM曲线 ,必须拥有姓名和颜值
生存分析作为分析疾病/癌症预后的出镜频率超高的分析手段,而其结果展示的KM曲线也必须拥有姓名和颜值!
生存分析相关推文:
生存分析和KM曲线:R|生存分析(1)
分析结果一键输出:R|生存分析-结果整理
时间依赖生存分析:R|timeROC-分析
一 载入数据,R包
R-survival包生存分析,R-survminer进行KM曲线展示,我喜欢这个组合。
为了复现方便,使用内置lung数据集
#载入所需的R包
library("survival")
library("survminer")
#载入并查看数据集
data("lung")
head(lung)
inst time status age sex ph.ecog ph.karno pat.karno meal.cal wt.loss
1 3 306 2 74 1 1 90 100 1175 NA
2 3 455 2 68 1 0 90 90 1225 15
3 3 1010 1 56 1 0 90 90 NA 15
4 5 210 2 57 1 1 90 60 1150 11
5 1 883 2 60 1 0 100 90 NA 0
6 12 1022 1 74 1 1 50 80 513 0
二 原生KM曲线
#构建模型
fit <- survfit(Surv(time, status) ~ sex, data=lung)
#绘制原生KM曲线
plot(fit)
可以很容易的发现与文献中的差异,部分可优化点:
1)区分两条线的颜色和legend
2)坐标轴,标题,主题优化
3)Risk table
4)P值,OR值,CI值等注释信息
三 KM曲线“美颜”
1 survminer绘制KM曲线
p1 <- ggsurvplot(fit)
p1
呐,线的颜色可以和性别对应起来了,Q1解决!
2 坐标轴,标题,主题优化
p2 <- ggsurvplot(fit, data = lung,
surv.median.line = "hv", #添加中位生存曲线
palette=c("red", "blue"), #更改线的颜色
legend.labs=c("Sex1","Sex2"), #标签
legend.title="Treatment",
title="Overall survival", #标题
ylab="Cumulative survival (percentage)",xlab = " Time (Days)", #更改横纵坐标
censor.shape = 124,censor.size = 2,conf.int = FALSE, #删失点的形状和大小
break.x.by = 100#横坐标间隔
)p2
以上基本就完成了KM曲线颜色,线型大小,标签,横纵坐标,标题,删失点等的修改,Q2搞定!
注意:中位生存时间表示50 %的个体尚存活的时间,而不是生存时间的中位数!
3 Risk Table
p3 <- ggsurvplot(fit, data = lung,
surv.median.line = "hv", #添加中位生存曲线
palette=c("red", "blue"),
legend.labs=c("Sex1","Sex2"), #标签
legend.title="Treatment",
title="Overall survival",
ylab="Cumulative survival (percentage)",xlab = " Time (Days)", #更改横纵坐标
censor.shape = 124,censor.size = 2,conf.int = FALSE,
break.x.by = 100,
risk.table = TRUE,tables.height = 0.2,
tables.theme = theme_cleantable(),
ggtheme = theme_bw())p3
注 tables.height可调整为看起来“舒服”的高度
根据risk table 可以看出关键点的当前状态,Q3摆平!
4 添加注释信息
1)添加KM的P值
P4 <- ggsurvplot(fit, data = lung,
pval = TRUE,#添加P值
pval.coord = c(0, 0.03), #调节Pval的位置
surv.median.line = "hv", #添加中位生存曲线
palette=c("red", "blue"),
legend.labs=c("Sex1","Sex2"), #标签
legend.title="Treatment",
title="Overall survival",
ylab="Cumulative survival (percentage)",xlab = " Time (Days)", #更改横纵坐标
censor.shape = 124,censor.size = 2,conf.int = FALSE,
break.x.by = 100,
risk.table = TRUE,tables.height = 0.2,
tables.theme = theme_cleantable(),
ggtheme = theme_bw())
P4
pval.coord可以调节P值得位置
2)添加COX回归hazard ratio值等相关信息
###添加HR ,CI ,P
res_cox<-coxph(Surv(time, status) ~sex, data=lung)
p3$plot = p3$plot + ggplot2::annotate("text",x = 50, y = 0.15,
label = paste("HR :",round(summary(res_cox)$conf.int[1],2))) + ggplot2::annotate("text",x = 50, y = 0.10,
label = paste("(","95%CI:",round(summary(res_cox)$conf.int[3],2),"-",round(summary(res_cox)$conf.int[4],2),")",sep = ""))+
ggplot2::annotate("text",x = 50, y = 0.05,
label = paste("P:",round(summary(res_cox)$coef[5],4)))
p3
3)添加其他信息
可类似上述annotation得方式,使用ggplot2添加文字,箭头,公式等其他信息,下面为你可能需要的ggplot2的几个知识:
ggplot2|详解八大基本绘图要素
ggplot2|theme主题设置,详解绘图优化-“精雕细琢”
ggplot2 |legend参数设置,图形精雕细琢
ggplot2|ggpubr进行“paper”组图合并
参考资料:
更多参数参见官方文档:https://github.com/kassambara/survminer
- Java基础-07(02).总结private,this,封装,static,成员方法变量,局部变量匿名对象
- 通过shell脚本快速定位active session问题(r4笔记第65天)
- 01 整合IDEA+Maven+SSM框架的高并发的商品秒杀项目之业务分析与DAO层
- JSP第六篇【自定义标签之传统标签】
- 过滤器监听器面试题都在这里
- 02 整合IDEA+Maven+SSM框架的高并发的商品秒杀项目之Service层
- JSP第五篇【JSTL的介绍、core标签库、fn方法库、fmt标签库】
- java中的序列化 (r4笔记第64天)
- JSP第四篇【EL表达式介绍、获取各类数据、11个内置对象、执行运算、回显数据、自定义函数、fn方法库】
- 03 整合IDEA+Maven+SSM框架的高并发的商品秒杀项目之web层
- JSP第三篇【JavaBean的介绍、JSP的行为--JavaBean】
- Java基础-06.总结二维数组,面向对象
- 04 整合IDEA+Maven+SSM框架的高并发的商品秒杀项目之高并发优化
- 过滤器第一篇【介绍、入门、简单应用】
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【JAVA基础&高级】“面向对象篇” 知识点汇总
- pycharm 入门基础配置
- CS学习笔记 | 16、用户枚举三个关键步骤
- Python数据分析实战(1)数据分析概述
- JVM面试常问知识点
- Python 为什么没有 void 关键字?
- FPGA设计心得(10)关于行为仿真的一点观点
- 一、Axios基础
- 二、fetch中的基础语法
- Laradock 运行 Nuxt 的一些问题
- Spring缓存注解@Cacheable、@CacheEvict、@CachePut
- 微信小程序设置请求超时
- SAP CRM One Order函数CREATE_OW的设计原理
- 决策树(decision tree)
- 寻找质数—埃式筛法