[[analises:tax:fixdata]]

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.

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)

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.

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="")
  • 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)
  • analises/tax/fixdata.txt
  • Última modificação: 21/16/2017 08:16
  • por labotam_admin