R: Tibble vs ggplot2 (построение графиков)
Я пытаюсь следовать руководству по R (https://rviews.rstudio.com/2017/09/25/survival-analysis-with-r/Компьютер, который я использую для работы, не имеет порта USB или подключения к Интернету - на нем есть только R с несколькими установленными библиотеками. На моем рабочем компьютере есть «выживание, рейнджер, ggplot2 и dplyr». Однако в нем нет "ggfortify". Я пытаюсь понять, как построить графики из учебника без ggfortify. Вот код, который я использую ниже:
#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)
Однако я не могу заставить это работать:
#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
Или это работает: #
Часть 3: не работает
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
Может кто-нибудь помочь мне исправить это?
Спасибо (Предыдущий пост: R: построение графиков (ggplot vs autoplot) )
Ответы
Тебе придется поработать детективом!
У меня сегодня есть время для второй части. Итак: Получается, что информация о стратах содержится в элементе km_trt_fit$strata. Выглядит это так:
km_trt_fit <- survfit(Surv(time, status) ~ trt, data=veteran)
km_trt_fit$strata
#> trt=1 trt=2
#> 61 53
Это говорит вам о том, что существует 61 элемент trt=1и 53 элемента trt=2. Я не знаю, почему они не составляют в сумме 137 (количество строк veteran), но я предполагаю, что так survfit()работает. Это также причина, по которой вы получаете ошибку, потому что результирующие данные модели имеют другое количество строк, чем исходный фрейм данных, который вы пытаетесь включить с помощью veteran$trt.
Мое решение: Создать вектор strataс 61 и 53 элементов trt=1и , trt=2соответственно:
strata = km_trt_fit$strata
strata = rep(names(strata), times = strata)
Включите это в свои входные данные:
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)
Результат довольно близок к тому, что было в учебнике.
Я не слишком хорошо знаком с ggfortify, но его работа, вероятно, заключается в том, чтобы автоматически делать что-то подобное для вас. В его отсутствие вам придется исследовать структуры, создаваемые функциями модели, и извлекать данные вручную, как я сделал выше.