Я выполняю анализ PLS-DA в R, используя пакет mixOmics. У меня есть одна двоичная переменная Y (наличие или отсутствие водно-болотных угодий) и 21 непрерывная предикторная переменная (X) со значениями в диапазоне от 1 до 100.
Я создал модель с набором данных data_training
и хочу предсказать новые результаты с набором данных data_validation
. Эти наборы данных имеют точно такую же структуру.
Мой код выглядит так:
library(mixOmics)
model.plsda<-plsda(X,Y, ncomp = 10)
myPredictions <- predict(model.plsda, newdata = data_validation[,-1], dist = "max.dist")
Я хочу предсказать результат на основе 10, 9, 8,... до 2 основных компонентов. Используя функцию get.confusion_matrix
, я хочу оценить частоту ошибок для каждого количества основных компонентов.
prediction <- myPredictions$class$max.dist[,10] #prediction based on 10 components
confusion.mat = get.confusion_matrix(truth = data_validatie[,1], predicted = prediction)
get.BER(confusion.mat)
Я могу сделать это по отдельности 10 раз, но я хочу сделать это немного быстрее. Поэтому я думал составить список с результатами prediction
для каждого количества компонентов...
library(BBmisc)
prediction_test <- myPredictions$class$max.dist
predictions_components <- convertColsToList(prediction_test, name.list = T, name.vector = T, factors.as.char = T)
...а затем использовать lapply с функциями get.confusion_matrix
и get.BER
. Но тогда я не знаю, как это сделать. Я искал в Интернете, но я не могу найти решение, которое работает. Как я могу это сделать?
Большое спасибо за вашу помощь!
Без воспроизводимости это невозможно проверить, но вам нужно каждый раз преобразовывать код, который вы хотите запускать, в функцию. Что-то вроде этого:
confmat <- function(x) {
prediction <- myPredictions$class$max.dist[,x] #prediction based on 10 components
confusion.mat = get.confusion_matrix(truth = data_validatie[,1], predicted = prediction)
get.BER(confusion.mat)
}
Теперь ладно:
results <- lapply(10:2, confmat)
Это вернет список с результатами get.BER
для каждого количества компьютеров, поэтому результаты [[1]] будут результатами для 10 компьютеров. Вы не получите значения для prediction
или confusionmat
, если они не включены в результаты, возвращаемые get.BER
. Если вы хотите всего этого, вам нужно заменить последнюю строку функции на return(list(prediction, confusionmat, get.BER(confusion.mat))
. Это создаст список списков, так что results[[1]][[1]]
будет результатом prediction
для 10 ПК, а results[[1]][[2]]
и results[[1]][[3]]
будут confusionmat
и get.BER(confusion.mat)
соответственно.