R: Tibble vs ggplot2 (plotagem de gráficos)
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
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=1
e 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 strata
com 61 e 53 elementos de trt=1
e trt=2
respectivamente:
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.