You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 20:15:57