2 Stimmen

Wie konvertiere ich ein survfit-Ergebnis in eine gleichwertige Strata-Datentabelle?

Ich habe dieses Überlebensmodell (mit mehreren Kurven) erstellt.

obj <- with(subscriptions, Surv(time=life_time, event=status, type="right"))
fit <- survfit(obj~sales_month, data=subscriptions)

..und das resultierende fit-Objekt speichert die Ergebnisse in fit$surv. In meinem Fall ist jedoch die Länge der Überlebensschätzungen für die verschiedenen Kurven/Gruppen ungleich. Die Länge der verschiedenen Kurven findet sich in fit$strata.

Grundsätzlich sieht die Daten so aus:

fit$surv <- 1:10
1  2  3  4  5  6  7  8  9 10

fit$strata <- c(5,3,2)
names(fit$strata) <- LETTERS[1:3]
A B C 
5 3 2

Ich muss diese Daten in eine data.table mit gleicher Gruppenlänge extrahieren, wie zum Beispiel..

strata   surv
A        1
A        2
A        3
A        4
A        5
B        6
B        7
B        8
B        NA
B        NA
C        9
C        10
C        NA
C        NA
C        NA

Gibt es einen einfachen Weg, dies zu tun - oder habe ich vielleicht etwas Offensichtliches übersehen?

3voto

juba Punkte 45350

Hier ist ein weiterer, nicht sehr eleganter, Weg, es zu tun :

n <- max(strata)
miss <- n-strata
newsurv <- c(surv, rep(NA,sum(miss)))
newnames <- c(rep(names(strata),strata), rep(names(strata), miss))
data.table(strata=newnames, surv=newsurv, key="strata")

Das ergibt :

    strata surv
 1:      A    1
 2:      A    2
 3:      A    3
 4:      A    4
 5:      A    5
 6:      B    6
 7:      B    7
 8:      B    8
 9:      B   NA
10:      B   NA
11:      C    9
12:      C   10
13:      C   NA
14:      C   NA
15:      C   NA

1voto

Backlin Punkte 14312

Ich kenne keine vordefinierte Funktion, die das tut, wonach du suchst, aber du kannst leicht eine Lösung dafür zusammenbasteln. Es könnte zwar nicht als einfach gelten, aber es erledigt effizient die Aufgabe.

attach(fit)
n <- max(strata)
rbindlist(mapply(function(st, su){
    data.table(strata = rep(st, n),
               surv = c(su, rep(NA, n - length(su))))
}, names(strata), split(surv, rep(names(strata), strata)), SIMPLIFY=FALSE))

Im Grunde genommen teilt es die Werte von surv basierend auf strata in separate Vektoren auf, erstellt dann für jedes einen data.table mit einer festen Anzahl von n Zeilen und stapelt sie schließlich alle mit rbindlist zusammen.

    strata surv
 1:      A    1
 2:      A    2
 3:      A    3
 4:      A    4
 5:      A    5
 6:      B    6
 7:      B    7
 8:      B    8
 9:      B   NA
10:      B   NA
11:      C    9
12:      C   10
13:      C   NA
14:      C   NA
15:      C   NA

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X