R: Tibble vs ggplot2 (tracciare grafici)

Nov 27 2020

Sto cercando di seguire un tutorial in R (https://rviews.rstudio.com/2017/09/25/survival-analysis-with-r/Il computer che utilizzo per lavoro non dispone di una porta USB o di una connessione Internet - ha solo R con alcune librerie installate. Il mio computer di lavoro ha "survival, ranger, ggplot2 e dplyr". Tuttavia, non ha "ggfortify". Sto cercando di capire come tracciare i grafici dal tutorial senza 'ggfortify'. Ecco il codice che sto usando di seguito:

  #load libraries
    library(survival)
    library(ranger)
    library(ggplot2)
    library(dplyr)
    
#load data
data(veteran)
head(veteran)

#Part 1 : works
# Kaplan Meier Survival Curve
km <- with(veteran, Surv(time, status))
km_fit <- survfit(Surv(time, status) ~ 1, data=veteran)

#plot(km_fit, xlab="Days", main = 'Kaplan Meyer Plot') #base graphics is always ready

tibble(time = km_fit$time, surv = km_fit$surv, 
       min = km_fit$lower, max = km_fit$upper) %>% 
  ggplot(aes(x = time)) +
  geom_line(aes(y = surv)) +
  geom_ribbon(aes(ymin = min, ymax = max), alpha = 0.3)

Tuttavia, non riesco a farlo funzionare:

#Part 2: does not work


km_trt_fit <- survfit(Surv(time, status) ~ trt, data=veteran)



tibble(time = km_trt_fit$time, surv = km_trt_fit$surv, 
       min = km_trt_fit$lower, max = km_trt_fit$upper) %>% 
    ggplot(aes(x = time, group = factor(veteran$trt), colour = factor(veteran$trt), fill = factor(veteran$trt))) +
    geom_line(aes(y = surv)) +
    geom_ribbon(aes(ymin = min, ymax = max), alpha = 0.3)


Error: Aesthetics must be either length 1 or the same as the data (114): group, colour and fill

O questo per funzionare:
#Parte 3: non funziona

vet <- mutate(veteran, AG = ifelse((age < 60), "LT60", "OV60"),
              AG = factor(AG),
              trt = factor(trt,labels=c("standard","test")),
              prior = factor(prior,labels=c("N0","Yes")))

aa_fit <-aareg(Surv(time, status) ~ trt + celltype +
                 karno + diagtime + age + prior , 
                 data = vet)

tibble(time = aa_fit$time, surv = aa_fit$surv, min = aa_fit$lower, max = aa_fit$upper) %>% 
  ggplot(aes(x = time)) +
  geom_line(aes(y = surv)) +
  geom_ribbon(aes(ymin = min, ymax = max), alpha = 0.3)

Error: geom_line requires the following missing aesthetics: y

Qualcuno può aiutarmi a correggerli?

Grazie (Messaggio precedente: R: tracciare grafici (ggplot vs autoplot) )

Risposte

1 jakub Nov 27 2020 at 21:20

Dovrai fare un po 'di lavoro da detective!

Ho tempo per la parte # 2 oggi. Quindi: si scopre che le informazioni sugli strati sono contenute nell'elemento km_trt_fit$strata. Assomiglia a questo:

km_trt_fit <- survfit(Surv(time, status) ~ trt, data=veteran)

km_trt_fit$strata

#> trt=1 trt=2 
#>    61    53

Questo ti sta dicendo che ci sono 61 elementi di trt=1e 53 elementi di trt=2. Non so perché questi non si sommano a 137 (il numero di righe in veteran) ma presumo che sia proprio come survfit()funziona. È anche il motivo per cui ricevi l'errore, perché i dati del modello risultante hanno un numero di righe diverso rispetto al frame di dati originale, che stai tentando di includere utilizzando veteran$trt.

La mia soluzione: crea un vettore stratacon 61 e 53 elementi di trt=1e trt=2rispettivamente:

strata = km_trt_fit$strata
strata = rep(names(strata), times = strata)

Includilo nei tuoi dati di input:

tibble(time = km_trt_fit$time, surv = km_trt_fit$surv,
       min  = km_trt_fit$lower, max = km_trt_fit$upper,
       trt  = factor(strata)) %>%
  ggplot(aes(x = time, colour = trt, fill = trt)) +
  geom_line(aes(y = surv)) +
  geom_ribbon(aes(ymin = min, ymax = max), alpha = 0.3)

Il risultato è abbastanza vicino a quello che ha il tutorial.

Non ho molta familiarità con ggfortify ma il suo compito è probabilmente quello di fare qualcosa di simile per te automaticamente. In sua assenza, dovrai indagare sulle strutture prodotte dalle funzioni del modello ed estrarre i dati manualmente come ho fatto sopra.