Feeds:
Posts
Comentários

Algumas pessoas andaram me perguntando o que eu acho de alguma dessas linguagens e irei dar minha opinião como programador e como professor visando a parte acadêmica.

Como programador: a melhor das listadas acima é de longe Julia, linguagem recente que talvez ninguém tenha ouvido falar mas com velocidade de processamento impressionante. Na imagem abaixo mostra a comparação de várias linguagens executando algum algoritmo intensivo em relação a linguagem mais rápida do momento, C.

velocidades

Julia não é a linguagem mais fácil de programar mas faz bem o que promete, ter velocidade superior ao R e já possuir suporte completo a processamento paralelo. Se você for fazer uma modelagem séria e souber programar de verdade (fazer gráfico não é programar!) a escolha fica entre Fortran, Go, C e o Java. Eu ficaria com Go, suporte a paralelismo e tão fácil de programar quanto R.

Como professor: Python é de longe a melhor para aprender devido as boas praticas que ensina. Lembra aquele código bizarro que fez a um mês e parece uma bíblia na tela de tão mal formatado que saiu? Nem roda no Python! Repare que não é a maravilha das velocidades mas para os alunos que no máximo vão fazer um índice nem se nota a diferença. E ainda temos o plus que Python é usado em muitos programas bacanas (ArcGIS, Quantum GIS), então você pode estender a capacidade desses programas para as suas necessidades.

Conclusão

Python para ensinar/iniciantes em programação, Julia para pessoas com dois anos ativos de experiência no Python e finalmente Go/Fortran para quem se sente confortável com mais de duas linguagens de programação. Já no nível guru você vai querer dar uma olhadinha na linguagem C, boa sorte manipulando a memoria manualmente!

Não gosto de R, feia e lenta. A única coisa que me agrada é a comunidade que é muito mais amigável do que de todas as outras linguagens que trabalhei. Em três dias você consegue publicar um pacote no CRAN, nas outras linguagens pode levar seis meses ou nunca :D

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.

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.

Como alguns devem saber eu presto consultoria usando exclusivamente o R. Com isso você acaba criando algumas funções próprias. Em uma consultoria que posso acabar vindo a prestar para uma empresa terei que utilizar alguns cálculos comuns em inventários florestais. Observando as opções de software no momento percebi que constituem uma caixa preta para modificações e verificações dos algoritmos usados. Então resolvi implementar algumas dessas funções no R e disponibilizar o pacote criado para qualquer pessoa.

O pacote se chama FI (forest inventory) e implementa três métodos de cubagem rigorosa assim como os fatores de empilhamento e forma. As funções estão muito bem documentadas e possui até uma planilha de exemplo (instale o pacote e digita ?FI ou ?volume no console do R). Para as pessoas que entendem um pouquinho mais de R ou querem reportar um bug também existe a página de desenvolvimento do pacote, onde podem verificar as últimas modificações realizadas assim como criar um issue informando um bug.

Em um futuro não muito distante deve ser criado uma extensão do pacote FI que acomodo o ajuste dos modelos volumétricos comumente usados. São modelos gerais (utilizando DAP e altura das árvores) e locais (somente DAP), no total resultando em 19 equações.

Devo alguns agradecimentos acadêmicos pelo conhecimento que adquiri utilizando o R. Bruno Spacek Godoy em meu último ano de graduação me introduziu o R e a inferência Bayesiana. A partir desse ponto minha curiosidade por ambas as áreas cresceu bastante e sinto que sem esse chute eu não teria despertado a curiosidade por conta própria. Obrigado Bruno, sei que perdeu muito do seu precioso tempo se esforçando para me fazer entender um novo mundo naquela época.

Atualmente tento virar um guRu na linguagem R aprendendo os três sistema de classes disponíveis (S3, S4 e R5), isso permitira a criação de pacotes realmente grandes como o famoso vegan usado por muitos ecólogos.

Parâmetros são características que usamos para descrever algo. Essa é a resposta curta e que não é focada apenas em estatística. Já a estatística é um pouquinho maior, então pegue um xícara de café e senta que lá vem muita informação nova se você não é de ler sobre estatística.

Muitos de vocês devem conhecer a distribuição Normal. Ela é caracterizada por média e desvio padrão, ambas são parâmetros da mesma. O que significa eu conhecer os parâmetros da distribuição que estou trabalhando? Significa que alguém como eu pode recriar a sua distribuição de forma teórica no R. Outras pessoas podem conhecer características dos seus dados coletados mesmo sem você transmitir uma tabela completa com eles.

Existem outras distribuições e outros parâmetros para cada uma delas. A distribuição Poisson por exemplo possui apenas um parâmetro chamado lambda. Abaixo um gráfico demonstrando como a forma da distribuição Poisson varia de acordo com o parâmetro lambda usado.

Distribuição Poisson. Diversas formas variando apenas um parâmetro.

A distribuição Beta possui ainda mais formas possíveis quando se transmite parâmetros (alfa e beta) diferentes.

Distribuição Beta. Com dois parâmetros (alfa e beta) ainda mais formas possíveis.

Parâmetros também são usados para descrever equações como a função linear usada na regressão simples:

F. linear

onde x é a variável e a e b são parâmetros que desejamos estimar.

E finalmente no sentido mais formal dos professores de estatística. Parâmetros são características que descrevem uma população de números.

Também existem as diferenças entre testes paramétricos e não paramétricos, parâmetros na inferência clássica (frequentista) e Bayesiana. Mas tudo isso vai ficar para outra postagem.

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.

Bom eu iria fazer um video disso mas como minha voz fica (ou ela é) horrível acho melhor tentar escrever.  Reparei que uma grande quantidade de pessoas não consegue entender os perigos de se trabalhar com máxima verossimilhança. Eu não irei explicar o que é como funciona de forma formal as inferências baseadas em máxima verossimilhança, mas irei dar um exemplo prático de como alguns desses algoritmos funcionam.

A maioria dos ecólogos não são bons programadores e não gostam/querem aprender como os softwares de estatística que usam durante suas analises pode apresentar um resultado incorreto se não conseguem entender como o processo ocorre. Os algoritmos que usam máxima verossimilhança tem como objetivo encontrar o parâmetro que maximiza a verossimilhança para o dado conjunto de dados.

Vamos ver um gráfico:

Distribuição normal padrão, média zero e desvio padrão um.

O algoritmo faz o produto das verossimilhanças com diversos parâmetros até encontrar um valor que melhor se ajusta aos dados.  Vamos supor que estamos interessados em saber qual a média e o desvio padrão de uma amostra retirada de uma população fictícia. Essa população segue a distribuição normal padrão e vamos retirar uma amostra de 100 elementos. O script usado pode ser encontrado aqui.

Os gráficos abaixo mostram o resultado satisfatório do método:

Linha solida representa a distribuição real e a linha tracejada a distribuição prevista pelas amostras utilizando o método de máxima verossimilhança.

Mudança dos parâmetros (média e desvio padrão) em relação ao número de iterações do algoritmo. As linhas tracejadas representam os valores reais dos parâmetros.

Podemos ver que o método funciona relativamente bem nesse caso. Na vida real não temos certeza das distribuições que governam a população. Isso sempre é motivo de discussão já que estamos expressando nossa ignorância sobre algum fenômeno de forma arbitraria em algum nível. Aqui pode começar todo o problema…podemos acabar escolhendo distribuições a priori que não adequadas para o problema ou o dado real pode ser uma mistura delas. Abaixo um exemplo de como pode ficar difícil realizar uma inferência com dados um pouco mais complexos.

Vamos supor que a distribuição dos dados é uma combinação de distribuições normais. O meu algoritmo faz o possível para conseguir ajustar os parâmetros a toda nova variação.

 

O pico da distribuição prevista agora é justamente em um “vale” na distribuição real. Para solucionar isso é necessário adicionar mais parâmetros no modelo, aumentando assim sua dimensionalidade e complexibilidade. Devo assumir que meu algoritmo é apenas uma implementação simples, porém é um ótimo exemplo de como podemos acabar fazendo inferências de forma incorreta. É importante fazer uma inspeção visual dos dados primeiro antes de rodar qualquer analise. Um simples histograma já demonstraria o comportamento dos dados e a necessidade de um modelador/estatístico acostumado a trabalhar com distribuições ia ser requisitada.

Outros cuidados importantes são os parâmetros iniciais. Deve verificar como a distribuição se comporta modificando os parâmetros iniciais de forma aleatória. Caso todas as soluções apresentem a tendência de convergir para o mesmo valor sua simulação ocorreu de forma apropriada. Se ocorrer o contrario provavelmente você ficou preso em um local optima. O local optima é um ponto no espaço de parâmetros onde aparentemente você encontrou a verossimilhança máxima e o algoritmo assume que deve parar. Porém como o nome sugere é apenas um pico local, não é o maior pico possível de ser encontrado. Geralmente é um problema comum de problemas com muitas dimensões (grande número de parâmetros) e algoritmos não reativos/self-tuning. Devido ao tamanho desse post irei deixar para o próximo a explicação com exemplos.

Resumo: max L é bom mas tem que ter um bom conhecimento do assunto para usar de forma correta, métodos complexos não fazem mágica. O que deve ter de coisa errada nesse post não é brincadeira :D

Próximo post local optima ou lei dos grandes numeros e teorema do limite central (tenho um ǵrafico perfeito pra explicar isso).

Cya

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

Junte-se a 225 outros seguidores