Построение средней кривой ROC для нескольких кривых ROC, R - PullRequest
0 голосов
/ 23 сентября 2018

У меня есть набор данных из 100 образцов, каждый из которых имеет 195 мутаций с соответствующим им известным клиническим значением («RealClass») и прогнозируемым значением согласно некоторому инструменту прогнозирования («PredictionValues»)

Для демонстрации, это случайный набор данных, который имеет ту же структуру, что и мой набор данных:

predictions_100_samples<-as.data.frame(matrix(nrow=19500,ncol=3))
colnames(predictions_100_samples)<-c("Sample","PredictionValues","RealClass")
predictions_100_samples$Sample<-rep(c(1:100), each = 195)
predictions_100_samples$PredictionValues<-sample(seq(0,1,length.out=19500))
predictions_100_samples$RealClass<-rep(c("pathogenic","benign"),each=10)
colours_for_ROC_curves<-rainbow(n=100)

Я построил все эти 100 выборок как кривые ROC через пакет PROC:

library("pROC")
roc_both <- plot(roc(predictor=predictions_100_samples[1:195,2],response = predictions_100_samples[1:195,3]), col = colours_for_ROC_curves[1],main="100 samples ROC curves",legacy.axes=TRUE,lwd=1)
i=2
for(i in 1:100){
    set.seed(500)
    roc_both <- plot(roc(predictor=predictions_100_samples[(((i-1)*195)+1):(i*195),2],response = predictions_100_samples[(((i-1)*195)+1):(i*195),3]), col = colours_for_ROC_curves[i], add = TRUE,lwd=1)
                     i=i+1
}

И этокак выглядит окончательный график:

Теперь я хочу добавить среднюю кривую ROC всех 100 построенных кривых ROC к одному графику.Я попытался использовать чувствительность и специфичность, рассчитанные для каждого порога с помощью функции "roc", в цикле, который я написал (это может быть достигнуто с помощью roc_both$sensitivities, roc_both$specificities, roc_both$thresholds)

Но главная проблемабыло то, что выбранные пороги были случайными и не равными вдоль 100 кривых ROC, которые я нанес, поэтому я не мог рассчитать среднюю кривую ROC вручную.

Существует ли другой пакет, который может позволить мне получить среднее значение ROCКривые нескольких кривых ROC?Или есть пакет, который позволяет устанавливать пороги для расчета чувствительности и специфичности вручную, чтобы впоследствии я мог рассчитать среднюю ROC-кривую?Возможно, у вас есть другое решение для моей проблемы?

Спасибо!

1 Ответ

0 голосов
/ 01 октября 2018

Вы можете использовать cutpointr для указания пороговых значений вручную с помощью функции oc_manual.Я немного изменил генерацию данных, чтобы кривая ROC выглядела немного лучше.

Мы применяем одинаковую последовательность порогов ко всем выборкам и берем среднее значение чувствительности и специфичности на порог, чтобы получить «среднее значение ROC».кривая».

predictions_100_samples <- data.frame(
    Sample = rep(c(1:100), times = 195),
    PredictionValues = c(rnorm(n = 9750), rnorm(n = 9750, mean = 1)),
    RealClass = c(rep("benign", times = 9750), rep("pathogenic", times = 9750))
)

library(cutpointr)
library(tidyverse)
mean_roc <- function(data, cutoffs = seq(from = -5, to = 5, by = 0.5)) {
    map_df(cutoffs, function(cp) {
        out <- cutpointr(data = data, x = PredictionValues, class = RealClass,
                         subgroup = Sample, method = oc_manual, cutpoint = cp,
                         pos_class = "pathogenic", direction = ">=")
        data.frame(cutoff = cp, 
                   sensitivity = mean(out$sensitivity),
                   specificity = mean(out$specificity))
    })
}

mr <- mean_roc(predictions_100_samples)
ggplot(mr, aes(x = 1 - specificity, y = sensitivity)) + 
    geom_step() + geom_point() +
    theme(aspect.ratio = 1)

Вы можете построить отдельные кривые ROC и добавленную среднюю кривую ROC с помощью cutpointr следующим образом:

cutpointr(data = predictions_100_samples, 
          x = PredictionValues, class = RealClass, subgroup = Sample,
          pos_class = "pathogenic", direction = ">=") %>% 
    plot_roc(display_cutpoint = F) + theme(legend.position="none") +
    geom_line(data = mr, mapping = aes(x = 1 - specificity, y = sensitivity), 
              color = "black")

В качестве альтернативы вы можете обратиться к теории суммарных кривых ROC (SROC) для подбора параметрической модели, которая объединяет несколько кривых ROC.

...