使用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
相关产品推荐
相关产品推荐

