R语言survfit为何将每行视为独立个体?如何识别同一受试者多行数据?
解决heart数据集多行受试者的生存分析问题
问题根源
heart数据集是计数过程格式的时变协变量数据:103个受试者中,69人接受了移植,每个接受移植的患者会有两行记录(移植前观察期、移植后随访期),剩下34人仅一行未移植记录,所以总共有172行。直接用survfit(Surv(stop, event) ~ transplant)会把每行当作独立个体,导致样本量计数错误;而survfit的id参数仅用于计算稳健方差,不会合并同一受试者的多行数据。
解决方案1:转为单行个体水平数据
如果你的目标是比较「接受移植」和「从未接受移植」患者的整体生存(从入组到结局),先将数据聚合为每个受试者一行:
library(survival) library(dplyr) library(survminer) # 聚合为单行个体数据 heart_single <- heart %>% group_by(id) %>% summarize( time = max(stop), # 患者最终随访时间 event = max(event), # 最终结局(1=事件发生,0=删失) transplant = as.integer(any(transplant == 1)) # 是否接受过移植 ) %>% ungroup() # 拟合K-M模型并绘图 fit_single <- survfit(Surv(time, event) ~ transplant, data = heart_single) ggsurvplot(fit_single, risk.table = "nrisk_cumcensor", xlim = c(0, 5*365), break.x.by = 365, conf.int = TRUE, legend.labs = c("未移植", "接受移植"))
此时模型会正确识别n=103,分组为69例移植患者和34例未移植患者。
解决方案2:处理时变协变量的生存分析
如果需要分析「移植」这个时变因素对生存的动态影响(比如移植后生存 vs 持续未移植的生存),用coxph结合id参数拟合时变协变量模型,再预测生存曲线:
# 拟合时变协变量Cox模型(id参数识别同一受试者的多行数据) cox_fit <- coxph(Surv(start, stop, event) ~ transplant, data = heart, id = id) # 构造预测用的新数据,指定两种移植状态 newdata <- data.frame(transplant = c(0, 1)) # 基于Cox模型预测生存曲线 fit_timevar <- survfit(cox_fit, newdata = newdata) # 绘图 ggsurvplot(fit_timevar, risk.table = "nrisk_cumcensor", xlim = c(0, 5*365), break.x.by = 365, conf.int = TRUE, legend.labs = c("持续未移植", "接受移植"))
这里的id参数在coxph中会正确关联同一受试者的多个时间段,避免重复计数。
内容的提问来源于stack exchange,提问作者user1505631
相关产品推荐
相关产品推荐

