Как построить кривую ROC в R только с известной информацией SN/PPV/Cutoff

Учитывая такие данные:

#Cutpoint         SN   (1-PPV)
5       0.56    0.01
7       0.78    0.19
9       0.91    0.58

Как я могу построить кривую ROC с помощью R, которая дает такой же результат, как прикрепленный image?

Я знаю пакет ROCR, но он не требует такого ввода.


person neversaint    schedule 16.02.2012    source источник


Ответы (1)


Если вы просто хотите создать график (без этого глупого интерполяционного сплайна между точками), просто нанесите данные, которые вы даете, стандартным способом, добавив точку в (0,0) и добавив ее в (1,1), чтобы дать конечные точки кривой.

## your data with different labels
dat <- data.frame(cutpoint = c(5, 7, 9),
                  TPR = c(0.56, 0.78, 0.91),
                  FPR = c(0.01, 0.19, 0.58))

## plot version 1    
op <- par(xaxs = "i", yaxs = "i")
plot(TPR ~ FPR, data = dat, xlim = c(0,1), ylim = c(0,1), type = "n")
with(dat, lines(c(0, FPR, 1), c(0, TPR, 1), type = "o", pch = 25, bg = "black"))
text(TPR ~ FPR, data = dat, pos = 3, labels = dat$cutpoint)
abline(0, 1)
par(op)

Объяснение кода: первый вызов plot() устанавливает область построения, вообще не рисуя. Обратите внимание, что я заставляю график покрывать диапазон (0,1) по обеим осям. Вызов par() сообщает R построить оси, которые охватывают диапазон данных — по умолчанию они расширяются на 4 процента диапазона по каждой оси.

Следующая строка, with(dat, lines(....)), рисует кривую ROC, и здесь мы добавляем и добавляем точки в (0,0) и (1,1), чтобы получить полную кривую. Здесь я использую type = "o", чтобы начертить как точки, так и линии, точки представлены символом 25, что позволяет залить их цветом, здесь черным.

Затем я добавляю метки к точкам, используя text(....); аргумент pos используется для размещения метки вдали от фактических координат построения. Я беру метки из объекта cutpoint во фрейме данных.

Вызов abline() рисует линию 1:1 (здесь 0 и 1 означают пересечение 0 и наклон 1 соответственно.

Последняя строка сбрасывает параметры графика до значений по умолчанию, которые мы сохранили в op перед построением графика (в первой строке).

Результирующий график выглядит следующим образом:

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

Это не точное факсимиле, и я предпочитаю график, использующий значения по умолчанию для диапазонов осей (добавляя 4 процента):

plot(TPR ~ FPR, data = dat, xlim = c(0,1), ylim = c(0,1), type = "n")
with(dat, lines(c(0, FPR, 1), c(0, TPR, 1), type = "o", pch = 25, bg = "black"))
text(TPR ~ FPR, data = dat, pos = 3, labels = dat$cutpoint)
abline(0, 1)

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

Опять же, не совсем факсимиле, но близко.

person Gavin Simpson    schedule 16.02.2012
comment
Я должен спешить на встречу. Если вам нужно больше объяснений, я добавлю это, когда вернусь. - person Gavin Simpson; 16.02.2012
comment
Большое спасибо. Это сокровище! Кстати, как я могу обобщить этот код, чтобы включить несколько строк (т.е. более 1 серии отсечки, tpr и fpr) - person neversaint; 17.02.2012
comment
Добавьте дополнительные строки, используя повторные вызовы строки with(dat, lines(....)), где вам нужно заменить dat фреймом данных, содержащим вторую серию отсечек. В вызове lines() вы можете настроить символ графика и тип линии, а также цвет линий и точек, чтобы помочь вам отличить, какая серия какая. Если вы хотите пометить их, вам понадобится дополнительная text(....) строка для каждой новой with(dat, lines(....)) строки, которую вы добавляете. - person Gavin Simpson; 17.02.2012
comment
Только что наткнулся на это... @Гэвин, я что-то пропустил? 1 - ИМХО PPV это нечто совсем другое, чем FPR - знаменатель другой! И я не понимаю, как мы могли рассчитать FPR = 1 - специфичность по чувствительности и PPV, не зная распространенности/частоты класса/априорных вероятностей!? (при условии, что SN = чувствительность = TPR) - person cbeleites unhappy with SX; 25.05.2012
comment
@cbeleites Ну, я ничего не рассчитывал - я просто нанес на график значения, рассчитанные ОП. 1-специфичность довольно часто цитируется в медицинской литературе ROC, откуда я взял большую часть этого. - person Gavin Simpson; 25.05.2012
comment
@Gavin: да, конечно 1 - специфичность используется очень часто. Но у ОП нет специфики! У него PPV = Pr (правильный | прогноз был положительным), тогда как специфичность = Pr (правильный | основная правда была отрицательной). - person cbeleites unhappy with SX; 25.05.2012