R: Tibble vs ggplot2 (tracé de graphiques)

Nov 27 2020

J'essaye de suivre un tutoriel en R (https://rviews.rstudio.com/2017/09/25/survival-analysis-with-r/L'ordinateur que j'utilise pour mon travail n'a pas de port USB ou de connexion Internet - il n'a que R avec quelques bibliothèques installées. Mon ordinateur de travail a "survival, ranger, ggplot2 et dplyr". Cependant, il n'a pas "ggfortify". J'essaie de comprendre comment tracer les graphiques du didacticiel sans «ggfortify». Voici le code que j'utilise ci-dessous:

  #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)

Cependant, je ne peux pas faire fonctionner cela:

#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

Ou ceci pour fonctionner:
#Partie 3: ne fonctionne pas

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

Quelqu'un peut-il m'aider à corriger ces problèmes?

Merci ( Article précédent: R: tracer des graphiques (ggplot vs autoplot) )

Réponses

1 jakub Nov 27 2020 at 21:20

Vous allez devoir faire un travail de détective!

J'ai le temps pour la partie 2 aujourd'hui. Donc: Il s'avère que les informations sur les strates sont contenues dans l'élément km_trt_fit$strata. Cela ressemble à ceci:

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

km_trt_fit$strata

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

Cela vous indique qu'il existe 61 éléments de trt=1et 53 éléments de trt=2. Je ne sais pas pourquoi ceux-ci ne totalisent pas 137 (le nombre de lignes veteran) mais je suppose que c'est comme ça que ça survfit()marche. C'est également la raison pour laquelle vous obtenez l'erreur, car les données de modèle résultantes ont un nombre de lignes différent de celui du bloc de données d'origine, que vous essayez d'inclure en utilisant veteran$trt.

Ma solution: créer un vecteur strataavec 61 et 53 éléments de trt=1et trt=2respectivement:

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

Incluez cela dans vos données d'entrée:

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)

Le résultat est assez proche de ce que propose le didacticiel.

Je ne suis pas trop familier avec ggfortify mais son travail est probablement de faire quelque chose de similaire pour vous automatiquement. En son absence, vous devrez étudier les structures produites par les fonctions du modèle et extraire les données manuellement comme je l'ai fait ci-dessus.