#r
#r
Вопрос:
Учитывая два логических вектора (т. Е. Только с ИСТИННЫМИ или ложными значениями в R), оба длиной n (один вектор является предсказанием, а другой — основной истиной), каков наиболее эффективный способ вычисления истинных положительных, истинных отрицательных, ложных положительных и ложных отрицательных результатов? Истинные положительные результаты можно легко получить, просто выполнив tp = pred amp; truth
. Однако я не думаю, что в R есть другие логические операторы, которые могут напрямую помочь вычислить другую статистику.
Одним из очевидных решений является перебор обоих векторов и просто выполнение случаев (например, если предсказание ЛОЖНО, а истина ЛОЖНА, тогда увеличьте истинные отрицательные значения на единицу), но я чувствую, что должен быть более быстрый способ. Истинный положительный случай очень хорош, потому что это можно просто сделать с помощью векторизованного оператора AND (я думаю?).
РЕДАКТИРОВАТЬ: Мой плохой, забыл упомянуть пару важных деталей: векторы в моих реальных данных имеют длину в сто миллионов, и мне нужно вычислить матрицы путаницы около 30 000 раз. Ответы с использованием таблицы полезны, так как я полностью пропустил эту опцию раньше, но я боюсь, что преобразование в factor и использование table происходит слишком медленно. Я думаю, что лучшим вариантом на данный момент, вероятно, было бы использовать Rcpp.
Комментарии:
1.
table(pred, truth)
2. @PKumar — если
pred
ortruth
является однородным, то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