2 个生存函数,1 个左截断,1 个未截断。如何在 R 中创建在截断间隔内假设相同体验的生存函数?

2 survival functions, 1 left-truncated, 1 not truncated. How create survival function in R that assumes same experience over the truncated interval?

我有两个生存函数,一个没有被截断,所以我有所有时间段的经验。另一个在 t = 4 之前被左截断,因此它在 t > 4 之前没有经验。我可以使用生存包在 R 中的以下代码中将两者一起绘制。

library(tidyverse)
library(survival)
library(ggfortify)

# create two survival functions
set1 <- tibble(start0 = rep(0,10), end0 = 1:10, event0 = rep(1,10))
set2 <- tibble(start0 = rep(4,10), end0 = c(5, 5, 7, 9, rep(10, 6)), event0 = rep(1,10))
combined_set <- bind_rows(set1, set2)
survival_fn <- survfit(Surv(start0, end0, event0) ~ start0, data = combined_set)

# plot the survival function:
autoplot(survival_fn, conf.int = FALSE)

如果两个函数在截断期间都经历过相同的生存经历,我想展示它们在生存方面的差异——即直到 t = 4。我已经手动绘制了我正在尝试的近似图实现(步骤大小不按比例)。

这是一个简化的示例 - 在实践中,我有八组不同的数据,截断周期不同,每组大约有 2000 个数据点。

如果您查看 survival_fn 对象的结构(它不是一个函数而是一个列表),您会看到:

str(survival_fn)
List of 17
 $ n        : int [1:2] 10 10
 $ time     : num [1:14] 1 2 3 4 5 6 7 8 9 10 ...
 $ n.risk   : num [1:14] 10 9 8 7 6 5 4 3 2 1 ...
 $ n.event  : num [1:14] 1 1 1 1 1 1 1 1 1 1 ...
 $ n.censor : num [1:14] 0 0 0 0 0 0 0 0 0 0 ...
 $ surv     : num [1:14] 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0 ...
 $ std.err  : num [1:14] 0.105 0.158 0.207 0.258 0.316 ...
 $ cumhaz   : num [1:14] 0.1 0.211 0.336 0.479 0.646 ...
 $ std.chaz : num [1:14] 0.1 0.149 0.195 0.242 0.294 ...
 $ strata   : Named int [1:2] 10 4
  ..- attr(*, "names")= chr [1:2] "start0=0" "start0=4"
 $ type     : chr "counting"
 $ logse    : logi TRUE
 $ conf.int : num 0.95
 $ conf.type: chr "log"
 $ lower    : num [1:14] 0.732 0.587 0.467 0.362 0.269 ...
 $ upper    : num [1:14] 1 1 1 0.995 0.929 ...
 $ call     : language survfit(formula = Surv(start0, end0, event0) ~ start0, data = combined_set)
 - attr(*, "class")= chr "survfit"

因此,尽管仍然在 (t=0,S=1) 处自动启动生存函数,但实现类似目标的一种方法是将 [=] 中的所有 $surv 项相乘26=]-层由t=4时的surv值,然后重做绘图:

survival_fn[['surv']][11:14] <- survival_fn[['surv']][11:14]*survival_fn[['surv']][4]

我明白为什么这可能不是一个完全一致的答案,因为从 1 到 t=5 仍然有一条蓝线,它实际上并不是从 t=4 时第 1 层的生存值开始的。然而,这是使用“高级”抽象绘图范例的限制。可定制性受到绘图语法中内置的许多“有用”假设的抑制。在基本绘图中执行此操作并不困难,因为您可以在没有那么多限制的情况下“四处移动”。

如果您确实需要根据估计的生存比例和时间构建阶跃函数,您可能会查看此答案,然后构建一个增强数据集,其中 y at time=4 调整用于后面的层。您需要为主层添加时间=0 的值,为第二层添加第一层的时间=4 值,并执行如上所示的调整。看到这个问题和答案。