Выживание по бинн-данным

Я собрал данные, которые я пытаюсь выполнить анализ выживаемости, например, данные ниже. n - количество единиц в каждой группе, время, комбинация индикаторов сбоев.

> df <- structure(list(group = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("", "A", "B"), class = "factor"), t = c(0L, 1L, 2L, 3L, 1L, 2L, 3L, 0L, 1L, 2L, 3L, 1L, 2L, 3L), failure = c(0L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 1L, 1L, 1L), n = c(40000L, 30000L, 20000L, 10000L, 5L, 4L, 3L, 20000L, 15000L, 14000L, 11000L, 10L, 6L, 4L)), .Names = c("group", "t", "failure", "n"), row.names = c(NA, 14L), class = "data.frame")
> df
   group t failure     n
1      A 0       0 40000
2      A 1       0 30000
3      A 2       0 20000
4      A 3       0 10000
5      A 1       1     5
6      A 2       1     4
7      A 3       1     3
8      B 0       0 20000
9      B 1       0 15000
10     B 2       0 14000
11     B 3       0 11000
12     B 1       1    10
13     B 2       1     6
14     B 3       1     4

Я знаю, что я могу rep df в столбце n, чтобы каждая строка была одной единицей: (ссылка Как создать объект выживания в R?)

> library(survival)
> df2 <- df[rep(rownames(df),df$n),]
> sfit <- survfit(Surv(t,failure)~group, data = df2)

Однако мои фактические данные имеют около 10 миллионов единиц. Есть ли способ сделать выживание с переменной count/frequency, чтобы избежать создания кадра данных в 10 миллионов строк?

Ответ 1

Вы хотите использовать параметр weights. Вы можете сравнить два подхода, чтобы подтвердить, что у вас одинаковый вывод.

С данными, которые вы повторили:

sfit <- survfit(Surv(t,failure)~group, data = df2)
summary(sfit)
Call: survfit(formula = Surv(t, failure) ~ group, data = df2)

                group=A 
 time n.risk n.event survival  std.err lower 95% CI upper 95% CI
    1  60012       5    1.000 3.73e-05        1.000            1
    2  30007       4    1.000 7.63e-05        1.000            1
    3  10003       3    0.999 1.89e-04        0.999            1

                group=B 
 time n.risk n.event survival  std.err lower 95% CI upper 95% CI
    1  40020      10    1.000 0.000079        1.000            1
    2  25010       6    1.000 0.000126        0.999            1
    3  11004       4    0.999 0.000221        0.999            1

Теперь, используя weights:

weights <- df$n
sfit2 <- survfit(Surv(t,failure)~group, data = df, weights = weights)
summary(sfit2)
Call: survfit(formula = Surv(t, failure) ~ group, data = df, weights = weights)

                group=A 
 time n.risk n.event survival  std.err lower 95% CI upper 95% CI
    1  60012       5    1.000 3.73e-05        1.000            1
    2  30007       4    1.000 7.63e-05        1.000            1
    3  10003       3    0.999 1.89e-04        0.999            1

                group=B 
 time n.risk n.event survival  std.err lower 95% CI upper 95% CI
    1  40020      10    1.000 0.000079        1.000            1
    2  25010       6    1.000 0.000126        0.999            1
    3  11004       4    0.999 0.000221        0.999            1