如何用ggsurvplot合并两组Cox PH模型对应的Kaplan-Meier曲线?
合并两组Kaplan-Meier曲线到同一图中的方法
要把你手中两组(≤19岁和>19岁)的Kaplan-Meier曲线合并展示,最简洁高效的方式是先将两个数据集合并并添加分组标识,再统一拟合生存曲线后绘图,具体操作如下:
1. 合并数据集并添加分组变量
因为两个数据集结构完全一致,我们可以用rbind()合并,同时通过transform()新增一列标记分组:
# 合并数据集并生成分组列 data.all.agefs <- rbind( transform(data.all.agefs.under19, age_group = "≤19岁"), transform(data.all.agefs.above19, age_group = ">19岁") )
2. 创建统一的生存对象
基于合并后的数据集创建Surv对象,后续拟合曲线会用到:
surv.all.agefs <- Surv(time = data.all.agefs$follow.up.years, event = data.all.agefs$death.specific)
3. 拟合分组的Kaplan-Meier模型
使用survfit()按新添加的age_group分组拟合生存曲线:
km_fit <- survfit(surv.all.agefs ~ age_group, data = data.all.agefs)
4. 用ggsurvplot绘制合并曲线
调用ggsurvplot()绘制包含两组曲线的图,还可以自定义颜色、图例、风险表等元素:
library(survminer) ggsurvplot( km_fit, data = data.all.agefs, palette = c("#E7B800", "#2E9FDF"), # 自定义两组曲线的颜色 legend.title = "年龄分组", legend.labs = c("≤19岁", ">19岁"), # 自定义图例标签 xlab = "随访时间(年)", ylab = "生存率", risk.table = TRUE, # 可选:添加下方的风险人数表 pval = TRUE, # 可选:添加log-rank检验的P值 surv.median.line = "hv" # 可选:添加中位生存时间的水平线 )
备选方案:不合并数据集的绘图方式
如果你不想合并原始数据集,也可以分别拟合两组的KM曲线,再用ggarrange()将两个ggsurvplot对象合并,但这种方式不如合并数据集的方法简洁,示例如下:
# 分别拟合两组KM曲线 km_under19 <- survfit(surv.all.agefs.under19 ~ 1, data = data.all.agefs.under19) km_above19 <- survfit(surv.all.agefs.above19 ~ 1, data = data.all.agefs.above19) # 分别生成绘图对象 p1 <- ggsurvplot(km_under19, data = data.all.agefs.under19, legend = "none", ylab = "生存率") p2 <- ggsurvplot(km_above19, data = data.all.agefs.above19, legend = "none", xlab = "随访时间(年)") # 合并两个图 ggarrange(p1$plot, p2$plot, ncol = 1, nrow = 1, common.legend = TRUE, legend = "bottom")
不过更推荐第一种合并数据集的方法,它能自动处理分组的图例、统计检验,整体更规范。
内容的提问来源于stack exchange,提问作者aposo.wie




