ggsurvplot_combine()是否不支持p值计算?生存曲线绘制疑问
关于ggsurvplot_combine不显示p值的问题及解决方案
问题描述
我希望在一张Kaplan-Meier图中绘制单个组与整体人群的生存曲线,尝试用以下代码(Version 1)实现,但设置pval=TRUE后未显示p值,想确认ggsurvplot_combine()是否不支持p值计算?
library(tidyverse) library(survival) library(survminer) df <- data.frame(Time = c(1, 3, 5, 8, 2, 4), Censored = c(0, 1, 0, 1, 1, 0), Group = c('A', 'A', 'B', 'A', 'B', 'B')) fit1 <- survfit(Surv(Time, Censored) ~ 1, data = df) fit2 <- survfit(Surv(Time, Censored) ~ 1, data = subset(df, Group == 'B')) ggsurvplot_combine(list('0' = fit1, 'B' = fit2), pval = TRUE)
我当前的替代方案如下(Version 2),但更倾向使用Version 1,因为无需复制数据框:
library(tidyverse) library(survival) library(survminer) df <- data.frame(Time = c(1, 3, 5, 8, 2, 4), Censored = c(0, 1, 0, 1, 1, 0), Group = c('A', 'A', 'B', 'A', 'B', 'B')) df1 <- df %>% mutate(Strata = '0') df2 <- df %>% filter(Group == 'B') %>% mutate(Strata = 'B') df3 <- rbind(df1, df2) fit <- survfit(Surv(Time, Censored) ~ Strata, data = df3) ggsurvplot(fit, pval = TRUE)
问题原因
ggsurvplot_combine()的核心功能是合并多个独立拟合的survfit对象,它本身不支持自动计算生存曲线之间的显著性p值——因为这些独立的survfit没有基于同一个分层变量的设计,函数无法自动识别需要对比的组并执行log-rank等检验。
针对Version 1的改进方案
可以手动计算整体人群与目标组的生存差异p值,再将计算结果传入ggsurvplot_combine()的pval参数中,这样既不用复制数据框,也能显示p值:
library(tidyverse) library(survival) library(survminer) df <- data.frame(Time = c(1, 3, 5, 8, 2, 4), Censored = c(0, 1, 0, 1, 1, 0), Group = c('A', 'A', 'B', 'A', 'B', 'B')) # 拟合整体人群和目标组的生存曲线 fit1 <- survfit(Surv(Time, Censored) ~ 1, data = df) fit2 <- survfit(Surv(Time, Censored) ~ 1, data = subset(df, Group == 'B')) # 手动计算log-rank检验的p值 test_df <- df %>% mutate(compare_group = ifelse(Group == 'B', 'B', 'Overall')) surv_test <- survdiff(Surv(Time, Censored) ~ compare_group, data = test_df) p_val <- 1 - pchisq(surv_test$chisq, df = length(surv_test$n) - 1) # 自定义p值显示文本 p_val_label <- sprintf("Log-rank p = %.3f", p_val) # 合并曲线并传入手动计算的p值 ggsurvplot_combine(list('Overall' = fit1, 'B' = fit2), pval = p_val_label)
补充说明
- 使用
survdiff()执行的是log-rank检验,这是生存曲线组间差异检验的标准方法; - 可以根据需求调整p值的显示格式,比如修改
sprintf()中的小数位数; - 该方案保留了Version 1无需复制数据框的优势,同时满足显示p值的需求。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

