2016-06-08 17 views
11

Ho dati estratti in cui sto tentando di eseguire un'analisi di sopravvivenza, dati di esempio di seguito. n è un conteggio di unità per ciascun gruppo, tempo, combinazione di indicatori di guasti.Sopravvivenza sui dati in rilievo

> 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 

So che posso rep df dalla colonna n quindi ogni riga è un'unità: (Rif. How do I create a survival object in R?)

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

Tuttavia, il mio dati effettivi ha circa 10 milioni di unità. C'è un modo per sopravvivere con una variabile di conteggio/frequenza per evitare di creare un frame di dati di 10 milioni di righe?

risposta

10

Vorrete utilizzare il parametro weights. È possibile confrontare i due approcci per confermare di avere lo stesso risultato.

Con i dati che si ripeteva:

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 

Ora utilizzando 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 
+2

buona risposta a una buona domanda, ma ci dovrebbe essere un avvertimento che non tutte le funzioni di regressione utilizzano i "pesi "parametro allo stesso modo. Questi sono pesi "replicati". –

+1

Sono d'accordo con 42-, non ho trovato la descrizione dei pesi (sotto survfit.formula) utile o: "I pesi devono essere non negativi ed è fortemente raccomandato che siano strettamente positivi, poiché i pesi zero sono ambigui, rispetto all'uso dell'argomento sottoinsieme. " – bigjim