#executa LDA with leave one out crossvalidation #requer objetos dados, stepwise.res gerados nos outros scripts #faz LOO.LDA para cada conjunto de dados: abaxial+adaxial, abaxial, adaxial #faz LOO.LDA para cada conjunto de variáveis: stepwise variables; allvariables #retorna uma lista res.ldaloo contendo as matrizes spp vs. spp para cada dado e cada variavel com o resultado da validação cruzada; #produz também dois vetores com a porcentagem de acertos para cada conjunto de dados e variávies, paallvars e pastepvars. library(stringr) library(MASS) #conjunto de dados (gerado em script 01) rn = names(dados)[2:length(dados)] #cria objeto vazio para salvar os resultados res.ldaloo = NULL paallvars = NULL pastepvars = NULL #FAZENDO O LEAVE ONE OUT TEST for (i in 1:length(rn)) { #seleciona o dado cj = rn[i] dad = as.data.frame(dados[[cj]]) #seleciona os nomes das especies rnn = rownames(dad) rnn = t(as.data.frame(str_split(rnn,"_"))) rownames(rnn) = rownames(dad) rz = as.vector(rnn[,1]) spp = gsub("([0123456789])", "", rz) spp = str_trim(spp) spp = as.factor(spp) spun = unique(as.vector(spp)) #cria duas matrizes para os resultados de loo com stepvars e com todas as vars stepwisevars = as.data.frame(matrix(0,nrow=length(spun),ncol=length(spun),dimnames=list(spun,spun))) allvars = as.data.frame(matrix(0,nrow=length(spun),ncol=length(spun),dimnames=list(spun,spun))) #seleciona as variaveis para os dados spw = stepwise.res[[cj]] vars = spw$model[,2] #faz leave-one-out apenas com as melhores variaveis dadd = dad[,vars] ns = as.vector(rownames(dadd)) acertos = NULL for (k in 1:length(ns)) { #seleciona 1 amostra k nt = ns[k] #pega as demais amostra n-k ntrain = ns[-k] #pega o fator especies para essas amostra n-k spt = as.vector(spp)[-k] #gera o modelo discriminante para as n-k amostras ldd2 = NULL ldd2 = try(lda(as.matrix(dadd[ntrain,]),as.factor(spt)), silent=TRUE) #se nao funcionou considera não-acerto e imprime um erro if (length(ldd2)>3) { #prediz a classe da amostra k contra o modelo gerado ldp = predict(ldd2,dadd[nt,]) #checa a classe predita e anota o score pred = as.vector(ldp$class) org = as.vector(spp)[k] if (pred==org) { pacert = 1 } else { print(paste(org,'predita como',pred)) pacert = 0 } #junta num vetor os acertos e erros acertos = c(acertos,pacert) #salva a predicao na matrix spp vs spp stepwisevars[org,pred] = stepwisevars[org,pred]+1 } else { print(paste('stepwisevars ',nt,' não foi possivel predizer esta amostra. Erro em LDA!')) } } #calcula a porcentagens de acertos do conjunto de dados e salva num vetor pastepvars pacert = table(acertos)[2]/sum(table(acertos))*100 pastepvars = c(pastepvars,pacert) names(pastepvars)[i] = cj print("usa todas as variaveis") #usa todas as variaveis dadd = dad ns = as.vector(rownames(dadd)) acertos = NULL for (k in 1:length(ns)) { #seleciona 1 amostra k nt = ns[k] #pega as demais amostra n-k ntrain = ns[-k] #pega o fator especies para essas amostra n-k spt = as.vector(spp)[-k] #gera o modelo discriminante para as n-k amostras ldd2 = NULL ldd2 = try(lda(as.matrix(dadd[ntrain,]),as.factor(spt)), silent=TRUE) #se nao funcionou considera não-acerto e imprime um erro if (length(ldd2)>3) { #prediz a classe da amostra k contra o modelo gerado ldp = predict(ldd2,dadd[nt,]) #checa a classe predita e anota o score pred = as.vector(ldp$class) org = as.vector(spp)[k] if (pred==org) { pacert = 1 } else { pacert = 0 print(paste(org,'predita como',pred)) } acertos = c(acertos,pacert) #salva a predicao na matrix spp vs spp allvars[org,pred] = allvars[org,pred]+1 } else { #entao houve um erro print(paste('allvars ',nt,' não foi possivel predizer esta amostra. Erro em LDA!')) } } #calcula a porcentagens de acertos do conjunto de dados e salva num vetor paallvars pacert = table(acertos)[2]/sum(table(acertos))*100 paallvars = c(paallvars,pacert) names(paallvars)[i] = cj #salva o resultado final para o conjunto de dados na lista res.ldaloo rr = list(stepwisevars, allvars) res.ldaloo[[cj]] = rr } #limpa a area de trabalho #lista de objetos a manter tok = c("dados", "dados.brutos", "my.plotspc", "paallvars", "pastepvars", "res.lda", "res.ldaloo", "species", "stepwise.res", "var.selected" ) torm = ls() torm = torm[!torm%in%tok] rm(list=torm) rm(torm)