R语言下对齐左截断区间生存经验的生存函数构建方法
实现思路
你需要的是将左截断组的生存概率在截断时点前与参考组(无截断全时段组)的生存概率拼接,本质是条件生存概率调整:左截断组在截断时点$T_c$的生存概率等于参考组在$T_c$的生存概率,之后的生存概率基于左截断组本身的条件生存概率,即公式为 $S(t) = S_{ref}(T_c) * S_{trunc}(t | t > T_c) (t >= T_c)$。
代码实现(适配多组截断场景)
以下代码直接支持你提到的8组不同截断时点的场景,不需要逐个手动调整:
library(tidyverse) library(survival) library(broom) # 第一步:拟合全时段参考组的生存曲线,提取全时段时间-生存概率对应表 ref_set <- tibble(start0 = rep(0,10), end0 = 1:10, event0 = rep(1,10)) ref_surv <- survfit(Surv(start0, end0, event0) ~ 1, data = ref_set) ref_surv_df <- tidy(ref_surv) %>% select(time, ref_surv = estimate) # 补充t=0时生存概率为1的初始点 ref_surv_df <- bind_rows(tibble(time = 0, ref_surv = 1), ref_surv_df) # 第二步:拟合所有左截断组的条件生存曲线 # 示例用单组截断数据,实际场景将8组左截断数据合并,新增trunc_time字段标注每组的截断时点即可 set2 <- tibble(start0 = rep(4,10), end0 = c(5, 5, 7, 9, rep(10, 6)), event0 = rep(1,10)) trunc_sets <- set2 %>% mutate(trunc_time = 4) # 按截断时点分组拟合条件生存曲线,输出结果为t>=截断点的条件生存概率 trunc_surv <- survfit(Surv(start0, end0, event0) ~ trunc_time, data = trunc_sets) trunc_surv_df <- tidy(trunc_surv) %>% separate(strata, into = c(NA, "trunc_time"), sep = "=", convert = TRUE) # 第三步:拼接调整截断组的生存曲线 adjusted_trunc_surv <- trunc_surv_df %>% # 关联对应截断时点的参考组生存概率 left_join(ref_surv_df %>% rename(trunc_time = time, trunc_ref_surv = ref_surv), by = "trunc_time") %>% # 调整截断后生存概率 mutate(adjusted_estimate = trunc_ref_surv * estimate) %>% # 补充截断前区间的参考组生存点,保证曲线连续 group_by(trunc_time) %>% group_modify(~{ pre_trunc_points <- ref_surv_df %>% filter(time < .y$trunc_time) %>% mutate(adjusted_estimate = ref_surv) bind_rows(pre_trunc_points, .x) %>% arrange(time) }) %>% ungroup() # 第四步:合并参考组和调整后截断组数据绘图 full_plot_df <- bind_rows( ref_surv_df %>% mutate(group = "无截断参考组", adjusted_estimate = ref_surv), adjusted_trunc_surv %>% mutate(group = paste0("截断组T=", trunc_time)) ) ggplot(full_plot_df, aes(x = time, y = adjusted_estimate, color = group)) + geom_step(linewidth = 1) + labs(x = "时间t", y = "生存概率", color = "分组") + theme_bw()
大样本多组场景适配说明
- 8组不同截断时点的数据集仅需在合并时给每个组新增
trunc_time字段标注对应截断时点即可,后续逻辑无需修改 - 若需要绘制置信区间,可用完全相同的逻辑调整截断组的置信上下限:将截断组原生的置信上下限乘以参考组在截断点的生存概率即可
- 每组2000观测的样本量下,上述代码运行效率足够,无需额外优化
内容的提问来源于stack exchange,提问作者AndrewT
相关产品推荐
相关产品推荐

