Ordenação é um método de re-descrição dos dados multivariados de forma a apresentá-los em poucas dimensões, geralmente 2 ou 3, com minima perda de informação. Veja o exemplo da representação gráfica de duas amostras 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.
Vamos reapresentar nossa comunidade pelas duas primeiras espécies:
sp2=com1.cont[c(1,2),] duas.sp=sp2[,apply(sp2,2,sum)>0] plot(t(duas.sp), pch=20, col=rainbow(dim(duas.sp)[2]), xlab="sp1", ylab="sp2") text(duas.sp[1,]+0.1, duas.sp[2,]+0.4, colnames(duas.sp),col=rainbow(dim(duas.sp)[2]) )
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.
Os muitos métodos de ordenação como Análise de Componentes Principais (PCA), Análise de Correspondência (CA), tem como base a redução das dimensões descritivas para melhor visualizar as relações entre os objetos.
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) produz resultados com interpretação ecologica relevante. O objetivo da OP é representar as parcelas em um sistema de coordenadas de forma que a distância entre as parcelas representem suas similaridades e que revelem o gradiente ambiental subjacente. Aqui vamos usar o algorítmo de OP desenvolvido por Bray e Curtis (1957), especificamente para a análise de dados de comunidades de plantas. Para inciar a análise, primeiro calculamos a dissimilaridade de Bray-Curtis como nossa medida de distânca. Abaixo a modificação da função que usamos para a similaridade, agora calculando a dissimilaridade (distância).
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]=bc.dist } } return(round(similar,3)) }
dis1.cont=dis.bc(com1.cont)
somadist1.cont=apply(dis1.cont, 1, sum, na.rm=TRUE)+ apply(dis1.cont,2,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
dis1.cont[,parc.ax] dis1.cont[parc.ax,] dist.ax=rbind(dis1.cont[,parc.ax], dis1.cont[parc.ax,]) dist.ax dist.ax=apply(dist.ax,2,sum, na.rm=TRUE) dist.ax max.ax=max(dist.ax) max.ax parc.bx=nomes.parc[dist.ax==max.ax] parc.bx
max(somadist1.cont[parc.bx]) somamax.bx=max(somadist1.cont[parc.bx]) parc.bx=parc.bx[somadist1.cont==somamax.bx][1] parc.bx
Para o calculo utilizamos a fórmula de Beal (1965) que nada mais é do que resolver a equação da hipotenusa dos dois triangulas acima, mais ou menos nessa sequência: Para o triangulo da direita:
$$ dist_{ax_i}^2 = x_i^2 + y_i^2$$
portanto:
$$ y_i^2 = dist_{ax_i}^2 - x_i^2 $$ (1)
Para o triangulo da esquerda:
$$ dist_{ay_i}^2 = (L-x_i)^2 + y_i^2 $$
Podemos agora substituir o $$y_i^2$$ da expressão acima pela (1) e isolar o $$ x_i$$:
$$ dist_{ay_i}^2 = (L-x_i)^2 + dist_{ax_i}^2 - x_i^2 $$
$$ dist_{ay_i}^2 = L^2 - 2Lx_i + x_i^2 + dist_{ax_i}^2 - x_i^2 $$
$$ x_i^2 - x_i^2 - 2Lx_i = L^2 + dist_{ax_i}^2 - dist_{ay_i}^2 $$
Simplificando a expressão chegamos finalmente à formula de Beal:
$$ x_i \ = \ ( L^2 \ + \ dist_{ax_i}^2 \ - \ dist_{bx_i}^2 )/ (2L) $$
dist.ax dist.bx=rbind(dis1.cont[,parc.bx], dis1.cont[parc.bx,]) dist.bx dist.bx=apply(dist.bx,2,sum, na.rm=TRUE) 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)
Agora vamos preparar uma função que faça essas operações para não termos que fazer tudo novamente passo a passo.
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=rbind(dist[,parc.ax], dist[parc.ax,]) dist.ax=apply(dist.ax,2,sum, na.rm=TRUE) 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=rbind(dist[,parc.bx], dist[parc.bx,]) dist.bx=apply(dist.bx,2,sum, na.rm=TRUE) 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) plot(op.xy, pch=19, col=rainbow(length(xi)), xlim=c(-0.1, 1), ylim=c(-0.1,1), main="Ordenação Polar", sub="Distância Bray-Curtis") text(op.xy-0.05, labels=rownames(op.xy)) 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.
dist1=dis.bc(com1.cont) ordena.polar(dist1)
Agora que já temos a função, vamos aplicá-la para as suas comunidades virtuais. Em seguida interprete os padrões abservado tendo em vista a sua comunidade virtual e as características com que a construiu.
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: