R: Tibble vs ggplot2 (plotagem de gráficos)

Nov 27 2020

Estou tentando seguir um tutorial em R (https://rviews.rstudio.com/2017/09/25/survival-analysis-with-r/) .O computador que utilizo para o trabalho não tem porta USB ou ligação à Internet - tem apenas R com algumas bibliotecas instaladas. Meu computador de trabalho tem "survival, ranger, ggplot2 e dplyr". Porém, não possui "ggfortify". Estou tentando descobrir como plotar os gráficos do tutorial sem 'ggfortify'. Aqui está o código que estou usando abaixo:

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

No entanto, não consigo fazer isso funcionar:

#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 isso para funcionar:
#Parte 3: não funciona

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

Alguém pode me ajudar a corrigir isso?

Obrigado (Postagem anterior: R: plotagem de gráficos (ggplot vs autoplot) )

Respostas

1 jakub Nov 27 2020 at 21:20

Você vai ter que fazer algum trabalho de detetive!

Tenho tempo para a parte 2 hoje. Portanto: Acontece que as informações sobre os estratos estão contidas no elemento km_trt_fit$strata. Se parece com isso:

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

km_trt_fit$strata

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

Isso indica que existem 61 elementos de trt=1e 53 elementos de trt=2. Não sei por que eles não somam 137 (o número de linhas veteran), mas presumo que seja assim que survfit()funciona. É também o motivo pelo qual você está recebendo o erro, porque os dados do modelo resultantes têm um número de linhas diferente do quadro de dados original, que você está tentando incluir usando veteran$trt.

Minha solução: Criar um vetor stratacom 61 e 53 elementos de trt=1e trt=2respectivamente:

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

Inclua isso em seus dados de entrada:

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)

O resultado é muito próximo ao que o tutorial tem.

Não estou muito familiarizado com o ggfortify, mas sua função provavelmente é fazer algo semelhante para você de forma automática. Na sua ausência, você terá que investigar as estruturas produzidas pelas funções do modelo e extrair os dados manualmente como fiz acima.