如何使用ggsurvfit::ggsurvfit()绘制log-minus-log图?
解决ggsurvfit绘制log-minus-log图的初始值异常问题
直接修改survfit2对象的surv值会因为time=0时生存概率为1,计算log(-log(1))得到负无穷,导致绘图起始部分异常。推荐用以下两种更稳妥的方法:
方法一:利用ggplot2内置的log-minus-log变换
ggplot2自带logminuslog变换,搭配ggsurvfit直接使用,同时通过limits参数过滤异常的初始值:
library(ggsurvfit) library(ggplot2) # 拟合生存模型 temp <- survfit2(Surv(time, status) ~ adhere, data = df_colon) # 绘制log-minus-log图 ggsurvfit(temp) + geom_step() + scale_y_continuous( name = "log(-log(生存概率))", trans = "logminuslog", # 根据你的数据调整y轴范围,避开负无穷 limits = c(-5, 0) )
方法二:通过stat_surv指定变换函数
直接在stat_surv层中设置fun参数应用变换,同样可通过坐标调整隐藏异常点:
ggsurvfit(temp) + stat_surv(fun = \(x) log(-log(x))) + labs(y = "log(-log(生存概率))") + coord_cartesian(ylim = c(-5, 0))
额外提示:手动过滤初始点(可选)
如果需要彻底移除time=0的观测,可先处理survfit2对象,再绘图:
# 过滤time>0的观测 temp_filtered <- temp keep_idx <- temp_filtered$time > 0 temp_filtered$time <- temp_filtered$time[keep_idx] temp_filtered$surv <- temp_filtered$surv[keep_idx] temp_filtered$n.risk <- temp_filtered$n.risk[keep_idx] temp_filtered$n.event <- temp_filtered$n.event[keep_idx] temp_filtered$n.censor <- temp_filtered$n.censor[keep_idx] # 绘图 ggsurvfit(temp_filtered) + geom_step() + scale_y_continuous(trans = "logminuslog")
内容的提问来源于stack exchange,提问作者Stefan Hansen
相关产品推荐
相关产品推荐

