Traduções desta página:

Ferramentas do usuário

Ferramentas do site


05_curso_antigo:alunos:trabalho_final:daniel

Daniel Caetano

Daniel

Mestrando em Ecologia, Instituto de Biociências, USP.

Laboratory of Arthropod Behavior and Evolution

Curriculo Lattes

Atualmente desenvolvendo projeto que visa reconstruir as relações de parentesco entre as subfamílias de Gonyleptidae (Arachnida, Opiliones) utilizando somente caracteres de origem ecológica e comportamental.1)

Orientador: Glauco Machado

Proposta

Conflitos e Recursos

beetle_fighting.jpg

Conflitos entre indivíduos de uma mesma população são presentes quando algum tipo de recurso é escasso, não pode ser dividido ou é vantajoso de alguma forma ter acesso exclusivo ao tal recurso. No entanto, nem sempre é vantajoso entrar em um conflito, já que a habilidade de vencer apresenta variação entre os indivíduos da população, ou seja, o rival em um conflito pode ou não ter maior probabilidade de vencer.

Geralmente, antes de um conflito ser iniciado, ocorre algum tipo de “ritual” onde os indivíduos tentam convencer que são mais fortes (i.e. aptos a vencer) e avaliar os oponentes. Sendo assim, espera-se que os indivíduos envolvidos em um conflito tenham atributos de magnitudes parecidas, ou seja, sejam aproximadamente do mesmo tamanho, tenham vocalizações de altura comparável e etc. Este tipo de raciocínio também pode ser estendido para outras relações sociais como a escolha da qualidade de território em animais que fazem defesa ativa do território.

O objetivo deste projeto é o desenvolvimento de uma função na linguagem R que possibilite a análise de observações de conflitos através de um índice que identifique a assimetria dos envolvidos. Com isso será possível verificar se a assimetria verificada é muito diferente da média observada na população (a partir de pares criados aleatoriamente com indivíduos da população). Em caso positivo, este é um indício que os indivíduos escolhem com quem entrar em um conflito.

Adicionalmente, o usuário poderá alimentar a função com os dados dos resultados dos conflitos. Deste modo, a função fará testes comparando a distribuição da assimetria dos vencedores em relação aos perdedores com a assimetria de pares gerados aleatoriamente com os dados da população estudada.

Comentários

Ale: Acho uma idéia incrível! Resta saber se é viável no tempo que temos. Vejo duas tarefas simultaneas sendo produzida. Uma é para produzir um índice de assimetria, a outra é para testar hipótese de que a semelhança nas medidas está relacionada ao conflito. Já pensou como será o formato de entrada dos dados? Pense nisso, no índice e no tipo de análise e poste para podermos ter uma visão melhor da viabilidade.

Procedimentos

A entrada dos dados será feita através de uma matriz com os pares observados, um vetor com o resultado dos conflitos (vetor lógico) e com um vetor contendo as medidas do atributo estudado na população (incluindo os indivíduos observados). O resultado dos conflitos deverá ser padronizado para se referir a uma das colunas da matriz (i.e.: 0 para os conflitos vencidos pelos indivíduos da coluna 2 e 1 para os conflitos vencidos pelos da coluna 1). O indíce de assimetria entre os competidores será feito através da subtração das medidas dos envolvidos (por exemplo: tamanho de chifre A - chifre B = assimetria entre o tamanho dos chifres).

Em uma segunda etapa, o valor deste índice será comparado com a média da população, através da formação de pares aleatórios oriundos de animais medidos na população (que brigaram e que não brigaram). Gerando uma distribuição de frequências de médias de índices de assimetria podemos verificar a probabilidade dos pares observados na natureza terem serem feitos ao acaso. Uma probabilidade significativamente baixa nos indicará que os pares não estão sendo feitos ao acaso, mas sim devido a algum critério de seleção.

Comentário II

OK! Manda ver!

Página de Ajuda

assort                package:nenhum                R Documentation

Análise de interações agonísticas entre indíviduos através de gráficos e testes com simulações.

Description:

Verifica se os indivíduos escolhem seus rivais em conflitos de forma aleatória ou exercem
algum tipo de escolha. Produz correlação entre o tamanho dos indivíduos vencedores dos
conflitos e a assimetria em relação aos perdedores. Comparação entre a assimetria dos
vencedores observada e gerada através de simulação com os dados da população. A função possuí
argumento 'mean' que posibilita trabalhar com a média das observações ou com cada observação
isoladamente (análise gráfica somente).

Usage:

assort(par , pop , win=NULL , sim=2000 , mean=TRUE)

Arguments:

par: Matriz ou 'data.frame'. DUAS COLUNAS com o valor dos atributos usados nas interações.
Indivíduos que interagiram estão na MESMA LINHA.

pop: Vetor numérico, matriz ou 'data.frame'. Valor do atributo dos indivíduos da população.
Matriz ou 'data.frame' somente com UMA COLUNA.

win: Vetor lógico. Valor 0 quando o indíviduo da coluna 2 for o vencedor e valor 1 quando o
indivíduo da coluna 1 for o vencedor. NA quando o resultado do conflito não foi observado.

sim: Valor numérico. Número de simulações.

mean: TRUE ou FALSE. Quando 'mean'=TRUE as análises são feitas considerando o valor médio das
observações, do contrário considera-se as observações separadamente.

Details:

Quando o argumento 'win=NULL' a função faz a média das assimetrias entre as colunas 1 e 2,
uma simulação de médias de assimetria entre o mesmo número de pares que o presente no objeto
de 'par'.

Quando o argumento 'win=NULL' e 'mean=FALSE' a função calcula a assimetria de cada par entre
as colunas 1 e 2, uma simulação de assimetrias de 'sim' pares formados aleatóriamente com os
indivíduos da população.

Quando o argumento 'win' for alimentado (ver Arguments, acima) a função calcula a média das
assimetrias dos ganhadores em relação aos perdedores (ganhador - perdedor), faz simulações de
médias de assimetrias sendo os pares gerados ao acaso com indivíduos da população e o
resultado do conflito decidido ao acaso.

Quando o argumento 'win' for alimentado (ver Arguments, acima) e o argumento 'mean=FALSE' a
função calcula a assimetria dos ganhadores de cada par em relação aos perdedores (ganhador -
perdedor), faz simulações de assimetrias de ganhadores em relação a perdedores (para 'sim'
pares) sendo os pares e o resultado dos conflitos gerados aleatoriamente.

OBS: Para cada simulação o sorteio é sem reposição, sorteio com reposição entre as simulações.

Value:

Quando o argumento 'win=NULL' gera um histograma com a frequência das assimetrias geradas
pela simulação. A linha no histograma é a posição da média das assimetrias do objeto de
'par'. Devolve a médias das assimetrias observadas e simuladas, além de uma tabela com a
probabilidade de observações menores ou maiores que a média das observações com pares feitos
ao acaso.

Quando o argumento 'win=NULL' e 'mean=FALSE' gera um histograma com a frequência das
assimetrias geradas pela simulação e linhas coloridas que correspondem às assimetrias dos
pares observados.

Quando o argumento 'win' for alimentado (ver Arguments, acima) gera um gráfico com a
correlação entre as assimetrias e o tamanho dos ganhadores, um histograma com a distribuição
das médias das assimetrias dos ganhadores gerados pela simulação e a linha vertical que
representa a média das assimetrias dos ganhadores observados e um boxplot com o tamanho dos
perdedores e dos ganhadores. A função retorna a probabilidade de uma assimetria ser gerada ao
acaso com valores menores e maiores do que a média observada.

Quando o argumento 'win' for alimentado (ver Arguments, acima) e o argumento 'mean=FALSE'
gera um gráfico com a correlação entre assimetria e tamanho dos ganhadores, um histograma com
a frequencia das assimetrias geradas ao acaso e linhas coloridas com os valores das
assimetrias de cada observação e um boxplot com o tamanho dos ganhadores e perdedores
observados.

Warning:

Se o objeto de pop não for 'matrix', 'data.frame', 'numeric' ou 'integer' a função devolve
mensagem de erro.
Se 'mean' diferente de TRUE ou FALSE a função devolve mensagem de erro.
Se 'sim' maior que 20000 a função retorna mensgame de erro.

Author(s):

Caetano, Daniel Silva
Aluno de mestrado do Departamento de Ecologia, Instituto de Biociências, Universidade de São
Paulo, Brasil.
caetanods1@gmail.com

References:

http://ecologia.ib.usp.br/bie5782/doku.php

See Also:

'for' para fazer ciclos de simulações.
'if' e 'else' para a definição de condições.
'plot', 'hist' e 'boxplot' para os gráficos.

Examples:

## Lembre-se de carregar a função antes de rodar o exemplo!

## Criando dados
total <- rnorm(700,41,11)
grupo1 <- c(35.75,45.01,47.05,47.48,47.69,49.33,50.42,50.86,52.47,53.35,53.03,57.02,57.21)
grupo2 <- c(30.45,47.33,47.69,44.89,53.03,40.98,52.68,53.79,46.62,51.87,52.15,50.45,55.48)
briga <- c(1,0,0,1,0,1,0,0,1,NA,NA,1,1)
dados <- matrix(c(grupo1,grupo2),ncol=2,nrow=length(grupo1))

## Analise de escolha:
assort(dados,total)

## Analise de escolha por interação:
assort(dados,total,mean=FALSE)

## Analise de assimetria de ganhadores:
assort(dados,total,briga)

## Analise de assimetria de ganhadores por individuo:
assort(dados,total,briga,mean=FALSE)

Código da Função

assort <- function(par,pop,win=NULL,sim=2000,mean=TRUE)
  {
    ## Funcao utilizada para analise de interacoes agonisticas. Faz uso de medicoes de caracteristicas utilizadas nos conflitos e do resultado destes conflitos. Ausencia de acentuacao evita o problema de incompatibilidade dos codigos entre usuarios de Linux e Windows.
    ## Qualquer semelhanca entre as mensagens de erro e a realidade sao pura conincidencia.
    ## Autor: Daniel Caetano da Silva, 01/04/2009, Trabalho final da disciplina de pos-graduacao do Departamento de Ecologia (IB - USP): BIE5782 Uso da Linguagem R para Analise de Dados Ecologicos.
    ## Agradecimentos: Gostaria de agradecer primeiramente aos professores Alexandre Adalardo e Paulo Inacio pela possibilidade de entrar em contato com esta nova abordagem da estatistica e aprender os primeiros passos de algo que com certeza vai me levar a algum lugar. A Camila Zatz e Glauco Machado pelas ideias e problema a ser resolvido. Aos alunos do curso pela companhia, especialmente Leda (pelo Loop louco), Maria (pela matriz-nao-tao-complicada) e Marie ("Calma... Pense Pink!"). 

    if(class(pop)=="data.frame"|class(pop)=="matrix")
      {
        pop <- pop[,1]
      }

    if(class(pop)!="data.frame"&class(pop)!="matrix"&class(pop)!="numeric"&class(pop)!="integer")
      {
        erros <- c("Não entendo o argumento pop.","Argumento pop deve ser numeric, data.frame ou matrix.","Veja o argumento pop no help.")
        mens <- sample(erros,1)
        return(mens)
      }

    if(sim >= 20000)
      {
        erros <- c("Muitas simulacoes!!","Se o computador pifar, nao me culpe depois!!","Deve estar de brincadeira... Mais de 20000 ?","Isso... abusa mesmo do processador... O.ô")
        mens <- sample(erros,1)
        return(mens)
      }        

    if(class(win)=="NULL")
      {
        dif <- abs(par[,1]-par[,2])
        medif <- mean(dif)
        slen <- 2*length(par[,1])
        medsim <- (rep(NA,sim))

        if(mean==TRUE)
          {
            for(i in 1:sim)
              {
                sorteio <- sample(pop,slen)
                pars <- matrix(sorteio,ncol=2,nrow=slen/2)
                medsim[i] <- mean(abs(pars[,1]-pars[,2]))
              }

            freq.big <- sum(medsim>=medif)
            prob.big <- freq.big/sim
            freq.small <- sum(medsim<=medif)
            prob.small <- freq.small/sim
            resultado <- matrix(c(prob.small,prob.big),nrow=1,ncol=2)
            names <- list("prob",c("Menores","Maiores"))
            dimnames(resultado) <- names

            x11
            hist(medsim,xlim=c(0,max(medsim)+5),main=NULL,ylab="Frequencia",xlab="Media das diferencas\n(Linha = Observado, Barras = Simulado)")
            abline(v=medif, col="red")
            cat(c("Media das diferencas observadas:",round(medif,digits=1),"\n","Media das diferecas simuladas:",round(mean(medsim),digits=1),"\n"))
            invisible(medsim)
            return(resultado)
          }

        if(mean==FALSE)
          {
            difpars <- (rep(NA,sim))
            for(w in 1:sim)
              {
                sorteio2 <- sample(pop,2)
                difpars[w] <- abs(sorteio2[1]-sorteio2[2])
              }
            
            x11
           hist(difpars,xlim=c(0,max(difpars)+5),main=NULL,ylab="Frequencia",xlab="Assimetria absoluta\n(Barras = Simulado, Linhas = Observado)")
           abline(v=dif,col=c(1:length(dif)))
            
           invisible(difpars)
          }
        else
          {
            erros <- c("O argumento mean deve ser TRUE ou FALSE.","Nao entendo o argumento mean","Use FALSE se quiser analisar graficamente usando as observacoes dos individuos","Use TRUE se quiser analisar usando as medias das assimetrias")
            mens <- sample(erros,1)
            return(mens)
          }
      }

    else
      {
        tab1 <- matrix(c(par[,1],par[,2],win),ncol=3,nrow=length(par[,1]))
        tab2 <- tab1[is.na(tab1[,3])==FALSE,]
        tab3 <- tab2[tab2[,3]==1,]
        tab4 <- tab2[tab2[,3]==0,]
        winsize <- c(tab3[,1],tab4[,2])
        losesize <- c(tab3[,2],tab4[,1])
        dif1 <- tab3[,1]-tab3[,2]
        dif2 <- tab4[,2]-tab4[,1]
        difwin <- c(dif1,dif2)
        medwin <- mean(difwin)

        slen <- 2*length(winsize)
        winsim <- (rep(NA,sim))

        if(mean==TRUE)
          {
            for(i in 1:sim)
              {
                sorteio <- sample(pop,slen)
                pars <- matrix(sorteio,ncol=2,nrow=slen/2)
                winsim[i] <- mean(pars[,1]-pars[,2])
              }

            freq.big <- sum(winsim>=medwin)
            prob.big <- freq.big/sim
            freq.small <- sum(winsim<=medwin)
            prob.small <- freq.small/sim
            resultado <- matrix(c(prob.small,prob.big),nrow=1,ncol=2)
            names <- list("prob",c("Menores","Maiores"))
            dimnames(resultado) <- names
         
            x11
            par(mfrow=c(2,2))
            plot(difwin~winsize,ylab="Assimetria dos vencedores",xlab="Tamanho dos vencedores")
            abline(lm(difwin~winsize),col="blue")
            hist(winsim,main=NULL,ylab="Frequencia",xlab="Media da assimetria\ndos vencedores")
            abline(v=medwin, col="blue")
            boxplot(winsize,losesize,main=NULL,names=c("Vencedores","Perdedores"))
            
            cat(c("Media da assimetria observada nos vencedores:",round(medwin,digits=3),"\n","Media da assimetria dos vencedores simulada:",round(mean(winsim),digits=3),"\n"))
            return(resultado)
          }
        
        if(mean==FALSE)
          {
            
            winsim <- rep(NA,sim)
             for(z in 1:sim)
              {
                sorteio <- sample(pop,2)
                winsim[z] <- sorteio[1]-sorteio[2]
              }
            
            x11
            par(mfrow=c(2,2))
            plot(difwin~winsize,ylab="Assimetria dos vencedores",xlab="Tamanho dos vencedores")
            abline(lm(difwin~winsize),col="green")
            hist(winsim,main=NULL,ylab="Frequencia",xlab="Assimetria dos vencedores por individuo\n(Linhas = Observados, Barras = Simulados)")
            abline(v=difwin, col=1:length(difwin))
            boxplot(winsize,losesize,main=NULL,names=c("Vencedores","Perdedores"))
          }
        else
          {
            erros <- c("O argumento mean deve ser TRUE ou FALSE.","Nao entendo o argumento mean","Use FALSE se quiser analisar graficamente usando as observacoes dos individuos","Use TRUE se quiser analisar usando as medias das assimetrias")
            mens <- sample(erros,1)
            return(mens)
          }
      }               
 }

Arquivo da Função

1)
NOTA: Sim… Aparentemente eu não vou usar o R no meu projeto. No entanto, este programa é demais!!
05_curso_antigo/alunos/trabalho_final/daniel.txt · Última modificação: 2020/08/12 06:04 (edição externa)