Я ищу решение для применения функции confusionMatrix() от {caret} к определенным элементам разделенного списка. У меня есть 3 группы, каждая группа имеет 10 наблюдений столбцов Actuals и 3 Preds.Применить confusionMatrix() к элементам разделенного списка в R
library(caret)
set.seed(10)
dat <- data.frame(Group = c(rep(1, 10), rep(2, 10), rep(3, 10)), Actual = round(runif(30, 0, 1)),
Preds1 = round(runif(30, 0, 1)), Preds2 = round(runif(30, 0, 1)), Preds3 = round(runif(30, 0, 1)))
> dat
Group Actual Preds1 Preds2 Preds3
1 1 1 1 0 0
2 1 0 0 0 1
3 1 0 0 0 1
4 1 1 1 0 1
...........
27 3 1 0 1 0
28 3 0 0 0 1
29 3 1 0 0 1
30 3 0 1 0 1
Окончательное решение должно создавать матрицы смешения по группам по каждой колонке Preds. Мне понадобятся реальные таблицы таблиц путаницы, но в конечном итоге вам нужно будет извлечь элементы $ general и $ byClass и в итоге получить что-то вроде ниже.
> conf_matrix
$Preds1
Accuracy Sensitivity Specificity
[1,] 0.73 0.8 0.6
[2,] 0.93 0.91 1
[3,] 0.87 0.83 1
[4,] 0.8 0.82 0.75
...............
[27,] 0.8 0.82 0.75
[28,] 0.58 0.67 0.5
[29,] 1 0.67 1
[30,] 1 0 1
$Preds2
Accuracy Sensitivity Specificity
[1,] 0.73 0.8 0.6
[2,] 0.93 0.91 1
[3,] 0.87 0.83 1
[4,] 0.8 0.82 0.75
...............
[27,] 0.8 0.82 0.75
[28,] 0.58 0.67 0.5
[29,] 1 0.67 1
[30,] 1 0 1
$Preds3
...............
Я попытался сценарий ниже, но сохраняющий нарваться проблемами при попытке вторичного индексирования столбца Preds в каждой группе. Я считаю, что это имеет какое-то отношение к моим вложенным lapply's и тому, как я индексирую, поскольку это работает, когда я разлагаю код и прохожу через него по одному.
Я также попытался сделать это вручную, используя таблицу(), однако отказался от этого метода, потому что он не дает мне согласованных результатов, например, с помощью confusionMatrix().
lapply(seq_along(split(dat[3:5], list(dat$Group))), function(x) {
x_temp <- split(dat[3:5], list(dat$Group))[[x]]
lapply(seq_along(x_temp), function(x2) {
x_temp <- x_temp[[x2]]
lapply(seq_along(split(dat[2], list(dat$Group))), function(y) {
y_temp <- split(dat[2], list(dat$Group))[[y]]
lapply(seq_along(y_temp), function(y2) {
y_temp <- y_temp[[y2]]
confusionMatrix(x_temp, y_temp)
})
})
})
})
Я могу быть в стороне от базы, поэтому я открыт для всех предложений и комментариев.
@ Jaehyeon Kim Гораздо менее сложна, чем моя попытка выше. Спасибо. Моим конечным результатом являются отдельные элементы confusionMatrix(). В вашем решении перечислены элементы таблицы $ table, которые мне нужны, но мне также нужно извлечь $ general [1] и $ byClass [1: 2], что даст мне точность, чувствительность и специфичность. Я могу соответствующим образом обновить ваш код. – Brian
@ Jaehyeon Kim Я читал о do.call http://stackoverflow.com/questions/10801750/whats-the-difference-between-lapply-and-do-call-in-r, однако немного неясно, как когда я должен выбрать этот метод над чем-то вроде моих вложенных циклов выше. Не могли бы вы объяснить, почему это лучший вариант? – Brian
@ Jaehyeon Kim Очень хорошо объяснил и решает мою проблему. Благодарю. Я считаю, что двойной цикл - это то, где я сталкивался с моими проблемами, требующими извлечь из нескольких уровней в списке. – Brian