Wednesday, June 1, 2022

Plotting ROC curve in R on Ubuntu 20.04/Fedora 35

 Кривая рабочих характеристик приемника (ROC) используется для оценки точности непрерывного измерения для прогнозирования бинарного результата. В медицине кривые ROC давно используются для оценки диагностических тестов в радиологии и общей диагностике. Кривые ROC также долгое время использовались в теории обнаружения сигналов.

Точность диагностического теста можно оценить, рассмотрев два возможных типа ошибок: ложноположительные и ложноотрицательные. Для непрерывного измерения, которое мы обозначаем как M, соглашение диктует, что положительный тест определяется как M, превышающий некоторый фиксированный порог c: M>c. Что касается бинарного результата, который мы обозначаем как D, то хорошим результатом теста является положительный результат теста у человека, у которого действительно есть заболевание: D=1. Плохой результат – положительный результат теста у человека, не страдающего заболеванием D=0.

Формально для фиксированного порогового значения с истинно положительная доля представляет собой вероятность положительного результата теста среди заболевшего населения:

TPF(c)=P{M>c|D=1}

а доля ложноположительных результатов — это вероятность положительного результата теста среди здорового населения:

FPF(c)=P{M>c|D=0}

Поскольку отсечка c обычно не фиксируется заранее, мы можем построить TPF в зависимости от FPF для всех возможных значений c. Это именно то, что представляет собой кривая ROC: FPF(c) по оси x и TPF(c) по оси y.

Пример кода на R:

boris@boris-All-Series:~/R-ROC$ cat attemptROC.R

library(plotROC)

library(ggplot2)

set.seed(2529)

D.ex <- rbinom(200, size = 1, prob = .5)

M1 <- rnorm(200, mean = D.ex, sd = .65)

M2 <- rnorm(200, mean = D.ex, sd = 1.5)

test <- data.frame(D = D.ex, D.str = c("Healthy", "Ill")[D.ex + 1], 

                   M1 = M1, M2 = M2, stringsAsFactors = FALSE)

basicplot <- ggplot(test, aes(d = D, m = M1)) + geom_roc(n.cuts = 0)

basicplot

Начинается с создания примера набора данных. Есть 2 маркера, один умеренно прогностический, а другой менее прогностический.

Затем используется функцию ggplot для определения эстетики и функцию geom_roc для добавления слоя кривой ROC. Функция geom_roc требует эстетики d для статуса болезни и m для маркера. Статус болезни не обязательно кодировать как 0/1, но если это не так, stat_roc предполагает (с предупреждением), что наименьшее значение в порядке сортировки означает отсутствие болезни. stat_roc и geom_roc связаны по умолчанию, при этом stat выполняет базовые вычисления эмпирической кривой ROC, а geom состоит из слоя кривой ROC.

Ubuntu 20.04.4 RStudio Console















boris@boris-All-Series:~/R-ROC$ cat attemptMulty.R

library(plotROC)

library(ggplot2)

set.seed(2529)

D.ex <- rbinom(500, size = 1, prob = .5)

M1 <- rnorm(500, mean = D.ex, sd = .65)

M2 <- rnorm(500, mean = D.ex, sd = 1.5)

longtest <- melt_roc(test, "D", c("M1", "M2"))

head(longtest)

ggplot(longtest, aes(d = D, m = M, color = name)) + geom_roc(n.cuts = 0) + style_roc() 
































Построение график ROC, используя функцию ggroc() из пакета pROC:

boris@boris-All-Series:~/R-ROC$ cat curveROC1.R
#load Default dataset from ISLR book
data <- ISLR::Default

#divide dataset into training and test set
set.seed(1)
sample <- sample(c(TRUE, FALSE), nrow(data), replace=TRUE, prob=c(0.7,0.3))
train <- data[sample, ]
test <- data[!sample, ]

#fit logistic regression model to training set
model <- glm(default~student+balance+income, family="binomial", data=train)

#use model to make predictions on test set
predicted <- predict(model, test, type="response")

#load necessary packages
library(ggplot2)
library(pROC)

#define object to plot
rocobj <- roc(test$default, predicted)

#create ROC plot
ggroc(rocobj)

































No comments:

Post a Comment