生存分析研究的是某个事件发生之前过去的时间,在临床研究中最常见的应用就是死亡率的估计(预测患者的生存时间),不过生存分析也可以应用于其他领域如机械故障时间等。
在R中,survival包中有很多函数可以对生存数据进行建模,可以使用survfit()函数来估计删失数据的生存曲线,使用coxph()函数用来拟合Cox比例风险模型。
在survminer包中,可以使用plot()
函数、ggsurvplot()
函数用来绘制Kaplan-Meier生存曲线。
今天就来学习在R中使用ggsurvplot()函数绘制Kaplan-Meier生存曲线。
目 录
- 1. 安装和加载R包
- 2. 导入内置数据集
- 3. 拟合生存曲线
- 3.1 创建生存对象
- 3.2 拟合曲线
- 4. 绘制基础曲线
- 5. 自定义曲线参数
- 5.1 增加中位生存时间
- 5.2 增加置信区间
- 5.3 绘制累计风险曲线
- 5.4 添加风险表
- 5.5 添加总患者生存曲线
- 5.6 自定义调色板
- 6. 美化生存曲线
- 7. survfit()函数
- 8. ggsurvplot()函数
- 8.1 主要参数
- 8.2 图标题和坐标轴标签
- 8.3 图例标题和位置
- 8.4 坐标轴范围、刻度间距
- 8.5 置信区间
- 8.6 P值文本大小和位置
- 8.7 删失点
- 8.8 生存表
- 8.9 生存图高度
- 8.10 字体样式
- End
1. 安装和加载R包
绘制Kaplan-Meier生存曲线需要用到的R包:survminer
和survival
。
如果没有安装就先安装。
install.packages("survminer") # 安装survminer包
install.packages("survival") # 安装survival包
library(survminer) # 加载包
library(survival) # 加载包
2. 导入内置数据集
使用survival
包的lung
数据集进行演示。
data(lung) # 加载lung数据集
View(lung) # 查看数据集
![b144d0223cf0149383a52e94caf975fe.png](https://i-blog.csdnimg.cn/blog_migrate/a832796291c47de9784f7b02c35f1e82.png)
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) # 创建生存对象
![959ca32df6dac22ce77d6988bfd39a0f.png](https://i-blog.csdnimg.cn/blog_migrate/d5fbc8cdd00488a83d341084689273ff.jpeg)
在上面输出的生存对象中,带"+"号的表示右删失数据。
3.2 拟合曲线
R中使用survfit()函数来拟合生存曲线。
fit <- survfit(Surv(time,status) ~ sex, # 创建生存对象
data = lung) # 数据集来源
fit # 查看拟合曲线信息
![87638c561ac766b3651fdd29f9e2c5f1.png](https://i-blog.csdnimg.cn/blog_migrate/a7fc123496c0a41094593c4f350e5ede.jpeg)
从上图可知,lung数据集中男性138例,女性90例;男性和女性发生感兴趣结局事件分别有112例和53例。男性和女性的中位生存时间分别为270天
和426天
。
还可以使用summary()函数输出更多详细信息。
summary(fit)
![9438207f3e83dd6dab94a389ae8f6c5c.png](https://i-blog.csdnimg.cn/blog_migrate/91d5feeba8ec600a4b6f9bb72e19a123.jpeg)
上图中survival为生存函数在生存时间点处的KM估计值。同时,输出结果中还给出了估计的标准误差和95%置信区间。
4. 绘制基础曲线
ggsurvplot(fit, data = lung)
![919d76e847d9029b34bf399ffe0c14ab.png](https://i-blog.csdnimg.cn/blog_migrate/eeecb23bb7edbfeab2ca8d87b6bbf2bf.jpeg)
5. 自定义曲线参数
5.1 增加中位生存时间
中位生存时间(median survival time)又称为生存时间的中位数,表示刚好有50%
的个体其存活期大于该时间,是生存分析中常用的概括性统计量。
图解法是计算中位生存时间的方法。其利用生存曲线图,从纵轴生存率为50%处画一条与横轴平行的线,并与生存曲线相交,然后自交点画垂线与横轴相交,此交点对应的时间即为中位生存时间,图解法比较简单直观,但结果比较粗略。
ggsurvplot(fit, data = lung,
surv.median.line = "hv") # 增加中位生存时间
![8c94fc4acb7518499564f614d9980117.png](https://i-blog.csdnimg.cn/blog_migrate/bcb12d379ee4fb2714eaa7d6afd83735.jpeg)
从图上可以看出,男性的中位生存时间小于女性。
5.2 增加置信区间
ggsurvplot(fit, data = lung,
surv.median.line = "hv", # 增加中位生存时间
conf.int = TRUE) # 增加置信区间
![3c4f99b2486fdcabea282d06229e6901.png](https://i-blog.csdnimg.cn/blog_migrate/3ea852c02dc913092678dd12899c6fef.jpeg)
5.3 绘制累计风险曲线
ggsurvplot(fit, data = lung,
conf.int = TRUE, # 增加置信区间
fun = "cumhaz") # 绘制累计风险曲线
![ca8053a7b2fd1ca3f70ffa95c32f8ad0.png](https://i-blog.csdnimg.cn/blog_migrate/0bacdc015a5ccb7add2a3b845e318b26.jpeg)
5.4 添加风险表
ggsurvplot(fit, data = lung,
conf.int = TRUE, # 增加置信区间
risk.table = TRUE) # 绘制累计风险曲线
![bf74f3504f809a1a26e2912377f9a004.png](https://i-blog.csdnimg.cn/blog_migrate/ee7edf43eb82959598c7ed55c1c23f36.jpeg)
5.5 添加总患者生存曲线
ggsurvplot(fit, # 创建的拟合对象
data = lung, # 指定变量数据来源
conf.int = TRUE, # 显示置信区间
pval = TRUE, # 添加P值
surv.median.line = "hv", # 添加中位生存时间线
add.all = TRUE) # 添加总患者生存曲线
![e007e861ba9232f481a5d556917046b3.png](https://i-blog.csdnimg.cn/blog_migrate/0a0ef6efd730454757eb34db67e34a6d.png)
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".
![2789b1e4221aa2581bb738659e0544a8.png](https://i-blog.csdnimg.cn/blog_migrate/0adff92194d4901328178923343d7eaf.png)
![dca6ce7048dd86c71e547fd9ed24d897.png](https://i-blog.csdnimg.cn/blog_migrate/5cc63db120bdc0164f72a48e5a0e5d02.png)
![efdff0df5b340068f1c5f9774acf4399.png](https://i-blog.csdnimg.cn/blog_migrate/d19d2ebb6da456eb47b9297242da7193.png)
![530eba230d03db568735a3fb9656352e.png](https://i-blog.csdnimg.cn/blog_migrate/213187347ce6eb38f7c1e3b981e71d13.png)
![938745963b7837d80396e03a54402b6e.png](https://i-blog.csdnimg.cn/blog_migrate/e3ce3391365217e60c3d552cc5aa47b4.png)
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轴刻度间距
![a4edb9f568718b34d8768ff612b2894b.png](https://i-blog.csdnimg.cn/blog_migrate/48fb3ae1939671f8f770583c56c24bb2.jpeg)
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 # 逻辑词;是否添加总患者生存曲线到主生存图中
![0dc111f909d7f0a332fcb84abc603e79.png](https://i-blog.csdnimg.cn/blog_migrate/900ebb7471e89537e76eb137b6d32038.png)
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" 则只改变字体类型
End
http://weixin.qq.com/r/si7g_C3EJXBarWmb93ug (二维码自动识别)