Kaplan-Meier生存曲线绘制

2023-11-11

Kaplan-Meier生存曲线绘制

生存分析研究的是某个事件发生之前过去的时间,在临床研究中最常见的应用就是死亡率的估计(预测患者的生存时间),不过生存分析也可以应用于其他领域如机械故障时间等。

在R中,survival包中有很多函数可以对生存数据进行建模,可以使用survfit()函数来估计删失数据的生存曲线,使用coxph()函数用来拟合Cox比例风险模型。

在survminer包中,可以使用plot()函数、ggsurvplot()函数用来绘制Kaplan-Meier生存曲线。

今天就来学习在R中使用ggsurvplot()函数绘制Kaplan-Meier生存曲线。


目 录


1. 安装和加载R包

绘制Kaplan-Meier生存曲线需要用到的R包:survminersurvival

如果没有安装就先安装。
install.packages("survminer") # 安装survminer包
install.packages("survival") # 安装survival包
library(survminer) # 加载包
library(survival) # 加载包

2. 导入内置数据集

使用survival包的lung数据集进行演示。

data(lung) # 加载lung数据集
View(lung) # 查看数据集

lung数据集:NCCTG晚期肺癌患者的生存率。

inst # 机构代码;
time # 生存天数;
status # 生存状态,1为删失,2为死亡;
age # 年龄;
sex # 性别,1为男性,2为女性;
ph.ecog、ph.karno、pat.karno # 为病人和患者评分,这里用不到;
meal.cal # 进食时消耗的卡路里;
wt.loss # 最近6个月内的体重下降。

3. 拟合生存曲线

3.1 创建生存对象

在survival包中先使用Surv()函数创建生存对象,生存对象是将事件时间和删失信息合并在一起的数据结构。

attach(lung) # 绑定数据集
Surv(time,status) # 创建生存对象

在上面输出的生存对象中,带"+"号的表示右删失数据。

3.2 拟合曲线

R中使用survfit()函数来拟合生存曲线。

fit <- survfit(Surv(time,status) ~ sex,  # 创建生存对象 
               data = lung) # 数据集来源
fit # 查看拟合曲线信息

从上图可知,lung数据集中男性138例,女性90例;男性和女性发生感兴趣结局事件分别有112例和53例。男性和女性的中位生存时间分别为270天426天

还可以使用summary()函数输出更多详细信息。

summary(fit)

上图中survival为生存函数在生存时间点处的KM估计值。同时,输出结果中还给出了估计的标准误差和95%置信区间。

4. 绘制基础曲线

ggsurvplot(fit, data = lung)

5. 自定义曲线参数

5.1 增加中位生存时间

中位生存时间(median survival time)又称为生存时间的中位数,表示刚好有50%的个体其存活期大于该时间,是生存分析中常用的概括性统计量。

图解法是计算中位生存时间的方法。其利用生存曲线图,从纵轴生存率为50%处画一条与横轴平行的线,并与生存曲线相交,然后自交点画垂线与横轴相交,此交点对应的时间即为中位生存时间,图解法比较简单直观,但结果比较粗略。

ggsurvplot(fit, data = lung,
           surv.median.line = "hv") # 增加中位生存时间

从图上可以看出,男性的中位生存时间小于女性。

5.2 增加置信区间

ggsurvplot(fit, data = lung,
           surv.median.line = "hv",  # 增加中位生存时间
           conf.int = TRUE) # 增加置信区间

5.3 绘制累计风险曲线

ggsurvplot(fit, data = lung, 
           conf.int = TRUE, # 增加置信区间
           fun = "cumhaz") # 绘制累计风险曲线

5.4 添加风险表

ggsurvplot(fit, data = lung,
           conf.int = TRUE,  # 增加置信区间
           risk.table = TRUE) # 绘制累计风险曲线

5.5 添加总患者生存曲线

ggsurvplot(fit, # 创建的拟合对象
           data = lung,  # 指定变量数据来源
           conf.int = TRUE, # 显示置信区间
           pval = TRUE, # 添加P值
           surv.median.line = "hv",  # 添加中位生存时间线
           add.all = TRUE) # 添加总患者生存曲线

5.6 自定义调色板

ggsurvplot(fit, # 创建的拟合对象
           data = lung,  # 指定变量数据来源
           conf.int = TRUE, # 显示置信区间
           pval = TRUE, # 添加P值
           surv.median.line = "hv", # 添加中位生存时间线
           palette = "hue")  # 自定义调色板
可选调色板有 "grey","npg","aaas","lancet","jco", 
"ucscgb","uchicago","simpsons"和"rickandmorty".

6. 美化生存曲线

ggsurvplot(fit, # 创建的拟合对象
           data = lung,  # 指定变量数据来源
           conf.int = TRUE, # 显示置信区间
           pval = TRUE, # 添加P值
           surv.median.line = "hv",  # 添加中位生存时间线
           risk.table = TRUE, # 添加风险表
           xlab = "Follow up time(d)", # 指定x轴标签
           legend = c(0.8,0.75), # 指定图例位置
           legend.title = "", # 设置图例标题
           legend.labs = c("Male", "Female"), # 指定图例分组标签
           break.x.by = 100)  # 设置x轴刻度间距

7. survfit()函数

survfit(formula, data, weights, subset, na.action,  
        stype=1, ctype=1, id, cluster, istate, timefix=TRUE,
        etype, error,  ...)

## 参数解释
formula # 形如 Surv(time,status) ~ sex 的公式
data # 变量来源的数据集 
weights # 观察值的权重
subset # 数据集的子集
na.action # 处理缺失值的函数
id # 识别观察对象个体的变量
etype # 事件的类型
...

8. ggsurvplot()函数

8.1 主要参数

ggsurvplot(fit, data = NULL, fun = NULL, color = NULL,
           palette = NULL, linetype = 1, conf.int = FALSE, 
           pval = FALSE, pval.method = FALSE, 
           test.for.trend = FALSE, surv.median.line = "none", 
           risk.table = FALSE, cumevents = FALSE,
           cumcensor = FALSE, tables.height = 0.25, 
           group.by = NULL, facet.by = NULL, add.all = FALSE, 
           combine = FALSE, ggtheme = theme_survminer(), 
           tables.theme = ggtheme, ...)

# 参数解释
fit # 拟合的生存曲线对象
data # 用来拟合生存曲线的数据集
fun  # 常用三个字符参数;
# "event"绘制累积事件(f(y)=1-y),
# "cumhaz"绘制累积危害函数(f(y)=-log(y));
# "pct"绘制生存概率(百分比)。
color # 设置生存曲线的颜色。
# 如果只有1条曲线,则直接设置color="blue";
# 如果有多条曲线,默认color="strata",按分组为生存曲线着色;
# 也可以自定义调色板来设置曲线颜色。

palette # 调色板,默认"hue"。
# 可选调色板有"grey","npg","aaas","lancet", 
# "jco", "ucscgb","uchicago","simpsons"和"rickandmorty".
linetype = 1 # 设置曲线线型。可以按"strata"设置线型;
# 或按数字向量c(1, 2)或按字符向量c("solid", "dashed")设置
conf.int # 逻辑词;默认FASLE;为TRUE则绘制曲线置信区间

pval = FALSE # 逻辑词;为TRUE则将统计检验计算的p值添加到图上;
# 为数字,则直接指定P值大小,如pval = 0.03;
# 为字符串,则添加字符串到图上,如pval = "p-value: 0.031"
pval.method  # 逻辑词,是否添加计算p值的统计方法的文本;
# 只有当 pval = TRUE时, 才会在图上添加检验方法文本
test.for.trend # 逻辑词,默认为FALSE;
# 为TRUE则返回趋势p值的检验,趋势检验旨在检验生存曲线的有序差异
surv.median.line # 在中位生存时间点处绘制水平或垂直线的字符向量;
# 可用值有"none"、"hv"、"h"、"v";其中v绘制垂直线,h绘制水平线。
risk.table = FALSE  # 逻辑词,图上是否添加风险表;
# "absolute" 显示处于风险中的绝对数量;
# "percentage" 显示处于风险中的百分比数量
# "abs_pct" 显示处于风险中的绝对数量和百分比
cumevents # 逻辑词,是否添加累计事件表
cumcensor # 逻辑词,是否添加累计删失表
tables.height = 0.25 # 生存曲线图下所有生存表的高度,数值0-1之间
group.by  # 包含分组变量名称的字符向量,向量长度≤2
facet.by # 字符向量,指定绘制分面生存曲线的分组变量(应≤2)的名称
ggtheme=theme_survminer() # 设置ggplot2主题,如theme_bw()
tables.theme # 作用于生存表的ggplot2主题名称
# 有theme_survminer、theme_cleantable()
add.all = FALSE # 逻辑词;是否添加总患者生存曲线到主生存图中

8.2 图标题和坐标轴标签

title  # 图表标题
xlab, ylab # 分别指x轴和y轴标签

8.3 图例标题和位置

legend # 指定图例位置的字符向量:"top"(默认),"bottom","left","right","none"等。
# legend="none" 表示移除图例;
# 图例位置也可用数字向量c(x,y)指定,x和y的值应在0到1之间。
legend.title  # 图例标题,如legend.title = "Sex"。
legend.labs # 指定图例标签的字符向量, 替换fit中strata的名称,顺序应与strata一致。
# 如 legend.labs = c("Male","Female")

8.4 坐标轴范围、刻度间距

break.time.by # 设定坐标轴刻度间距
break.x.by # 设定x轴刻度的间距,如break.x.by = 100
break.y.by # 设定y轴刻度的间距,如break.y.by = 0.2
surv.scale # 生存曲线的比例转换。允许的值为"default"或"percent"。
xlim, ylim # 指定x轴和y轴的范围,如xlim = c(0,30), ylim = c(0,1)
axes.offset # 逻辑词,默认为TRUE。为FALSE,则生存曲线图的坐标轴从原点开始。

8.5 置信区间

以下只有在conf.int = TRUE时才生效
conf.int.fill # 设置置信区间填充的颜色
conf.int.style # 设置置信区间的类型,有"ribbon"(默认),"step"两种。
conf.int.alpha # 数值,指定置信区间填充颜色的透明度;
# 数值在0-1之间,0为完全透明,1为不透明。

8.6 P值文本大小和位置

以下只有在pval = TRUE时才生效
pval.size # 指定p值文本大小的数字,默认为 5。
pval.coord # 长度为2的数字向量,指定p值位置x、y,如pval.coord=c(x,y)。
pval.method.size # 指定检验方法 log.rank 文本的大小
pval.method.coord # 指定检验方法 log.rank 文本的坐标
log.rank.weights # 计算log-rank检验p值的权重类型的名称。

8.7 删失点

censor # 逻辑词,默认为TRUE,在图上绘制删失点。
censor.shape # 数值或字符,用于指定删失点的形状;默认为"+"(3), 可选"|"(124)。
censor.size # 指定删失点形状的大小,默认为4.5。

8.8 生存表

所有生存表的常规参数。指定以下参数时,可应用于所有生存表(风险表、累积事件表和累积删失表)。

tables.col # 生存曲线图下所有表的颜色,默认为"black";
# 按strata显示则tables.col="strata".
fontsize # 指定风险表和累积事件表的字体大小。
font.family # 指定文字字体的字符向量,如font.family="Courier New".
tables.y.text # 逻辑词,默认显示生存表的y轴刻度标签;为FALSE则刻度标签被隐藏
tables.y.text.col # 逻辑词,默认FALSE;为TRUE,则表的y刻度标签将按strata着色。
tables.height # 指定所有生存表的高度,数值在0-1之间,默认为0.25.

8.8.1 风险表

risk.table.title #  风险表的标题
risk.table.pos # 指定风险表位置的字符向量;
# 有两种,"out"在生存图外(默认),"in"在生存图内。
risk.table.col 
risk.table.fontsize
risk.table.y.text
risk.table.y.text.col 
risk.table.height 
# 这五个和上面生存表的常规参数意义是一样的
# 但是只应用在风险表中。

8.8.2 累积事件表

cumevents.title # 累积事件表的标题
cumevents.col
cumevents.y.text
cumevents.y.text
cumevents.height
# 这四个和上面生存表的常规参数意义是一样的
# 但是只应用于累积事件表中。

8.8.3 累积删失表

cumcensor.title # 累积删失表的标题
cumcensor.col
cumcensor.y.text
cumcensor.y.text.col
cumcensor.height
# 这四个和上面生存表的常规参数意义是一样的
# 但是只应用于累积删失表中。

8.9 生存图高度

surv.plot.height # 生存图的高度,默认为0.75;
# 当risk.table = FALSE时忽略

8.10 字体样式

font.title  # 标题字体
font.subtitle  # 副标题字体
font.caption
font.x、font.y  # x轴、y轴字体
font.tickslab  # 刻度标签字体
font.legend  # 图例字体

用长度为3的向量分别指定大小、类型、颜色。如:
# font.main = c(16, "bold", "darkblue")
# font.x = c(14, "italic", "red")
# font.y = c(14, "bold.italic", "darkred")
# font.tickslab = c(12, "plain", "darkgreen")
# font.x = 14 则只改变字体的大小
# font.x = "bold" 则只改变字体类型
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kaplan-Meier生存曲线绘制 的相关文章

  • DDoS攻击实验笔记

    DoS DDoS简介 DoS Denial of Service 拒绝服务攻击是通过一些方法影响服务的可用性 比如早期主要基于系统和应用程序的漏洞 只需要几个请求或数据包就能导致长时间的服务不可用 但易被入侵检测系统发现 DDoS Dist
  • 试题管理系统[详细步骤&内含源码]

    试题管理系统 需求 1 数据库中试题信息的动态展示功能 2 增加试题 3 删除单个试题功能 删除多个试题功能 4 分页查询并展示功能 所用技术 MyBatis SpringMVC idea Maven 数据库 Jsp 步骤 建表 建立表格
  • 对比学习做了什么?

    什么是对比学习 对比学习貌似处于 无明确定义 有指导原则 的状态 什么是对比学习呢 这个是微信链接 全文比较长 但是逻辑框架还是不错的 如果想要更快速的了解什么是对比学习或者说对比学习是怎么做的 可以看SimCLR这个模型文章 该文章可以说

随机推荐

  • python小游戏 滑雪小游戏设计与实现 (源码)

    文章目录 0 项目简介 1 游戏介绍 2 实现效果 3 开发工具 3 1 环境配置 3 2 Pygame介绍 4 具体实现 5 最后 0 项目简介 Hi 各位同学好呀 这里是L学长 今天向大家分享一个今年 2022 最新完成的毕业设计项目作
  • 公众号内容拓展学习笔记(2021.10.1)

    公众号内容拓展学习笔记 2021 10 1 今日要点 ICCV 2021 英伟达新研究 直接通过视频就能捕获3D人体动作 Abstract 英伟达新研究直接通过视频就能捕获3D人体动作 Paper Physics based Human M
  • 【java进阶08:异常】finally关键字、自定义异常类、用户业务作业、军队武器作业

    java中的异常处理机制 异常在java中以类和对象的形式存在 那么异常的继承结构是怎样的 我们可以使用UML图来描述以下继承结构 画UML图的工具 Rational Rose starUML等 Object下有Throwable 可抛出的
  • 计算机硬件基础-----写在最后

    今天2021 5 15 天气阴有雨 今天宜 睡觉 忌 上自习 天气预报报着今天有雨 还真就下了一天的雨到现在还没有停 上午在实验室又坐了一上午 虽然下周硬件和数据库就要考试了 因为小程序比赛最近一直也没有时间来应对考试 但下午还是选择和同学
  • 对大学生活的几点建议

    List item 在大学不要对人随意的掏心掏肺 因为你的痛苦只有你自己知道 其他人没有经历过 不会懂 也许你掏心掏肺的说一大通 在他人眼中就是幼稚 就是不成熟 我还记得自己刚上大学 因为自卑 几乎没和其他人有来往 现在虽比起以前强了 但是
  • 动态类型语言和静态类型语言

    本文内容 动态类型语言 Dynamically Typed Language 静态类型语言 Statically Typed Language 比较 参考资料 历史版本 记得我刚毕业时在第一家公司 离职那天领导找我谈话 让我暂时别走 看 B
  • 普通用户没有管理员权限但是可以安装软件或者打开Admin权限的CMD

    案例分析 除了IT肯定还有行政的吗 那IT肯定跟行政玩的好打好关系才可以顺风顺水啊 那行政肯定有些东西打开需要权限的啊 例如IT 帮别人解锁账号的工具 自己忙嘛 小事情肯定你懂的哈哈哈 偷个懒 不废话 上代码 顺便代码解析 其实就是通过se
  • 性能测试系列(二)

    性能测试之性能分析命令 1 CPU分析 a cpu基本信息 命令 lscpu Cpu架构 64 位 Cpu 核心数 6 NUMA UMA节点数为 2个 显示值加 1 Cpu的核心频率 说明此服务器为虚拟机 此服务器的 cpu使用的是 使用的
  • 如何使用python实现自动化办公?全网最全干货来了!

    大家好 接下来我们来学习如何使用python 实现自动化办公 而不需要我们人工 或者说尽量减少我们人工的参与 文末领读者福利 自动化办公在我们的生活中非常的常见 让我们看看通过本博客你可以学习到python哪些自动化操作 看完这幅图 大家就
  • Python Web开发的完整指南

    博客 https somenzz cn 电脑阅读更方便 阅读原文可访问文中的链接 学了 Python 这么长时间了 终究觉得编程语言仅仅是个工具 要想通过技术实现自己的价值 终究离不开具体的应用场景 而应用场景繁多 我们的时间和精力都是有限
  • 前端(技巧+踩坑记录)

    1 计算属性用法 2 map返回数据 3 过渡效果 移动端过渡 效果图 更多过渡效果 进入 离开 列表过渡 Vue js pc端过渡动画 直接用el组件 自带过渡 4 el分页组件 5 svelte js vite使用sass 5 1 下载
  • TOP100案例分享 “预测性维护”

    科技领域每年有哪些技术和产品正在成为不可磨灭的 标记 和 符号 国内外科技圈又有哪些人和组织最值得点赞 哪些创新案例最值得借鉴和复盘 由麦思博 msup 有限公司主办的 以 人工智能时代的研发战略演进 为主方向的第六届全球软件案例研究峰会
  • 求两个数的 最大公约数 和最小公倍数

    最大公约数 思路 假设有两个数a b 求a b的最大公约数 令a b 得到的结果用tmp记录 再将b的值给a tmp的值给b 此时a的值变成了b b的值变成了tmp 循环进行a b 直至a b的结果为0时 循环结束 此时b的值即为最小公约数
  • QString 转换为 char */ unsigned char *

    1 QString 转换为 char 将 QString 转 char 需要用到 QByteArray 类 QByteArray 类的说明详见 Qt 帮助文档 因为 char 最后都有一个 0 作为结束符 而采用 QString toLat
  • 数据分析入门-SARIMA模型案例分析(超详细)

    由于代码中注释已经非常的清晰 文章中就不过多叙述了 直接上代码 代码如下 在开始之前先导入所需要的包 import warnings do not disturbe mode warnings filterwarnings ignore i
  • 9.9+9.14字节三轮面试手撕代码记录

    一 根据字符出现的频率重新排列字符串 如 happy gt pphap import java util Scanner import java util Map import java util HashMap import java u
  • 电感升压(boost电路)感性理解

    目录 前言 一 电感升压基本原理 二 工作原理步骤 1 开关闭合 给电感和电容充电 电容获得输入电压 2 开关断开 电感继续给电容充能 电容获得更高电压 总结 前言 以前在消费类小家电方案中 经常用到电感升压的应用 一个很典型的应用是手持小
  • sh脚本报错“eval: line 1: syntax error: unterminated quoted string”

    有个之前一直正常运行的脚本 突然报错了 eval line 1 syntax error unterminated quoted string 提示也比较直接eval使用出的问题 过滤一下脚本内容 果然找到了一个疑似问题代码 eval ec
  • 切割列表[]

    import sys def sliceABC sequence start 0 K len sequence if start gt K print 切割数量超出范围 sys exit return sequence start K se
  • Kaplan-Meier生存曲线绘制

    Kaplan Meier生存曲线绘制 生存分析研究的是某个事件发生之前过去的时间 在临床研究中最常见的应用就是死亡率的估计 预测患者的生存时间 不过生存分析也可以应用于其他领域如机械故障时间等 在R中 survival包中有很多函数可以对生