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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:36:00