Preparando Dados Para Análises
Este tutorial mostra como transformar um dados.morfo.brutos em uma tabela para análise, incluindo:
- A obtenção das médias de cada variável por amostra
- A transformação dos dados brutos em dados para análise de forma a poder incluir todas as amostras na análises, ou seja, como lidar com valores ausentes (NA) na sua matriz de dados.
Obtenção de médias por amostra
Requer:
- dad = dados.morfo.bruto, i.e. tabela com valores numéricos ou com múltiplos valores por célula separados por ";" (deste irá calcular a média). Todos valores numéricos.
Retorna:
- data.frame com mesma dimensão que dad, mas com as médias dos valores
#função para calcular a média por célula m.media<-function(x,nomecoluna="") { res = NA if (!is.na(x)) { if (is.character((x))) { xx = strsplit(x,";")[[1]] xx = xx[xx!=''] xx1 = as.numeric(xx) xx1 = xx1[!is.na(xx1)] if (length(xx1)!=length(xx)) { print(paste("Coluna",nomecoluna,"tem valor não numérico:'",paste(xx,collapse = ";"),"'")) } xx = xx1 } else { xx = x} xx = xx[!is.na(xx)] xx = mean(xx,na.rm = T) if (length(xx)==1) { res = xx} } return(res) } #função que aplica m.media para todas as colunas em dad aplicamedia <- function(dad) { for(cl in 1:ncol(dad)) { v1 = dad[,cl] vm = sapply(v1,m.media,nomecoluna=colnames(dad)[cl]) dad[,cl] = as.numeric(as.vector(vm)) } return(dad) } #obtendo os valores médios de cada amostra dados.media = aplicamedia(dad)
Obtendo valores comparativos para todas as amostras
Suponha que seu dado contenha muitos valores ausentes (NA) e você quer analisar todas as amostras disponíveis simultaneamente. O seguinte procedimento pode ser usado:
- Calcula-se a distância morfológica par a par apenas com as variáveis disponíveis no par (ver Details da função daisy(){Cluster})
- Com essa matriz de distância entre todas as amostras, utiliza-se o NMDS para obter eixos que representam as variáveis morfológicas ordenadas e com isso uma tabela de dados que pode ser usada nos testes de classificação a priori e a posteriori.
Opcional - Checando as comparações
Este passo é opcional. Serve apenas para examinar a distribuição do número de variáveis disponíveis para as comparações par a par.
#examine a distribuição do numero de variáveis #disponíveis para comparação entre cada par de amostras #cria função que conta o numero de amostras disponiveis para a para podecomparar <- function(x) { tot = nrow(x)*nrow(x) ores = matrix(0,nrow=nrow(x),ncol=ncol(x)) ores = as.data.frame(ores) idx = 1 for(n in 1:nrow(x)) { for(j in 1:nrow(x)) { cat("\014") cat(paste(round((idx/tot)*100,1),"%"),sep="") od = x[c(n,j),] od = od[!is.na(od) & od!=""] ores[n,j] = length(od) idx = idx+1 } } return(ores) } #aplica essa função = isso pode demorar pd = podecomparar(dados.media) #resume a distribuicao de numero de variaveis entre pares de amostras summary(pd[lower.tri(pd)]) #plota isso hist(pd[lower.tri(pd)],breaks=20,col='red',xlab="Número de variáveis",main="")
Transformando os dados
- usa dados.media e obtém um data.frame onde linha são amostras e colunas é a variação morfológica expressa em eixos NMDS
library(MASS) library(cluster) #CALCULA A DISTANCIA MORFOLÓGICA USANDO GOWER md = daisy(dados.media, metric = "gower", stand = T,warnBin = F) #talvez seja bom indicar os tipos de variáveis no argumento type da funcão daisy() (ver help) #se for NA, então a dissimilaridade é 0 md[is.na(md)] = 0 #onde for 0 coloca alguma distancia minima (artefato para poder fazer o NMDS) md[md==0] = 0.0000000000000001 #QUAL O NÚMERO DE EIXOS MINIMOS (K) QUE DEVO REDUZIR MEUS DADOS SEM PERDER INFORMACAO #qual o número de eixos que minimiza o valor de stress no NMDS? qualk = NULL #testa de k=2 a k=número de variáveis originais for(k in 2:ncol(dados.media)) { print(paste(k,"de",ncol(dados.media))) m.nmds = isoMDS(md,k=k) m.nmds$stress rr = data.frame(K=k,STRESS=m.nmds$stress) qualk = rbind(qualk,rr) } K = qualk$K STRESS = qualk$STRESS plot(K,STRESS,type='l',lwd=2,lty='solid') points(K,STRESS,pch=1,cex=2) #TRANSFORMAND O DADO #qual o K mínimo após o qual o valor de stress estabiliza? um.bom.k = 25 #ordena os dados com NMDS e este K m.nmds = isoMDS(md,k=um.bom.k) m.nmds$stress dado.nmds = m.nmds$points colnames(dado.nmds) = paste("NMDS",1:ncol(dado.nmds),sep='') write.table(dado.nmds,file='dadosMORFOnmds.csv',sep="\t",na="",row.names=T,quote=T)