使用tidycmprsk和ggsurvfit绘制ggcuminc图时add_pvalue()报错
解决ggsurvfit为CIF图特定结局添加p值时的报错问题
问题现象
使用tidycmprsk生成累积发生率函数(CIF)对象后,调用ggsurvfit::ggcuminc()绘图,为部分结局添加add_pvalue()时触发报错:
add_pvalue()works with objects created withsurvfit2()ortidycmprsk::cuminc().add_pvalue()has been ignored.
复现代码如下:
library(ggsurvfit) library(tidycmprsk) library(tidyverse) df <- tibble( time = rexp(100), status = factor(sample(c("censor", "event", "death"), 100, replace = TRUE), levels=c("censor", "event", "death")), group = sample(c("A", "B"), 100, replace = TRUE) ) cif <- tidycmprsk::cuminc(Surv(time, status) ~ group, data = df) # 此代码会报错 cif %>% ggcuminc(outcome = "event") + add_pvalue() + add_risktable()
指定outcome = "death"时p值可正常显示,但outcome = "event"无论如何调整status因子水平顺序都报错。
问题原因
add_pvalue()处理cuminc对象时,默认仅读取第一个非删失结局的Gray检验结果;当指定的outcome不是第一个非删失结局时,函数无法匹配到对应结局的检验p值,因此触发忽略提示。
另外,tidycmprsk::glance(cuminc)返回的是全局Gray检验p值(针对所有竞争风险的整体比较),而非单个结局的检验结果,这也是函数无法自动提取特定结局p值的核心原因。
解决方案
方案1:使用全局Gray检验p值
如果只需展示组间所有竞争风险的整体差异p值,可直接提取glance(cif)的全局p值传入add_pvalue():
# 提取全局Gray检验p值 global_pval <- round(glance(cif)$p.value, 3) cif %>% ggcuminc(outcome = "event") + add_pvalue(pvalue = paste("Gray's Global Test p =", global_pval)) + add_risktable()
方案2:手动计算单个结局的竞争风险回归p值
若需要针对特定结局(如event)的组间差异p值,可使用cmprsk::crr()函数计算竞争风险模型的p值,再传入add_pvalue():
library(cmprsk) # 将status转换为crr要求的格式:0=删失,1=目标结局,2=其他竞争风险 df <- df %>% mutate(status_num = case_match( status, "censor" ~ 0, "event" ~ 1, "death" ~ 2 )) # 针对event结局构建竞争风险模型 crr_fit <- crr( ftime = df$time, fstatus = df$status_num, cov1 = model.matrix(~ group, data = df)[, -1] # 提取分组变量的矩阵 ) # 提取event结局的p值 event_pval <- round(coef(summary(crr_fit))[1, "Pr(>|z|)"], 3) # 绘图并传入手动计算的p值 cif %>% ggcuminc(outcome = "event") + add_pvalue(pvalue = paste("Event Group Comparison p =", event_pval)) + add_risktable()
内容的提问来源于stack exchange,提问作者Frederik M
相关产品推荐
相关产品推荐

