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

使用R的survival包创建Survival对象的问题求助

解决计数汇总格式数据的Kaplan-Meier分析问题

问题根源

你遇到的警告是因为Surv()函数要求状态变量是个体水平的0/1标记(0=删失,1=事件),但你的数据是分组计数格式(每行对应一组样本,记录该组的事件数、删失数和随访时间),直接传入Rec列(存在大于1的数值)会被判定为无效值,触发警告。

下面提供两种高效解决方案,优先推荐第一种(无需拆分个体数据):


方案1:直接用计数格式拟合KM曲线(高效推荐)

survival包的survfit()支持直接处理计数汇总数据,无需拆分成个体行,适合大样本场景:

步骤1:取消数据分组

你的数据是grouped_df格式,先取消分组避免后续操作异常:

library(dplyr)
FUP_ungrouped <- ungroup(FUP)

步骤2:拟合KM模型

使用Surv(start, end, events)的格式定义生存对象,结合weights参数指定每组样本量:

library(survival)

# 公式说明:
# Surv(0, fuptime, Rec):每组随访起始时间为0(手术当日),结束时间为fuptime,发生Rec个复发事件
# ~ operation3:按手术分组拟合(如果不需要分组,改成~1即可)
# weights = n:指定每组的总样本量
km_fit <- survfit(Surv(0, fuptime, Rec) ~ operation3, 
                  data = FUP_ungrouped, 
                  weights = n)

步骤3:用survminer绘图

直接将拟合结果传入ggsurvplot()即可:

library(survminer)

ggsurvplot(km_fit,
           xlab = "术后随访时间",
           ylab = "无复发生存概率",
           surv.median.line = "hv",  # 显示中位生存时间的横竖线
           risk.table = TRUE,        # 显示风险人数表
           legend.title = "手术方式",
           palette = "jco")          # 使用JCO期刊配色

方案2:转换为个体水平数据(适合理解逻辑)

如果想还原成标准的个体数据格式(每行对应一个患者),可以用以下代码拆分:

# 拆分计数数据为个体行
individual_data <- FUP_ungrouped %>%
  rowwise() %>%
  summarise(
    time = rep(fuptime, n),  # 重复随访时间n次
    status = c(rep(1, Rec), rep(0, nonRec)),  # 前Rec个标记为复发(1),剩余为未复发(0)
    operation3 = rep(operation3, n)
  ) %>%
  ungroup()

# 构造Surv对象并拟合KM曲线
so <- Surv(individual_data$time, individual_data$status)
km_fit_individual <- survfit(so ~ operation3, data = individual_data)

# 绘图(和方案1语法一致)
ggsurvplot(km_fit_individual, ...)  # 省略参数同方案1

内容的提问来源于stack exchange,提问作者th4007

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 10:07:52