Похоже, вы хотите получить прогнозы и матрицу путаницы для каждой модели. Без воспроизводимого примера и некоторой путаницы я делаю много догадок, но думаю, что понимаю, чего вы хотите (или достаточно близко). Я покажу вам, как я это сделаю с lapply
и Map
, а затем мы можем сделать это и с for
петлей.
Сначала получите прогнозы по данным тестирования. Все эти методы абсолютно одинаковы:
# lapply way
predictions = lapply(allModelsList, predict, newdata = testingdata)
# for loop way
predictions = list()
for (i in 1:length(allModelsList)) {
predictions[[i]] = predict(allModelsList[[i]], newdata = testingdata)
}
# manual way - just so you understand exactly what's going on
predictions = list(
predict(allModelsList[[1]], newdata = testingdata),
predict(allModelsList[[2]], newdata = testingdata),
predict(allModelsList[[3]], newdata = testingdata),
...
)
Теперь predictions
- это list
, поэтому мы получаем доступ к каждому элементу с помощью [[
. Первый - predictions[[1]]
, k
-й - predictions[[k]]
, если мы хотим определить некоторую переменную k
(как в цикле). Мы могли бы также добавить описательные имена и использовать имена вместо индексов.
Аналогично, мы можем вычислить все матрицы путаницы:
# lapply way
conf_matrices = lapply(predictions, confusionMatrix, reference = testingdata$outcome)
# for loop way
conf_matrices = list()
for (p in 1:length(predictions)) {
conf_matrices[[p]] = confusionMatrix(p, reference = testingdata$outcome)
}
# manual way (for illustration)
conf_matrices = list(
confusionMatrix(predictions[[1]], reference = testingdata$outcome),
confusionMatrix(predictions[[2]], reference = testingdata$outcome),
...
)
Опять же, у нас есть list
. Первая запутанная матрица conf_matrices[[1]]
и все то же самое, что и выше.
Надеюсь, это поможет нам понять, как использовать цикл lapply
или for
для создания списка.
Теперь, ближе к сути вашего вопроса, вы, кажется, подразумеваете, что Accuracy
часть матрицы путаницы. Я запустил пример внизу страницы справки ?confusionMatrix
и посмотрел на результат. Запуск str(conf_mat)
для результата показал мне, что это list
, и что элемент "overall"
списка является именованным вектором, включая "Accuracy"
. Таким образом, для отдельной матрицы путаницы cm
мы можем извлечь точность с cm[["overall"]]["Accuracy"]
. Мы используем [[
для list
части и [
для регулярной векторной части. (Мы могли бы также использовать cm$overall["Accuracy"]
. $
, когда мы даем ему точное имя, без кавычек, без переменных. Кажется, что многие из ваших проблем связаны с попыткой использовать $
с кавычками или переменными. Вы просто не могу этого сделать. См. fortunes::fortune(312)
).
Итак, мы можем извлечь точность из нашего списка матриц путаницы:
# I use *s*apply here so the result will be *s*implified into a vector
acc = sapply(conf_matrices, function(cm) cm[["overall"]]["Accuracy"])
acc = numeric(length(conf_matrices))
for (i in 1:length(conf_matrices)) {
acc[i] = conf_matrices[[i]][["overall"]]["Accuracy"]
}
Или, если вы знаете с самого начала, что вам нужна только точность, мы можем попасть туда напрямую, не сохраняя промежуточные шаги:
# apply
acc = sapply(allModelsList, function(x) {
pred = predict(x, newdata = testingdata)
cm = confusionMatrix(pred, reference = testingdata$outcome
return(cm[["overall"]]["Accuracy"]
}
)
# для цикла
acc = numeric (length (allModelsList))
для (я в 1: длина (allModelsList)) {
pred = Forecast (allModelsList [[i]], newdata = testingdata)
cm = confusionMatrix (pred, reference = testingdata $ output
acc [i] = (см [["общий"]] ["Точность"]
}
Примечания: Как уже упоминалось выше, без воспроизводимого примера, я предполагаю, что немного, и ничего из этого не проверено, потому что у меня нет входов для тестирования на . Я предполагаю, что то, что я вижу в вашем вопросе с точки зрения отдельных шагов, таких как то, что мы хотим предсказать для каждого элемента allModelResults
, является правильным. (Если это так, кажется, скажем, fittedModels
было бы гораздо лучшим именем, чем allModelResults
.) Я не знаю, что вы подразумеваете под "спецификациями моделей", и я понятия не имею, что в allModelList
, но, надеюсь, это даст вам достаточно примеров работы со списками, чтобы вы могли решить любые проблемы. (Также могут быть, скажем, несоответствующие скобки или пропущенные скобки.)
lapply
и sapply
удобны тем, что позволяют печатать меньше, чем цикл for
, но на самом деле они ничем не отличаются. Они создали объект для хранения результатов и заполнили его. Если вы хотите создать несколько результатов одновременно, вы можете просто использовать цикл for
. И поскольку количество шагов внутри становится длиннее, отладка цикла for в любом случае может быть проще. Используйте то, что вам нравится и что имеет для вас смысл.