如何使用Survival包survfit处理区间删失数据按日历日估计生存概率
问题根因
你当前代码输出不符合需求的核心原因有两个:
- 时间基准没有统一为日历日,传入
Surv的time1、time2为入组后相对时长,输出自然对应入组后时间维度 - 未设置左截断(迟进入)参数,默认所有个体从研究第0天就进入风险集,和你随时间捕获动物入组的实际场景不符,同时全为3的
censor编码没有匹配你实际的左/右/区间删失混合数据类型
实现步骤
1. 时间基准校准
先将所有时间戳统一转换为以研究起始日为0的日历日维度:
- 每个个体新增
entry字段,值为该个体被捕获入组的日历日 - 按实际删失类型修正
censor字段编码(survival包type="interval"的规则如下):- 0:右删失,个体最后一次观察时存活,后续无记录
- 1:精确事件时间,个体死亡时间明确
- 2:左删失,个体首次被捕获时已死亡,死亡发生在研究起始日到捕获日之间
- 3:区间删失,个体死亡发生在两次观察的时间区间内
2. 模型参数修正
构造带左截断的区间删失生存对象,survfit会自动将入组前的个体排除在对应时间点的风险集外,输出的时间维度即为日历日:
# 示例数据新增entry列(替换为你实际的入组日历日即可) m1$entry <- c(2, 386, 0, 1, 384, 3, 61, 33, 385, 64) # 修正censor编码为实际值后拟合模型 km_fit <- survfit(Surv(time = entry, time2 = time2, event = censor, type = "interval") ~ region, data = m1)
3. 结果验证
绘制生存曲线的x轴即为日历日维度:
plot(km_fit, xlab = "日历日(研究起始日为0)", ylab = "生存概率")
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

