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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 16:40:33