Я пытаюсь использовать линейный дискриминантный анализ (LDA) с пакетом MASS в R, чтобы определить, являются ли виды в сообществах более различимыми, чем случайные наборы видов (с несколькими признаками, предсказывающими идентичность видов).
Когда я запускаю LDA для полного набора данных (все сообщества вместе), нет проблем. Моя проблема возникает, когда я пытаюсь использовать циклы для запуска LDA для каждого сообщества отдельно.
У меня 19 сообществ. Я составляю список из 19 названных new2; каждый элемент в списке представляет собой одно сообщество со всеми связанными с ним видами и их оценками по различным признакам. Я использую al oop для запуска LDA для каждого элемента этого списка new2 [[i]] и помещаю его в объект c .dfas [[i]]. Здесь нет проблем.
Затем я пытаюсь запустить al oop, чтобы оценить точность прогноза (% правильный для каждой категории видов) и поместить сводки в список coms.sum [[i]], который я должен получить. список из 19, с прогнозом успеха для каждого сообщества. Вместо этого я получаю эту ошибку: Ошибка в таблице (new2 [[i]] $ Species, c .dfas [[i]] $ class): все аргументы должны иметь одинаковую длину
Когда я запускаю длина (new2 [[i]]) я получаю 26, и когда я бегу длину (c .dfas [[i]]), я получаю 5.
Я понимаю, что это разные длины, но я не знаете, как ее решить / переписать l oop, чтобы это сработало. Я успешно выполнил этот точный (или, я полагаю, почти точный) код ранее с другим набором данных без проблем, поэтому я знаю, что можно каким-то образом добиться успеха в прогнозировании из этих списков.
Когда я бегу длину (new2 [i]), я получаю 19, а когда я бегу длину (c .dfas [i]), я получаю 19.
Как мне добраться до виды, хранящиеся в new2, и класс, хранящийся в c .dfas, имеют одинаковую длину?
data1 <-read.csv("Apr4_DFA.csv")
#load packages
library(MASS)
library(tidyverse)
library(caret)
library(lattice)
library(ggplot2)
theme_set(theme_classic())
#######################_Full_Model_############################
# Linear Discriminant Analysis with Jacknifed Prediction
full <- lda(Species ~ Pixelwise.Shannon.Entropy + Average.Local.Entropies + sclFWMC +
Local.Patch.Covariance + logAGM + Pixelwise.Differential.Entropy +
Patchwise.Differential.Entropy + Global.Patch.Covariance + logPMD +
logWDC + Colour.Diversity + pattern + logH1, data = data1, na.action="na.omit", CV=TRUE)
full # show results
# Assess the accuracy of the prediction
# percent correct for each category of Species
ct_full <- table(data1$Species, full$class)
diag(prop.table(ct_full, 1))
# total percent correct
sum(diag(prop.table(ct_full)))
#full model 91%
###################_Run DFA on Each Community_######################
#see levels in factor community
levels(data1$Community)
#see number of levels in factor community
length(levels(data1$Community))
#take the levels of community and put it in coms
coms <- levels(data1[,"Community"])
coms
#sample 1 community of coms without replacement
sample(coms,1, replace=F)
#make empty list of 19 put it in new2
new2 <- list(19)
#take each randomly drawn community and put them in new2
for(i in 1:19){
temp <- sample(coms,1, replace=F)
new2[[i]] <- data1 %>% filter(Community %in% temp)
new2[[i]] <- droplevels(new2[[i]])
rm(temp)
}
new2
#create empty list of 19 called c.dfas
c.dfas <- list(19)
#run dfa on each community subset and put it in c.dfas
for(i in 1:19){
c.dfas[[i]] <- lda(Species ~ Pixelwise.Shannon.Entropy + Average.Local.Entropies + sclFWMC +
Local.Patch.Covariance + logAGM + Pixelwise.Differential.Entropy +
Patchwise.Differential.Entropy + Global.Patch.Covariance + logPMD +
logWDC + Colour.Diversity + pattern + logH1, data = data1, na.action="na.omit", CV=TRUE)
}
c.dfas
unclass(c.dfas)
#make empty list of 19 called coms.sum
coms.sum <- list(19)
#make another empty list of 19 called ct.c.dfas
ct.c.dfas <-list(19)
################ this is where I get the error ###################
#loop to assess the accuracy of the prediction % correct for each category of Species
#put the summaries of total % correct in the coms.sum list
for(i in 1:19){
ct.c.dfas[[i]] <- table(new2[[i]]$Species, c.dfas[[i]]$class)
diag(prop.table(ct.c.dfas[[i]], 1))
coms.sum[[i]] <- sum(diag(prop.table(ct.c.dfas[[i]])))
}
coms.sum
length(new2[[i]]) #26
length(c.dfas[[i]]) #5 ```