如何用ggsurvfit在风险表中强制显示指定时间点的最终累积发病率?
解决ggsurvfit风险表强制显示指定时间点最终累积发病率的问题
修改核心代码
通过指定风险表显示时间点,并让模型延伸估计值到目标时间,即可实现25个月处显示最终累积发病率:
library(ggsurvfit) library(tidycmprsk) # 拟合模型时允许估计值延伸至超出数据最大随访时间 fit <- survfit2(Surv(ttdeath, death_cr) ~ trt, data = trial, extend = TRUE) fit |> ggcuminc(outcome = "death from cancer") + add_risktable( # 强制风险表在0、5、10...25这些时间点显示统计量 times = seq(0, 25, by = 5), risktable_stats = c("{n.risk}", "{cum.event}", "{round((estimate)*100)}%"), stats_label = c("At Risk", "Cumulative Events", "Cumulative Incidence"), size = 3 ) + scale_ggsurvfit(x_scales = list(breaks = seq(0, 25, by = 5), limits = c(-1, 26)))
关键参数说明
survfit2(extend = TRUE):开启后模型会将累积发病率的估计值延伸到超出数据中最大随访时间的点,25个月处会自动沿用最后一个随访时间点的累积发病率结果。add_risktable(times = seq(0,25,5)):直接指定风险表要展示的时间点,覆盖默认仅显示事件发生时间的逻辑,确保25个月被包含在内。
手动控制统计值(可选)
如果需要更精准地定义25个月处的统计值,可以先将拟合结果转为 tidy 格式,手动补充目标时间点的数据后再绘图:
# 提取模型结果并补充25个月的统计值 tidy_fit <- fit |> tidycmprsk(outcome = "death from cancer") |> group_by(strata) |> # 获取每组最后一个时间点的统计值,替换时间为25 slice_tail(n = 1) |> mutate(time = 25) |> # 合并原数据,确保所有时间点都存在 bind_rows(fit |> tidycmprsk(outcome = "death from cancer")) |> arrange(strata, time) # 基于处理后的tidy数据绘图 tidy_fit |> ggcuminc() + add_risktable( times = seq(0, 25, by = 5), risktable_stats = c("{n.risk}", "{cum.event}", "{round((estimate)*100)}%"), stats_label = c("At Risk", "Cumulative Events", "Cumulative Incidence"), size = 3 ) + scale_ggsurvfit(x_scales = list(breaks = seq(0, 25, by = 5), limits = c(-1, 26)))
内容的提问来源于stack exchange,提问作者user28632583
相关产品推荐
相关产品推荐

