Arquivo da tag: ecologia

nMDS, como funciona?

Este é um post que eu queria escrever desde o mestrado durante as aulas de ecologia de comunidades. Hoje vamos aprender como realmente funciona uma das ordenações mais usadas no momento, o escalonamento multidimensional não métrico (nMDS).

Quando realizamos uma ordenação estamos buscando  uma forma de visualizar de forma mais simplificada as dimensões do nosso problema. Quem nunca criou uma tabela de dados após uma coleta e ficou na duvida de como explorar a informação? O nMDS é uma dessas formas de visualização dos dados que é extremamente robusta e consegue passar sobre as limitações usuais.

Como funciona

O objetivo do nMDS é representar os seus dados que estão em N-dimensões em sua forma original para algo pelo menos N-1 dimensões. Irei exemplificar dando um exemplo em R com o conjunto de dados iris. O conjunto consiste da mensuração de quatro características de 50 flores em três espécies (mais informações digita ?iris no R).

O nMDS é uma solução numérica e significa que vamos passar por varias tentativas até a aproximação de uma solução para o problema, abaixo lista as etapas que um nMDS executa:

  1. Calcular um índice de dissimilaridade dos dados originais;
  2. Distribuir aleatoriamente os pontos no espaço com N dimensões desejado (serve como solução inicial do problema);
  3. Calcular o índice de dissimilaridade da solução proposta;
  4. Comparar a dissimilaridade dos dados originais com a dissimilaridade da solução atual (esse passo é conhecido como Stress);
  5. Se o Stress for aceitável termine a execução do nMDS, caso contrario continue no passo 2 tentando melhorar a solução anterior.

Passo 1: envolve ter algum conhecimento sobre índices de dissimilaridade para escolha correta. A escolha de um índice de dissimilaridade afeta diretamente o resultado final do seu nMDS. O post sobre simetria de índices pode ajudar!

Usando o pacote vegan podemos calcular vários índices de dissimilaridade, abaixo um exemplo:

library(vegan)
vegdist(iris[, 1:4], "bray") 
# calcula o índice de Bray-Curtis para as colunas de mensuração do conjunto iris

 

 

Passo 2: como é um algoritmo iterativos temos que partir de algum ponto (mesmo que não seja bom!), a solução aleatória é empregada na primeira iteração desse algoritmo. No caso do conjunto de dados iris uma solução aleatória em duas dimensões:

random solution

Primeira solução proposta pelo nMDS. São exibidos 150 pontos, o que corresponde ao número de linhas no conjunto de dados iris.

Passo 3: mesmo procedimento do passo 1, só que agora vamos utilizar os dados do passo 2! Com isso temos a dissimilaridade original e a da nova solução proposta.

Passo 4: aqui vamos calcular o stress da solução proposta contra os dados originais. O stress é a métrica de ajuste da nossa solução aos dados originais. Quanto menor o stress melhor, formula abaixo:

S = \sqrt{ \frac{\sum (d_{ij} - D_{ij})^2}{\sum d_{ij}^2 } },

onde d_{ij} é a dissimilaridade dos dados originais na posição ij e D_{ij} a dissimilaridade da solução proposta no passo 2. Basicamente pegamos as duas dissimilaridades e subtraímos, quanto mais próximo a 0 mais similar são as soluções.

Passo 5: se o stress do passo anterior estiver dentro de uma margem ideal, terminamos o processo de nMDS. Essa margem ideal é arbitraria e logo não existe uma regra absoluta de qual valor é ideal, aqui entra a interpretação do resultado.

Se o valor do stress ainda não foi o ideal determinado pelo pesquisador voltamos ao passo 2 mas em vez de gerar uma solução aleatória vamos tentar mover os pontos da solução anterior para conseguir abaixar mais um pouco o stress. Essa “movida” de pontos que consome muito tempo no nMDS e dependendo da implementação é possível não encontrar uma boa solução!

O algoritmo de nMDS mais usado é a função wrapper do pacote vegan chamada metaMDS. Apesar de ser extremamente rápido na maioria dos casos o metaMDS pode ficar preso em um local optima e a sua solução ser um gráfico aleatório que não te leva a conclusão nenhuma.

Na minha implementação em R do nMDS para esse post eu utilizei um algoritmo genético que tenta chegar a solução por um processo similar a evolução, utilizando reprodução e seleção por fitness. Similar a evolução o algoritmo leva um tempo até chegar a solução, esse tempo pode variar bastante o que caracteriza uma desvantagem para esse algoritmo. Porem, nosso algoritmo não fica preso em local optima pois as mutações que ocorrem nas soluções criam novas possibilidade o tempo todo. A explicação detalhada do algoritmo genético vai ficar para outro post.

Interpretando

Abaixo temos os dois gráfico de ordenação onde em preto, vermelho e verde temos respectivamente as espécies Iris setosa, Iris versicolor e Iris virginica:

 

Como explicado nos passos anteriores o nMDS é construido tentando manter as dissimilaridades na mesma escala dos dados originais. Então, quanto mais próximos os pontos, mais similares eles são. Iris setosa é bem diferente de Iris versicolor e Iris virginica, enquanto Iris versicolor e Iris virginica são mais semelhantes entre si. Conclusão semelhante a Figura 1 de Fisher, R. A. (1936) que usou o mesmo conjunto de dados.

Coloquei a solução com algoritmo genético e a do vegan para demonstrar como a interpretação do stress é arbitraria. O stress do vegan é muito menor do que a nossa solução e várias pessoas iriam afirmar para ignorar a minha solução com stress 0,33. Nunca caiam em uma armadilha de ignorar resultados sem inspecionar gráficos. O gráfico do nMDS é apenas uma visualização dos seus dados com um número menor de dimensões. Não olhe para esse gráfico tentando interpretar a distância de cada ponto, tente procurar agrupamento de pontos (ou ausência deles).

As interpretações devem parar aqui.

  • No nMDS não existe eixo a regra que o primeiro eixo possui a maior variação dos dados;
  • Não se deve usar os eixos do nMDS em outras analises. Os eixos do nMDS não são ortogonais!
  • Se ainda assim quiser usar os eixos, reduza o número de dimensões do nMDS para uma ou utilize todos os eixos em forma de interação (caso seja regressão).

Lembre-se o nMDS é para visualizar os seus dados e entender as dissimilaridades (ou similaridades) entre as suas unidades amostrais.

Conclusão

Soluções numéricas são as minhas favoritas para ensinar. Podem não te dar o resultado em 200 milissegundos como as analíticas mas consigo explicar para minha mãe sem ter que repassar todo o ensino médio da matemática novamente.

Cuidado com valores de corte (p < 0,05, stress < 0,1), eles são perigosos e já causaram muitas estragos invalidando várias conclusões de forma cega. Não importa se é ciência, você ainda precisa fazer as interpretações!

Ainda acho que nMDS deveria ser a primeira ordenação ensinada. Você pode até ensinar sem falar que é o nMDS e vão achar que algum tipo de técnica muito básica, quando falar que é nMDS todos vão ficar espantados que é “só isso?”.

Referência

Como sempre códigos em R desse post no github.

Fisher, R. A. (1936) The use of multiple measurements in taxonomic problems. Annals of Eugenics, 7, Part II, 179–188.

Anúncios

IPT pronto para dados ecológicos!

Durante esse mês que passou muitas coisas aconteceram no desenvolvimento do IPT. A meu ver a principal delas para comunidade ecológica foi a incorporação do core de eventos e a aceitação dos metadados com o tipo evento de amostragem.

Durante os testes da versão de desenvolvimento notei que apesar da criação de um core dedicado para eventos ainda era necessário associar uma extensão de ocorrência. O que não é uma verdade para dados ecológicos. É comum a coleta de variáveis ambientais sem espécies associados, como por exemplo, emissão de carbono ou qualidade da água. Com isso fiz um pull request que foi aceito mas com a ressalva de exibir um aviso de atenção, já que não consideram o cenário comum no momento.

Outra mudança interessante foi o versionamento das extensões que também contam com um sistema de atualização mais inteligente. Anteriormente era necessário atualização manual das extensões ou correria o risco dos dados parassem de exibir na interface web.

E finalmente o lançamento da versão 2.3 do IPT contendo as mudanças citadas acima e a migração para o github.com.

Então que venham os dados ecológicos para avaliar as mudanças novo IPT.

O que separa o Metacat do IPT? Uma coluna!

Para os leitores que não conhecem as ferramentas e o contexto atual irei dar uma breve introdução.

Metacat

Software do tipo serviço (ou daemon) onde são armazenados principalmente dados ecológicos e suas descrições (metadados). Aceita outros formatos mas a comunidade sempre que escuta sobre Metacat associa com dados ecológicos. O Metacat segue o padrão EML de descrição dos dados. O principal objetivo do EML é conseguir descrever dados usando um formato flexível como os dados ecológicos. Dessa forma o Metacat trabalha com o formato repositório de dados onde as colunas não são fixas em nomenclatura e/ou quantidade possível.

Pontos fortes: padrão flexível que permite descrever qualquer formato de tabela.

IPT Integrated Publishing Toolkit

Também é um software serviço sendo associado principalmente a dados de coleção. Segue o padrão Darwin Core para formatação das tabelas. O padrão é fixo, o que significa que as colunas de sua tabela precisam estar de acordo com os termos já publicados ou seus dados não podem ser disponibilizados. Dessa forma o Darwin Core é ideal para banco de dados pois já sabemos exatamente o que esperar em número de colunas e nomenclatura.

Pontos fortes: facilita a coleta de informação em massa para tomada de decisões e minimiza o número de erros.

Dados de coleção no Metacat?

O padrão Darwin Core pode ser descrito dentro do EML. Você poderia deixar um EML template seguindo o formato Darwin Core e apenas preencher as células com a informação que chegasse na coleção.

Apesar de simples o processo mas não é o ideal para administração. O Metacat não guarda a tabela de dados dentro do seu banco de dados, são simples arquivos de texto soltos em uma pasta no servidor. Então com o tempo essa tabela deve crescer ao ponto que o nosso humilde Calc ou Excel não irão mais conseguir gerenciar uma tabela desse porte. O Metacat é ideal para pacotes individuais de dados, ele guarda bem dados ecológicos pelo fato de um dia a tabela parar de crescer em número de registros. Em uma coleção a tabela de um grupo provavelmente nunca vai parar de crescer, tornando o Metacat uma ferramente fraca para o trabalho.

Dados ecológicos no IPT?

Sim! Agora é possível com os termos de eventos e mensuração. Irei usar como exemplo um dataset armazenado no Metacat do Peld-1.

A tabela possui essa estrutura:

sitio trilha parcela N posicao X Y especie mês ano cacho numero_frutos densidade abertura_copa serrapilheira
DUCKE LO8 LO8_3500 20822 D 84.34 1.80 Is Maio 2009 Cacho1 52 2 2 20
DUCKE LO8 LO8_3500 365 D 133.80 1.00 Se Maio 2009 Cacho1 261 3 4 0
DUCKE LO8 LO8_3500 20872 D 204.52 1.19 Is Maio 2009 Cacho1 238 3 2 0

Estamos interessados em explorar três termos do Darwin Core para processar esses dados: measurementIDmeasurementTypemeasurementValue. Esses três termos são o minimo para descrever qualquer dado ecológico.

Como converter uma tabela com várias colunas relacionadas para um formato minimo de três colunas sem perda de informação? Com uma coluna de chave primaria, muitos se esquecem desse recurso que identifica cada linha de forma única em um banco de dados. Não precisamos de nada muito complexo, vamos adicionar uma nova coluna aos dados. Todas as manipulações são feitas em R.


dados = read.table('fecosta.257.1-contagem_frutos.txt', header = T, encoding = 'latin1', sep = '\t')
dados$primid = 1:nrow(dados)

Nossa coluna se chama primid e possui valores sequencias até o número de linhas que a tabela dados possui. Com isso temos um identificador único para cada linha e podemos fazer uma manipulação conhecida como tabela dinâmica.


library(reshape2)
dadosm = melt(dados, id.vars = 'primid')

O pacote reshape2 permite mudar a forma que a tabela é apresentada (long ou wide). Usamos a função melt para deixar nossa tabela no formato mais longo possível usando como ancora a coluna primid. O resultado pode ser visto na tabela abaixo.

primid variable value
6 sitio DUCKE
6 trilha LO8
6 parcela LO8_3500
6 N 403
6 posicao E
6 X 139.3
6 Y 3.68
6 especie Is
6 mês Maio
6 ano 2009
6 cacho Cacho1
6 numero_frutos 29
6 densidade 1
6 abertura_copa 4
6 serrapilheira 6

Temos uma tabela com três colunas e sem perda alguma de informação. Essa tabela já pode entrar no IPT, durante a importação só é necessário mapear as colunas com os termos respectivos. Existem outros termos que são relevantes como measurementUnit que não são usados aqui mas toda publicação ecológica deveria preencher, leia a referência do Darwin Core para mais informações.

Algumas pessoas podem comentar que não sabem manipular tabelas dessa forma ou que não tem experiência com tabela dinâmica. Para voltar a tabela ao formato exatamente igual ao inicial basta digitar:


dcast(dadosm, primid ~ variable)

Conclusão

O padrão Darwin Core aos poucos começa a englobar áreas que não explorava antes e a maioria dos pesquisadores não estão dando chance a ferramenta. Eu mesmo já achei loucura dados ecológicos no IPT, mas depois de testar com um dataset de 35 variáveis e 205 mil linhas achei ele bastante robusto. Fora a parte descrita aqui existe a parte administrativa das ferramentas. Mais ferramentas significam mais problemas.

Meu nome é Monte Carlo, resolvo todos os seus problemas

Como todo grande método eu nasci fora do trabalho. Meu pai, Stanislaw Ulam esta doente e jogava paciência para passar o tempo. Paciência é um jogo onde as chances de vitoria são baixas e meu pai queria saber qual a chance de vitoria com um deck padrão de 52 cartas. Após muitas tentativas de resolver o problema analiticamente ele desistiu e pensou que seria mais simples apenas simular vários jogos e verificar o número de sucessos. No final desses raciocino o inconsciente do meu pai conversou com o consciente e lembrou que o mesmo poderia ser aplicado no trabalho sobre a difusão de nêutrons e muitos outros no campo da matemática e física. Entendendo a importância do que havia imaginado, meu pai correu para o meu futuro padrinho John Von Neumann que me batizou como Monte Carlo, devido a minha necessidade de números aleatórios que o lembrava do casino de Mônaco.

Fiquei bastante popular durante o projeto Manhattan pelo desenvolvimento da bomba de hidrogênio. Hoje em dia todo mundo me conhece junto com meus amigos Markov e Metropolis. Com eles resolvemos integrais que seriam impossíveis, campos inteiros se tornaram viáveis e são populares novamente, como a estatística Bayesiana e o método de máxima verossimilhança usados em resolução de problemas complexos. Meu uso só deve crescer no mundo científico, afinal os problemas sempre ficam mais complexos com tempo.

Espero que a lorota acima tenha agradado porque agora começa a matemática de verdade da publicação. Como descrito acima o método surgiu para solucionar problemas que são muito complicados analiticamente. Durante o projeto Manhattan eles não podiam ficar explodindo uma nova bomba para cada nova possibilidade, assim como Ulam não estava conseguindo calcular a probabilidade de vencer um jogo de paciência. Com isso uma solução numérica pareceu mais simples, vamos dar um exemplo de como calcular o valor de π.

Irei dar um exemplo simples usando a imagem abaixo para descrever a lógica da solução:

quadrado e circulo

Temos um quadrado com o circulo no seu interior. O circulo possui raio r e área \pi r^2, o quadrado por usa vez possui lado 2r e área (2r)^2. Podemos então calcular a proporção de área que o circulo ocupada dentro do quadrado realizando uma divisão:

p = \frac{\pi r^2}{(2r)^2}

Desenvolvendo a equação e isolando a incógnita \pi:

\pi = 4p

Ficamos travados na solução acima, não temos o valor de \pi e também não temos o valor de p. A solução é descobrir o valor de p. Nós temos bastante informação sobre o problema e podemos elaborar algo bastante criativo para solucionar a falta da proporção para descobrir o valor de \pi.

Utilizando a nossa imagem acima podemos calcular a proporção realizando arremessos de dardos dentro da área do quadrado. Todos os dardos estão dentro do quadrado, mas um grupo menor desses cai dentro da área do circulo. Assim podemos definir a proporção como:

p = \frac{\text{dentro do circulo}}{\text{N. de arremessos}}

A nossa acurácia na estimativa de p\pi depende do nosso número total de arremessos. A imagem abaixo foi criada com 10000 arremessos e o \pi = 3.1228.

quadrado, circulo e lançamentos

Esse processo de arremessos em posições aleatórias com a finalidade de solucionar um problema por aproximação é um exemplo da aplicação do método de Monte Carlo. Existem vários exemplos como o paradoxo de Monty Hall ou o próprio problema do jogo de paciência de Ulam. O que precisa ser lembrado é que programas de estatística geralmente não possuem uma forma de simular o seu problema, isso torna a programação algo importante para pesquisadores que não desejam ser limitados. O código fonte em R pode ser encontrado no meu repositório de exemplos: https://github.com/dvdscripter/r-snippets.

Correlação significa causalidade?

Essa semana estive na disciplina Spatial Analysis ministrada pela MarieJosée Fortin. Reparei a tendencia em que a alguns duvidas eram sobre como os coeficientes espaciais “roubavam” a explicação das outras variáveis. O momento era de regressões com fatores aleatórios que capturavam o ruido criado pela autocorrelação espacial.

Correlação não significa causalidade! Vamos imaginar que você esta interessado em saber se o motoristas de caminhão são geralmente acima do peso. Logo você realiza sua coleta e quer quantificar essa relação por uma regressão. Você um resultado maravilhoso com inclinação do modelo diferente de zero e conclui que dirigir caminhões deixa as pessoas acima do peso.

Você esta errado mas não fique triste muita gente erra como você. O excesso de peso é causado por N fatores que você pode ter ignorado e estão influenciando o peso dos motoristas. O fato é que a maioria acima do peso possui uma predisposição inata e combinada com falta de exercícios e alimentação não balanceada causa o aumento do peso.

Quando você fez a regressão imagino um mundo perfeito onde A -> B (A causa B), mas o mundo não é perfeito e A&C -> B (A e C causam B) é bem possível. Se você não é capaz de controlar todos os fatores que afetam seu experimento é incorreto afirmar causa em uma correlação. É por isso que experimentos controlados em laboratório são tão valorizados, isolamento de fatores permite inferir causa. Existe um cenário ainda pior e possível tanto A como C são influenciados por um outro fator Z que causa o aumento de B. Neste caso você pode estar simplesmente trabalhando com um uma variável que serve de via de acesso (proxy).

Isso não invalida suas regressões, apenas muda suas conclusões. Correlações são mais fáceis de serem executas e dão grande poder preditivo dado que os fatores se repitam. Então para os ecólogos de plantão: sim, a abundancia de suas plantas pode ser correlacionada apenas com uma variável que tenta capturar o espaço em vez da qualidade do solo.

O que significa um índice de dissimilaridade ser simétrico ou assimétrico?

Requisito para entender a postagem:

  • saber o que são índices de dissimilaridade

Vamos começar pelos casos especiais, os índices assimétricos.

Digamos que você está interessado em saber como algumas espécies de aranhas estão se distribuindo e estabelecendo ao longo de um fragmento. Você realizou coleta de suas três espécies em suas cinco parcelas e obteve a seguinte tabela depois de tabular os dados.

Vamos interpretar algumas coisas fáceis de observa na tabela acima.

Sp 1

Sp 2

Sp 3

Parcela 1

0

15

10

Parcela 2

0

11

16

Parcela 3

1

6

3

Parcela 4

5

19

15

Parcela 5

13

14

8

O que significa uma espécie ocorrer em dois locais diferentes?

Vocês vão me dizer que pode significar muitas coisas mas o que temos alguma confiança para responder é que. Ambas as parcelas ofereceram condições e/ou recursos mínimos para que a espécie ocorresse.

E no caso oposto? Ausência em dois locais diferentes?

Também pode ter múltiplos significados mas nesse caso a nossa confiança em arriscar um motivo caiu drasticamente. De acordo com a teoria do nicho ecológico de Hutchinson, o nicho é N-dimensional mas cada dimensão provavelmente é unimodal. Ser unimodal significa que temos apenas um ponto no intervalo do gradiente como sendo considerado ótimo.

Então sempre que houver um zero em minha tabela a espécie  estará fora do intervalo ótimo?

Infelizmente não é tão simples na natureza o significado do zero. Além da possibilidade de significar que a espécie está fora do seu intervalo de nicho que permite sua ocorrência, também pode significar que indivíduos não conseguiram chegar ao local, que seu método de amostragem falhou nessa parcela devido a topografia, etc. Então não temos confiança do que realmente significa os dois zeros na tabela. Na literatura esse problema é conhecido como double-zeros. Legendre & Legendre 1998 afirma que não devemos tirar nenhuma conclusão quando isso ocorre. Para resolver esse problema foram criadas versões dos índices de similaridade que tratam os double-zeros de forma diferenciada (geralmente ignorando eles), conhecidos como índices assimétricos. Este problema só existe em casos onde a origem de zeros é incerta (abundância e ocorrência de espécies), em todos os outros casos você não precisa se preocupar com eles.

Atualizando tudo

Olá meus leitores anônimos,

Eu não gosto de vocês.

Estou sem postar a algum tempo devido a enorme preguiça e o trabalho de conclusão de curso. Agora tenho um Bacharel em Ciências Biológicas e estou feliz com isso! Agora entrei em uma nova fase da minha vida acadêmica…Mestrando em Ecologia no INPA (Instituto Nacional de Pesquisas da Amazônia). Fiz a prova sem muita esperança e estudo pois tinha acabado de entregar o TCC (Trabalho de Conclusão de Curso). Quando olhei os resultados e estava com meu nome já achei uma grande vitória, algum tempo depois a Coordenadora da Ecologia me envia um e-mail dizendo que a vaga era minha caso tivesse interesse. Obviamente pirei muito com a noticia e hoje estou aqui em Manaus lhes escrevendo. Nesse intervalo também quase virei socio do meu irmão no ramo da fotografia http://www.segredosdafotografia.com/

Enfim, já fiz a maioria das matérias obrigatórias do programa e estou adorando os desafios de tentar dominar tudo isso. Já comecei a incluir algumas coisas interessantes no meus modelos bayesianos como a temida auto-correlação espacial. Existem vários livros dedicados ao assunto e irei explicar o motivo das preocupações disso na pesquisa.

Deu preguiça novamente de escrever uma revisão de literatura. Mas a auto-correlação pode ser imaginada como algo que influencia a independência dos seus dados. Por que as amostras deveriam ser independentes? Oh meu jovem padawan, como vai analisar seu dados com uma estatística que tem como pressuposto fundamental independência das amostras?

Mas como atingar essa independência no campo? A regra que deve ser memorizada sem pensar muito é: amostras distantes umas das outras. Mas com tudo depende da escala isso pode acabar adicionando mais problemas. Exemplo disso são os trabalhos de Biogeografia onde a coleta em enormes escalas pode incluir diversos ambientes e consequemente variações ambientais que podem literalmente FUDER a analise.

Agora imagine que você não precisa mais se preocupar com isso e fazer a coleta divertida (pegar tudo sem se preocupar com independência) como os museus fazem! Isso não seria ótimo?! Já tem gente fazendo isso, o exemplo mais simples que pude encontrar é de Sberze et al 2010. Originalmente seriam apenas três amostras como o editor apontou. Mas como a modelagem bayesiana facilita as coisas e nos evita fazer uma matemática pesada, eles apenas tiveram que se preocupar como quantificar a influencia dos pontos vizinhos no atual. Assim a amostragem aumentou de três pra mais de 20 amostras analisáveis.

Então fica a mensagem: modela a sua dependência devido a preguiça/custo de coleta e seja feliz como os pesquisadores ricos e com muitos escravos! Em breve postarei um modelo que estou desenvolvendo.

Até anônimos.