Каков наиболее эффективный способ вычисления матрицы путаницы из 2 логических векторов в R?

#r

#r

Вопрос:

Учитывая два логических вектора (т. Е. Только с ИСТИННЫМИ или ложными значениями в R), оба длиной n (один вектор является предсказанием, а другой — основной истиной), каков наиболее эффективный способ вычисления истинных положительных, истинных отрицательных, ложных положительных и ложных отрицательных результатов? Истинные положительные результаты можно легко получить, просто выполнив tp = pred amp; truth . Однако я не думаю, что в R есть другие логические операторы, которые могут напрямую помочь вычислить другую статистику.

Одним из очевидных решений является перебор обоих векторов и просто выполнение случаев (например, если предсказание ЛОЖНО, а истина ЛОЖНА, тогда увеличьте истинные отрицательные значения на единицу), но я чувствую, что должен быть более быстрый способ. Истинный положительный случай очень хорош, потому что это можно просто сделать с помощью векторизованного оператора AND (я думаю?).

РЕДАКТИРОВАТЬ: Мой плохой, забыл упомянуть пару важных деталей: векторы в моих реальных данных имеют длину в сто миллионов, и мне нужно вычислить матрицы путаницы около 30 000 раз. Ответы с использованием таблицы полезны, так как я полностью пропустил эту опцию раньше, но я боюсь, что преобразование в factor и использование table происходит слишком медленно. Я думаю, что лучшим вариантом на данный момент, вероятно, было бы использовать Rcpp.

Комментарии:

1. table(pred, truth)

2. @PKumar — если pred or truth является однородным, то R не вернет таблицу 2×2. Лучше сначала преобразовать в коэффициенты

Ответ №1:

Вы можете использовать confusionMatrix () функцию из caret пакета:

Код:

 library(caret)
set.seed(123)
confusionMatrix(
prediction <- factor(sample(c(0,1), 100, replace = TRUE)),
ground_truth <- factor(sample(c(0,1), 100, replace = TRUE)))
 

Вывод:

 Confusion Matrix and Statistics

          Reference
Prediction  0  1
         0 26 31
         1 20 23
                                         
               Accuracy : 0.49           
                 95% CI : (0.3886, 0.592)
    No Information Rate : 0.54           
    P-Value [Acc > NIR] : 0.8650         
                                         
                  Kappa : -0.0087        
                                         
 Mcnemar's Test P-Value : 0.1614         
                                         
            Sensitivity : 0.5652         
            Specificity : 0.4259         
         Pos Pred Value : 0.4561         
         Neg Pred Value : 0.5349         
             Prevalence : 0.4600         
         Detection Rate : 0.2600         
   Detection Prevalence : 0.5700         
      Balanced Accuracy : 0.4956         
                                         
       'Positive' Class : 0  
 

Ответ №2:

Сначала преобразуйте двоичные векторы в множители,

 pred = factor(pred, levels = c(F,T))
truth = factor(truth, levels = c(F,T))
 

это гарантирует, что будет возвращена полная таблица 2×2, даже если нет экземпляров определенных пар. Таблица непредвиденных обстоятельств вычисляется

 table(pred, truth)
 

преобразование в фактор сначала гарантирует, что комбинации без экземпляров получат значение 0 в результирующей таблице. Например,

 pred = rep(T, 10)
truth = rep(F, 10)

table(pred,truth)  # RETURNS A 1x1 TABLE 

pred = factor(pred, levels = c(F,T))
truth = factor(truth, levels = c(F,T))

table(pred,truth)  # RETURNS A 2x2 TABLE