R - применить сурфит к списку и построить график с соответствующими именами

У меня есть список именованных фреймов данных:

library(survival)
library(survminer)

surv.days<- runif(n = 50, min = 0, max = 500)
censor<- sample(c(0,1), 50, replace=TRUE)
survdata<- data.frame(surv.days, censor)
survlist<- list(survdata, survdata)
names(survlist)<- c("name1", "name2")
rm(survdata, censor, surv.days)

Я хочу запустить сурфит для каждого фрейма данных, а затем сгенерировать несколько графиков (я поместил здесь только один для простоты), каждый график с соответствующим заголовком. Я думаю, что Map - лучший способ сделать это, поэтому:

titles<- names(survlist)

Затем я определяю функцию, которую хочу использовать для анализа выживаемости и построения графиков:

survival.function<- function(survivaldata, datanames){
  sfit<- survfit(Surv(surv.days, censor)~1, data=survivaldata)
  ggsurvplot(sfit, conf.int=TRUE, risk.table=TRUE,
             surv.median.line = "v",
             title=datanames,
             risk.table.height=.25)
}

И попробуй применить:

Map(survival.function, survlist, titles)

Но идея не сработала:
«Ошибка в eval (fit $ call $ data): объект 'survivaldata' не найден»
Есть ли способ правильно назначить объекты функциям выживания? Спасибо!.


person Dario.gs    schedule 28.11.2017    source источник


Ответы (1)


В этом случае сообщение об ошибке вводит в заблуждение, по крайней мере, на мой взгляд. Похоже, что это указывает на ошибку при вызове survfit, хотя на самом деле это ошибка в ggsurvplot, как видно из вывода traceback(). Сначала я попытался изменить имя объекта, переданного в survival.function. Тогда никакой ошибки. Но тоже никакого сюжета. Так же добавлен вызов print внутри survival.function. Прилагаю первый из двух полученных результатов.

survival.function<- function(data, datanames){
  sfit<- survfit(Surv(surv.days, censor)~1, data=data)
  print( ggsurvplot(sfit, conf.int=TRUE, risk.table=TRUE,
             surv.median.line = "v",
             title=datanames,
             risk.table.height=.25) )
}

введите описание изображения здесь

Хотел бы я лучше объяснить, почему этот хакер работает. (Я только предполагаю причину на основании сообщения об ошибке и traceback()-результатов.) Я использую тот факт, что name "отсутствующего" объекта были "данными". Возможно, это семантическая ошибка в ggsurvplot, и вы окажете услугу сопровождающему пакета, чтобы отправить ему ссылку на этот полностью документированный пример. Интересно, можно ли было бы улучшить, если бы сопровождающий изменил код так, чтобы к имени члена списка не обращались из среды с помощью $data, а скорее [[data]].

person IRTFM    schedule 29.11.2017
comment
Это перестает работать, когда вы удаляете объект Surv.days из глобального окружения. (то, что я должен был сделать в исходном примере), поэтому я отредактировал исходное сообщение, добавив rm(survdata, censor, surv.days) - person Dario.gs; 30.11.2017
comment
Я вижу это как еще одно свидетельство того, что функция ggsurvplot не может должным образом извлекать и обрабатывать внутренние компоненты объекта Survfit. Следует допросить сопровождающего. - person IRTFM; 30.11.2017