R: Tibble vs ggplot2 (tworzenie wykresów)
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
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=1
i 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 strata
z 61 i 53 elementów trt=1
i trt=2
odpowiednio:
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.