график proROC как объект?

Я хотел бы построить ОБЪЕКТ графика rPOC, который я могу передать функции и построить позже. В приведенном ниже примере (взято из здесь) я, безусловно, могу построить кривую ROC. Но я хотел бы создать ОБЪЕКТ сюжета (скажем, определив g ‹-, а затем построив его с помощью plot(g)). Кажется, что график функций ciobj, ci ниже добавит к исходному графику, но я не могу сделать ОБЪЕКТ, собирая эти слои вместе. Я попробовал аргумент «добавить» и создал новые объекты графика с возвращаемыми значениями этих функций графика.

library(pROC)
data(aSAH)
rocobj <- plot.roc(aSAH$outcome, aSAH$s100b,  main="Confidence intervals", percent=TRUE,  ci=TRUE,  print.auc=TRUE)
ciobj <- ci.se(rocobj, specificities=seq(0, 100, 5))
plot(ciobj, type="shape", col="#1c61b6AA") 
plot(ci(rocobj, of="thresholds", thresholds="best"))

person jpmorris    schedule 20.07.2015    source источник
comment
Вы действительно не можете. Эти функции используют базовую графику, которая работает путем рисования непосредственно на графическом устройстве. Объект не создается, как при работе с графикой решетки или ggplot. Как вы думаете, зачем вам нужен объект? Что вы планируете с ним делать?   -  person MrFlick    schedule 20.07.2015
comment
чтобы мой код был как можно более СУХИМ. У меня есть потребность в построении различных кривых ROC (среди прочего) для разных документов, которые могут сильно измениться. Я просто создавал общие функции построения графиков, которые я могу легко использовать при необходимости, поэтому мне не нужно много раз повторять аналогичный код в одном файле и избегать идентичного кода в нескольких документах (документ knitr, презентация «ReporteRs» и т. д.)   -  person jpmorris    schedule 20.07.2015
comment
Затем просто оберните свои команды в функцию, которую вы можете вызывать, когда вам нужно построить данные. Вместо того, чтобы сохранять объекты графика, вы можете хранить функции построения графика.   -  person MrFlick    schedule 20.07.2015
comment
Недавно был представлен пакет Пола Мюррелла (автора grid pkg), который может делать что-то подобное. IIRC, имя pkg — gridSVG, и он пытается создать файл SVG из вызова базовой графики. И затем (я думаю) вы можете импортировать этот файл для дальнейших манипуляций.   -  person IRTFM    schedule 20.07.2015
comment
MrFlick: Спасибо. Я предполагаю, что проблема в том, что пакет ReporteRs, который добавляет графики (в моем случае addImage), не улавливает «слои», которые я добавляю к графику (последние два графика выше). Это может быть что-то, что я делаю неправильно, или сам пакет, но, несмотря на то, что в rstudio он отлично отображается, я теряю эти слои. Но, возможно, мне просто нужно поковыряться в этом пакете BondedDust: спасибо, я посмотрю.   -  person jpmorris    schedule 20.07.2015
comment
@BondedDust, хотя и относится к gridSVG (тот же автор), пакет, на который вы ссылаетесь, вероятно, gridGraphics (ссылка в формате pdf), и не работает с SVG напрямую, а скорее пытается воспроизвести текущую графическую сцену как объект сетки.   -  person baptiste    schedule 20.07.2015


Ответы (1)


Как упомянул MrFlick, вы можете передавать функции вместо объекта. В качестве альтернативы вы можете передавать необработанные вызовы функций и оценивать их внутри своей функции. Например:

library(pROC)
data(aSAH)


plot1 <- quote(plot(rocobj, main="Confidence intervals", print.auc=TRUE))
plot2 <- quote(plot(ci.se(rocobj, specificities=seq(0, 100, 5)), type="shape", col="#1c61b6AA"))
plot3 <- quote(plot(ci(rocobj, of="thresholds", thresholds="best")))

doplots <- function(rocobj, calls) {
  for (call in calls) {
    eval(call)
  }
  invisible(rocobj)
}

roc1 <- roc(aSAH$outcome, aSAH$s100b, percent = TRUE)
doplots(roc1, list(plot1, plot2, plot3))

roc2 <- roc(aSAH$outcome, aSAH$wfns, percent = TRUE)
doplots(roc2, list(plot1, plot3))

Нет предела тому, что вы можете сделать, кроме вашего терпения к правилам оценки R.

person Calimo    schedule 20.07.2015
comment
Калимо спасибо за ответ. Проблема в том, что мне нужна функция, которая будет возвращать 2 вещи: объект графика и таблицу (потому что для настройки plot1,2,3 выше есть некоторое моделирование, которое возвращает дополнительный вывод, который я хочу вернуть из функции.) Это можно изменить ваш код, поэтому у меня есть функция, которую я могу использовать для возврата 1) функции для перехода к функции ReporteRs (addPlot(... FUN =...) и 2) таблицы с данными для передачи добавитьFlexTable()? Теперь я знаю, что не могу передать сюжетный объект, но, может быть, список? Но я не уверен, как получить функцию в списке или возможно ли это вообще. - person jpmorris; 20.07.2015
comment
Если ваша функция возвращает несколько вещей, они должны быть заключены в список. Этот список может содержать что угодно: вызовы, объекты roc, таблицы и т. д., и вы можете запрограммировать принимающую функцию так, чтобы она принимала что угодно. Но это выходит за рамки этого самого вопроса о передаче объектов сюжета - мое решение этого вопроса вызывает. - person Calimo; 21.07.2015
comment
Хорошо, я узнал, как это сделать, спасибо за вашу помощь. Для всех остальных: мне не нужно было вкладывать функцию или что-то в этом роде. Я просто использовал три приведенные выше функции построения графика (без «кавычек») в функции, а затем передал ей «объект» roc из другой функции, которая выполняла анализ. Я использовал эту функцию графика для генерации графика и сгенерировал roc из другой функции, в которую я передал любую другую информацию в виде списка. - person jpmorris; 21.07.2015