Как построить кривую поверх ggplotsurv Kaplan Meier - PullRequest
0 голосов
/ 14 июля 2020

Я построил график Каплана Мейера с помощью ggsurvplot на выжившем объекте и пытаюсь построить еще одну кривую сверху. Линия представляет собой вектор средней продолжительности жизни. Мой KM оценивается на основе IPD с 225 наблюдениями с максимальным временем выживания 7,2 года, а мое среднее время выживания оценивается на основе байесовского анализа с выборками, взятыми из задней функции выживаемости с 6-месячными интервалами. Проблема, по-видимому, в том, что дополнительная линия, которую я пытаюсь построить из среднего времени выживания, не той же длины, что и мой фрейм данных IPD, за исключением деления последнего времени выживания на количество наблюдений в моем IPD и повторной выборки через эти интервалы из апостериорное распределение. Мне интересно, есть ли что-нибудь вокруг этого?

Мои данные выглядят так,

## IPD data

   treatment      t event
2          1 5.5250     1
3          1 1.9493     1
4          1 4.9473     1
7          1 5.9466     0
11         1 1.5797     1
12         1 0.5038     1
.              .        .
.              .        . 
.              .        .

## mean survival times from the Bayesian analysis

1.0000000 0.9129731 0.8337045 0.7614860 0.6956758 0.6356917 .....

Код, который я пытаюсь,

f <- survfit(Surv(t, event)~1, data=treatment)
f1 <- ggsurvplot(f) 
f2 <- f1$plot + geom_line(aes(c(0:16), meansurv))

При этом я получаю следующую ошибку:

<error/rlang_error>
Aesthetics must be either length 1 or the same as the data (225): x and y

Дополнительный вопрос: я не уверен, как создать график только с одной легендой, следующее дает две, если я использую legend = "none", оба удалены.

meansurv1 <- c(1.0000000, 0.9129731, 0.8337045, 0.7614860, 0.6956758, 0.6356917, 0.50, 0.43, 0.37)
meansurv2 <- c(1.0000000, 0.9324888, 0.8671987, 0.8042297, 0.7436717, 0.6856045, 0.6300962, 0.5772029, 0.5269681)
x<- c(0:8)
temp <- data.frame(x, meansurv1, meansurv2)

temp<- temp %>% 
  gather(key, value, -c(x))


f1 <- survfit(Surv(t, event)~1, data=control)
f1 <- ggsurvplot(f1, legend="right") 
f1 <- f1$plot +  geom_line(data = temp, aes(x=x, y=value, group=key, color=key));f1

1 Ответ

1 голос
/ 21 июля 2020

проблема в использовании geom_line. Поскольку вы не указали аргумент data внутри geom_line, это NULL. В справке geom_line указано, что данные наследуются от данных графика, если data = NULL внутри geom_line.

Вы можете указать аргумент data внутри geom_line, чтобы избавиться от проблема.

Прикреплен воспроизводимый пример. Я взял числа, указанные в вашем вопросе, но скорректировал вектор meansurv так, чтобы в этом векторе было больше записей, чем количество строк фрейма данных treatment.

Сначала я воспроизвел ваш ошибка, а затем я показал, как это можно сделать правильно, используя аргумент data функции geom_line()

library(survival)
library(survminer)
#> Lade nötiges Paket: ggplot2
#> Lade nötiges Paket: ggpubr

# a preview of the data frame. 
treatment <- data.frame(
  treatment = c(1, 1, 1, 1, 1, 1), 
  t = c(5.525, 1.9493, 4.9473, 5.9466, 1.5797, 0.5038), 
  event = c(1, 1, 1, 0, 1, 1)
  )

# modified vector: 
meansurv <- c(1.0000000, 0.9129731, 0.8337045, 0.7614860, 0.6956758, 0.6356917, 0.50, 0.43, 0.37)

f <- survfit(Surv(t, event)~1, data=treatment)
f1 <- ggsurvplot(f); f1


# data is not used in geom_line ->> raises error: 
f2 <- f1$plot + geom_line(aes(seq.int(meansurv) - 1, meansurv)); f2
#> Error: Aesthetics must be either length 1 or the same as the data (7): x and y


# using argument data: 
f2 <- f1$plot + geom_line(data = data.frame(x = seq.int(meansurv) - 1, 
                                            y = meansurv), 
                          aes(x = x, y = y)); f2

Created on 2020-07-21 by the REPEX пакет (v0.3.0)

...