Tabela de conteúdos

Introdução à ordenação multivariada

Ordenação é um método de redescrição dos dados multivariados de forma a apresentá-los em poucas dimensões, geralmente 2 ou 3, com a menor perda possível de informação. Veja o exemplo da representação gráfica de duas parcelas em um espaço dimensional de duas espécies.

Quando temos apenas duas dimensões de atributos (no caso duas espécies) a representação gráfica dos objetos, no nosso caso as parcelas, é direta.

Conforme vamos acrescentando informações de novos atributos (espécies) aos nossos objetos (parcelas), a representação gráfica torna-se mais difícil. Com três dimensões ainda conseguimos representar nossas parcelas em um gráfico.

graf3sp.jpeg

Os muitos métodos de ordenação como Análise de Componentes Principais (PCA), Análise de Coordenadas Principais (PCO), Análise de Correspondência (CA), têm como objetivo a redução das dimensões descritivas para visualizar melhor as relações entre os objetos, quando são descritos por muitas medidas.

Para seguir em frente é necessário que você tenha na área de trabalho do R as amostras das comunidades virtuais montadas, como descrito no roteiro padrões de gradientes em comunidades. Certifique-se disso com o comando ls(), que lista os objetos da área de trabalho do R. Na lista resultante devem estar os objetos amost.cont e amost.disc:

> ls()
 [1] "amost"    "amost.cont"  "amost.disc"  

Ordenação Polar

polar.jpg Foi um dos primeiros métodos de ordenação e devido a sua simplicidade foi amplamente usado por ecólogos. Apesar de suas limitações e de ter sido preterido por outros métodos mais sofisticados, a Ordenação Polar (OP) pode produzir resultados com interpretação ecológica relevante. Além disso, entender seu algorítmo simples é uma ótima maneira de entender a lógica geral da ordenação. O objetivo da OP é representar as parcelas em um sistema de coordenadas de forma que a distância entre as parcelas represente suas similaridades e que revelem o gradiente ambiental subjacente. Aqui vamos usar o algoritmo de OP desenvolvido por Bray e Curtis (1957), especificamente para a análise de dados de comunidades de plantas. Para iniciar a análise, primeiro calculamos a dissimilaridade de Bray-Curtis como nossa medida de distância1).

Abaixo uma função da função que calcula a dissimilaridade (distância) de Bary-Curtis entre todos os pares de parcelas. Para usar esta função, copie o código abaixo e cole-a na linha de comando do R.

dis.bc<-function(dados){
    nplot=dim(dados)[2]
    similar=matrix(NA,ncol=nplot,nrow=nplot)
    rownames(similar)<-paste("plot", c(1:nplot))
    colnames(similar)<-paste("plot", c(1:nplot))
    for(i in 1:(nplot-1)){
        m=i+1
        for(m in m:nplot){
            bc.dist=sum(
                abs(dados[,i]-dados[,m]))/(sum (dados[,c(i,m)])
                                           )
            similar[m,i]=similar[i,m]=bc.dist
            diag(similar)<-0
        }
    }
    return(round(similar,3))          
}

Algoritmo da Ordenação Polar

dis1.cont=dis.bc(amost.cont)
somadist1.cont=apply(dis1.cont, 1, sum, na.rm=TRUE)
somadist1.cont
  max(somadist1.cont)
  nomes.parc = names(somadist1.cont)
  parc.ax = nomes.parc[somadist1.cont==max(somadist1.cont)][1]
  parc.ax
dist.ax=dis1.cont[,parc.ax]
dist.ax
max.ax=max(dist.ax)
max.ax
parc.bx=nomes.parc[dist.ax==max.ax]
parc.bx
somamax.bx=max(somadist1.cont[parc.bx])
parc.bx=parc.bx[somadist1.cont[parc.bx]==somamax.bx][1]
parc.bx

bealsform.jpeg

Para o cálculo utilizamos a equação de Beal (1965) que nada mais é do que resolver a equação da hipotenusa dos dois triângulos acima. Após diversos passos, chegamos finalmente à equação de Beal:

$$ x_i \ = \ \frac{ L^2 \ + \ dist_{ax_i}^2 \ - \ dist_{bx_i}^2 }{2L} $$

onde “L” é a distância entre parc.ax e parc.bx (distância máxima no eixo x), “distax_i” é a distância da parcela “i” em relação à parc.ax, e “distbx_i” é a distância da parcela “i” em relação à parc.bx, conforme pode ser visualizado na figura acima.

  dist.ax
  dist.bx=dis1.cont[,parc.bx]
  dist.bx
xi = (max.ax^2 + dist.ax^2 - dist.bx^2)/(2*max.ax)
xi

$$ y_i = \sqrt{dist_{ax_i}^2 - x_i^2} $$

yi=sqrt((dist.ax)^2-xi^2)
yi
yi[parc.bx]=max.ax
yi
op1.cont=data.frame(xi,yi)
op1.cont
plot(op1.cont, pch=19, col=rainbow(length(xi)), xlab="Eixo 1", ylab="Eixo 2")
text(op1.cont+0.01, labels=rownames(op1.cont))

Função Ordenação Polar

Como somos muito legais, montamos uma função que faz todas essas operações para você não ter que fazer tudo novamente passo a passo. Veja abaixo:

ordena.polar=function(dist)
{
somadist1.cont=apply(dist, 1, sum, na.rm=TRUE) + apply(dist,2,sum, na.rm=TRUE)
nomes.parc=names(somadist1.cont)
parc.ax=nomes.parc[somadist1.cont==max(somadist1.cont)][1]
dist.ax=dist[,parc.ax]
max.ax=max(dist.ax)
parc.bx=nomes.parc[dist.ax==max.ax]
	if(length(parc.bx)>1)
	{
	  somamax.bx=max(somadist1.cont[parc.bx])
	  parc.bx=nomes.parc[somadist1.cont==somamax.bx][1]
	  parc.bx
	}
dist.bx=dist[,parc.bx]
xi= (max.ax^2 + dist.ax^2 - dist.bx^2)/(2*max.ax)
yi=sqrt((dist.ax)^2-xi^2)
yi[parc.bx]=max(dist.ax)
op.xy=data.frame(xi,yi)
opx=jitter(op.xy[,1],10)
opy=jitter(op.xy[,2],10)
plot(opx, opy, pch=19, col=rainbow(length(xi)), xlim=c(-0.1, 1.1), ylim=c(-0.1,1.1), main="Ordenação Polar", sub="Distância Bray-Curtis")
text(opx-0.02,opy-0.02 , labels=paste("p",1:dim(dist)[1], sep=""), cex=0.7)
return(op.xy)
}

Vamos aplicar a função para os dados da comunidade virtual contínua e ver se nossos cálculos estão corretos.

ordena.polar(dis1.cont)

Agora vamos aplicá-la para as comunidades virtuais discretas também.

Primeiro, você precisa usar a função disc.bc para produzir a matriz de dissimilaridade para a nossa amostra de comunidades discretas:

dis1.disc=dis.bc(amost.disc)

Depois, basta aplicar a função ordena.polar na matriz de similaridade das comunidades discretas

ordena.polar(dis1.disc)

Agora é por sua conta!

polar2.jpg Interprete os padrões observados tendo em vista as características que foram utilizadas para construir ambas comunidades.

Interpretação de Ordenações

Algumas dicas de interpretação de resultados de ordenações, não só da Ordenação Polar, baseadas no material produzido por Michael Palmer em seu, visualmente não muito atraente, mas ótimo site sobre ordenação:

  1. A direção dos eixos é arbitrária e não deve afetar a interpretação;
  2. A escala numérica do eixos não é muito útil para a interpretação (existem algumas exceções como DCA, em que a escala é em unidades de beta diversidade);
  3. Na OP, assim como muitas outras técnicas de ordenação, a ordem dos eixos é importante. Assim, o eixo 1 é mais importante para a interpretação dos gradientes ambientais que o segundo;
  4. A experiência prévia do sistema estudado e conhecimento da literatura pertinente são as ferramentas mais poderosas para a interpretação dos gradientes subjacentes ao padrão revelado pela ordenação;
  5. A interpretação de outros eixos além dos dois primeiros (quando a análise produz) é possível e a decisão de onde parar é uma questão arbitrária e dependente da quantidade e qualidade dos dados. Em algumas técnicas há estatísticas que ajudam a tomar essa decisão;
  6. É desejável que os eixos não sejam correlacionados, o que é garantido por algumas técnicas. Dessa forma é possível interpretar os eixos como gradientes diferentes.



Depois de passar pelas etapas de construir comunidades virtuais, amostrá-las e aplicar métodos de classificação e ordenação, acreditamos que vocês compreendam os princípios básicos dos métodos analíticos usados para a descrição de comunidades em ecologia. Como dito no início desses roteiros, existem muitos métodos diferentes para conhecer e muitas coisas ainda para resolver em relação a esses métodos. Um vasto mundo interessantíssimo!

Para saber mais

1)
para saber mais sobre medidas de similaridade e o índice de Bray-Curtis veja a a primeira parte de nosso roteiro sobre análise de agrupamento
2)
ou seja, aquela mais diferente de todas as outras