2015-10-14 7 views
6

Gibt es eine einfache Möglichkeit, ein Schwimmer Grundstück in R zu generieren? Gleiche Daten wie in einer KM-Kurve, aber mit jedem einzelnen Überleben als Linie dargestellt. Beispiel:Schwimmer Survival Plot

Ich habe gesucht Stackoverflow, die R-Hilfe-Mailingliste, und konsultierte Dr. Google ohne offensichtliche Antwort, obwohl meine Suchtechnik suboptimal sein kann. Vielen Dank!

**** ADDENDED **** Entschuldigung dafür, dass ich nicht richtig eine Frage gestellt habe - das ist mein erstes Mal! Folgendes zu tun in der Lage zu spielen um, ich habe:

  OS DeathYN TreatmentGroup 
4 444 days  1    0 
5 553 days  1    0 
8 812 days  0    0 
1 844 days  0    0 
10 1071 days  0    0 
9 1147 days  0    0 
6 1349 days  0    0 
3 1375 days  0    0 
2 1384 days  0    1 
7 1687 days  0    0 

orderedData$GroupColor[orderedData$TreatmentGroup==0] <- "yellow" 
orderedData$GroupColor[orderedData$TreatmentGroup==1] <- "red" 
orderedData$YCoord <- barplot(as.numeric(orderedData$OS), horiz=TRUE, col=orderedData$GroupColor, xlim=c(0,max(orderedData$OS) + 50), xlab="Overall Survival") 
points(x=20+as.numeric(orderedData$OS), y=orderedData$YCoord,pch=62, col="green") 
legend(1000,2, c("Control", "Treatment", "still living"), col=c("yellow","red", "green"), lty=1, lwd=c(10,10,0),pch=62) 

Dies bringt mich nah genug für jetzt, aber Ästhetik sind nicht perfekt. Wenn es ein Paket oder eine bessere Lösung gibt, kann jemand vorschlagen, dass ich es gerne sehen würde!

Antwort

7

Sie haben nach einem "einfachen" Weg gefragt, um ein Schwimmer-Grundstück zu erstellen. Das ist wahrscheinlich ein bisschen komplizierter, als du dir erhofft hast, aber es ist ziemlich nah an dem, was du gepostet hast. Wenn Sie viele Schwimmer-Plots erstellen müssen, können Sie dies in etwas, das für Sie arbeitet, umwandeln und es dann in eine Funktion verwandeln.

zunächst einige gefälschte Daten erstellen:

library(ggplot2) 
library(reshape2) 
library(dplyr) 
library(grid) 

set.seed(33) 
dat = data.frame(Subject = 1:10, 
       Months = sample(4:20, 10, replace=TRUE), 
       Treated=sample(0:1, 10, replace=TRUE), 
       Stage = sample(1:4, 10, replace=TRUE), 
       Continued=sample(0:1, 10, replace=TRUE)) 

dat = dat %>% 
    group_by(Subject) %>% 
    mutate(Complete=sample(c(4:(max(Months)-1),NA), 1, 
         prob=c(rep(1, length(4:(max(Months)-1))),5), replace=TRUE), 
     Partial=sample(c(4:(max(Months)-1),NA), 1, 
         prob=c(rep(1, length(4:(max(Months)-1))),5), replace=TRUE), 
     Durable=sample(c(-0.5,NA), 1, replace=TRUE)) 

# Order Subjects by Months 
dat$Subject = factor(dat$Subject, levels=dat$Subject[order(dat$Months)]) 

# Melt part of data frame for adding points to bars 
dat.m = melt(dat %>% select(Subject, Months, Complete, Partial, Durable), 
      id.var=c("Subject","Months")) 

Jetzt für die Handlung:

ggplot(dat, aes(Subject, Months)) + 
    geom_bar(stat="identity", aes(fill=factor(Stage)), width=0.7) + 
    geom_point(data=dat.m, 
      aes(Subject, value, colour=variable, shape=variable), size=4) + 
    geom_segment(data=dat %>% filter(Continued==1), 
      aes(x=Subject, xend=Subject, y=Months + 0.1, yend=Months + 1), 
      pch=15, size=0.8, arrow=arrow(type="closed", length=unit(0.1,"in"))) + 
    coord_flip() + 
    scale_fill_manual(values=hcl(seq(15,375,length.out=5)[1:4],100,70)) + 
    scale_colour_manual(values=c(hcl(seq(15,375,length.out=3)[1:2],100,40),"black")) + 
    scale_y_continuous(limits=c(-1,20), breaks=0:20) + 
    labs(fill="Disease Stage", colour="", shape="", 
     x="Subject Recevied Study Drug") + 
    theme_bw() + 
    theme(panel.grid.minor=element_blank(), 
     panel.grid.major=element_blank(), 
     axis.text.y=element_blank(), 
     axis.ticks.y=element_blank()) 

enter image description here

+0

Das ist genial! Vielen Dank! –

+1

süß ......... –