imd 统计教程 · 生存分析与竞争风险
← 教程首页 返回本模块

叠加Y轴局部放大的双生存曲线图绘制

聂志强实战医学统计2023-05-08 21:49:27广东

近期要做一个叠加Y轴局部放大的双生存曲线图,总结了一些经验和模板。

一、 样图

样图1来自https://www.nejm.org/doi/full/10.1056/NEJMoa1800410,

图2来自https://pubmed.ncbi.nlm.nih.gov/34708996/。

二、重现

2.1 已有代码

小编搜索网络,发现一些文章也有阐述,但是prism和sas输出图比较丑。R设置复杂,但缺少详细教程。

2.2 R详解

survminer包的ggsurvplot()函数和ggsurvfit包survfit2 可实现NEJM格式。

① ggsurvplot绘制

survminer::ggsurvplot函数设定risk.table类型:推荐risk.table= “nrisk_cumevents”, 格式有"absolute" 、 "percentage"、 "abs_pct"、 "nrisk_cumcensor" 、"nrisk_cumevents";也可以直接TRUE或FALSE。曲线形式参数推荐fun = "event", 具体有"event"绘制累计风险概率图 (f(y)=1-y);"cumhaz"绘制累计风险(HR);"pct"绘制生存概率(用百分比表示),默认为生存曲线pct。图形支持置信区间和经典杂志配色,推荐npg。Survminer包的优势是足够灵活,p值、图例等等自定义十分优秀。2条KM曲线合并的难点在于ggsurvplot函数输出是list,其中plot和table是分离。

② ggsurvfit绘制

ggsurvfit支持expand = c(0, 0)坐标轴(0,0)起始。add_pvalue 参数用于显示P值,但是add_pvalue(location  = "annotation", x = 4) 则p值图上会冲突risktable。官网案例见https://www.danieldsjoberg.com/ggsurvfit/articles/gallery.html 。ggsurvfit 图例需要提前factor定义水平,尽管如此,在no at risk的时候,最左侧依然有bug显示不全。

ggsurvfit:: ggcuminc函数同时支持竞争风险函数,但是中文不友好需要设为英文xy标题。

2.3 R代码

#================ ggsurvfit包survfit2 函数======================
pacman::p_load(ggsurvfit,patchwork)
fit <- survfit2(Surv(totalevent_scxf_timecox,totalevent_scxf) ~ sbpgroup4, data = xz)
#ggsurvfit包将绘图代码打包成了ggsurvfit()函数
fit %>% ggsurvfit()

#① survfit2函数,cumhaz累积风险xy轴单位
p1 <- survfit2(Surv(totalevent_scxf_timecox,totalevent_scxf) ~ sbpgroup4, data = xz) %>% 
  ggsurvfit(linewidth = 0.8, type = "survival") + #生存曲线宽度
  #“survival”生存分析, “risk”, “cumhaz”累积风险
  add_confidence_interval() + # 添加置信区间
  theme_classic(base_size = 12) + #theme_classic theme_bw主题
  add_pvalue(caption = "Log-rank {p.value}") +  #p值右下角 
  #add_pvalue(location  = "annotation", x = 4) #p值图上会冲突risktable
  theme(legend.position = c(0.2, 0.2))+
  add_risktable(size = 3, risktable_height = 0.30) +
  #款式1 at risk 和 events分开;
  #款式2 at risk(event)
  #add_risktable(risktable_stats = "{n.risk} ({cum.event})")
  #add_risktable_strata_symbol(symbol = "\U25CF", size = 10)+ #圆点水平
  #增加at risk 和 events tables
  #add_censor_mark() 增加删失值
  #add_quantile(linetype = 2, color = "red") 添加四分位线,默认添加中位线
  labs(title = "Modified", x="Follow up time, years",y = "Cumulative incidence")
  ggsci::scale_fill_nejm()
p1
# |> 等于 %>% ;
ggsave("p1.pdf", p1, width = 8, height =6 , device = cairo_pdf, family = "Times")
#inset_element会导致risktable消失
#p1 +inset_element(p2,left = 0.5, bottom = 0.5, right = 0.99, top = 0.99) 
......

......
#---④  竞争风险 ggcuminc;death竞争
library(tidycmprsk)
p6 <- survfit2(Surv(death_scxf_timecox,as.factor(death_scxf)) ~ sbpgroup4, xz) %>% 
  ggcuminc(outcome = "1") + 
  #012竞争分类,y为事件1
  add_confidence_interval() +
  add_risktable()
p6
#竞争风险,变量分类为“death from cancer"、"death other causes”、“censor”
#案例为 outcome = "death from cancer"

三、 小结

survminer和ggsurvfit包前者更完善,后者稍有bug但是y轴可自动缩放最优,也可定义分组图例。

获取完全代码请尽快后台留言(代码仅保留7天): ggsurvfit双图