R: Tibble vs ggplot2 (tworzenie wykresów)

Nov 27 2020

Próbuję postępować zgodnie z samouczkiem w R (https://rviews.rstudio.com/2017/09/25/survival-analysis-with-r/Komputer, którego używam do pracy nie ma portu USB ani łącza internetowego - ma tylko R z zainstalowanymi kilkoma bibliotekami. Mój komputer roboczy ma „survival, ranger, ggplot2 i dplyr”. Jednak nie ma "ggfortify". Próbuję wymyślić, jak wykreślić wykresy z samouczka bez „ggfortify”. Oto kod, którego używam poniżej:

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

Jednak nie mogę uruchomić tego:

#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

Albo to zadziała: #
Część 3: nie działa

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

Czy ktoś może mi pomóc to poprawić?

Dzięki (Poprzedni post: R: wykreślanie wykresów (ggplot vs autoplot) )

Odpowiedzi

1 jakub Nov 27 2020 at 21:20

Będziesz musiał wykonać jakąś pracę detektywa!

Mam dziś czas na część 2. A więc: Okazuje się, że informacja o warstwach jest zawarta w elemencie km_trt_fit$strata. To wygląda tak:

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

km_trt_fit$strata

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

To mówi ci, że jest 61 elementów trt=1i 53 elementy trt=2. Nie wiem, dlaczego nie sumują się one do 137 (liczba wierszy veteran), ale zakładam, że tak właśnie survfit()działa. Jest to również powód, dla którego otrzymujesz błąd, ponieważ wynikowe dane modelu mają inną liczbę wierszy niż oryginalna ramka danych, którą próbujesz uwzględnić za pomocą veteran$trt.

Moje rozwiązanie: Utwórz wektor strataz 61 i 53 elementów trt=1i trt=2odpowiednio:

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

Uwzględnij to w swoich danych wejściowych:

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)

Wynik jest bardzo zbliżony do tego, co ma samouczek.

Nie jestem zbyt zaznajomiony z ggfortify, ale jego zadaniem jest prawdopodobnie automagiczne wykonanie czegoś podobnego. W przypadku jego braku będziesz musiał zbadać struktury utworzone przez funkcje modelu i wyodrębnić dane ręcznie, tak jak zrobiłem powyżej.