Настройка типа линии в откорректированных кривых выживаемости - PullRequest
1 голос
/ 13 июня 2019

Я пытаюсь построить скорректированную кривую выживания, но пытаюсь изменить типы линий по группам.Я могу настроить другие аспекты графика, используя типичный язык ggplot2, но я столкнулся с проблемой изменения типа линии.

Пример:

library(survival)
library(survminer)

fit2 <- coxph( Surv(stop, event) ~ size + strata(rx), data = bladder )

ggadjustedcurves(fit2,
                 variable = "rx", 
                 data = bladder,
                 method = "average",
                 palette = c("#E69F00", "#56B4E9"),
                 size = 1.3,
                 legend = "right",
                 legend.title = expression(bold("Legend title")),
                 xlab = "Time",
                 font.legend = 12) +
  theme(legend.text.align = 0.5)

Я пытался добавить:

geom_line( aes( linetype = c(1, 2) )
add.params = list(linetype = c(1, 2))

и просто

linetype = c(1, 2)

, но, похоже, ничего не работает.

1 Ответ

0 голосов
/ 16 июня 2019

Сначала вам нужно взглянуть на код.

ggadjustedcurves

Похоже, что ggadjustedcurves передает все свои аргументы вспомогательным функциям, которые зависят от аргумента «method», в данном случае «среднего», так что теперь посмотрим на эту (скрытую) функцию:

 getAnywhere( ggadjustedcurves.average )

И обратите внимание, что нет положения, позволяющего принимать дополнительные аргументы помимо тех немногих, которые определены в «главной функции», то есть не использовать механизм многоточия R или спецификации других возможных аргументов aes, кроме размера. (Он также не использует geom_line.) Поэтому вам нужно изменить и ведущую функцию и вспомогательную функцию, чтобы она принимала аргумент типа линии. Здесь я покажу, как изменить вспомогательную функцию (хотя это необходимо сделать и для функции ggadjustedcurves, а также, возможно, для остальных вспомогательных функций, если вы хотите, чтобы это было полностью общим):

assignInNamespace('ggadjustedcurves.average',  

  function (data, fit, variable, size = 1, ..., linetype=linetype) 
    {
    time <- surv <- NULL
    lev <- sort(unique(data[, variable]))
    pred <- survexp(as.formula(paste("~", variable)), data = data, 
                    ratetable = fit)
    curve <- data.frame(time = rep(c(0, pred$time), length(lev)), 
                        variable = factor(rep(lev, each = 1 + length(pred$time))), 
                        surv = c(rbind(1, pred$surv)))
    ggplot(curve, aes(x = time, y = surv, color = variable)) + 
        geom_step(size = size, ..., linetype=linetype)  # not geom_line
    }, 
   pos="package:survminer")

enter image description here

Если вы выполните SO-поиск по "geom_segment linetype", вы обнаружите, что geom_segment (то, что использует geon_step) не сконструирован таким образом, чтобы было легко дать ему короткие векторы для изменения "смежных" длин. результатов пошаговой функции. См. Ошибка ggplot с использованием типа линии и эстетики группы . Это означает, что вам нужно будет использовать for-loop или lapply для построения отдельных «кривых шага», если вам нужны разные типы линий.

...