Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
| — | 03_apostila:08-simulacao [2020/10/04 23:49] (atual) – criada - edição externa 127.0.0.1 | ||
|---|---|---|---|
| Linha 1: | Linha 1: | ||
| + | <WRAP tabs> | ||
| + | * [[03_apostila: | ||
| + | * [[02_tutoriais: | ||
| + | * [[01_curso_atual: | ||
| + | </ | ||
| + | ====== 8. Reamostragem e Simulação ====== | ||
| + | |||
| + | O R é uma ferramenta poderosa para simular situações e compará-las com padrões observados. O assunto é extenso, e aqui apresentaremos apenas exemplos simples das modalidades mais usadas dem ecologia. Para quem quiser se se aprofundar, um bom começo é Manly (1997 ((Manly B. F. J., 1997 Randomization, | ||
| + | |||
| + | ===== A Função '' | ||
| + | Esta função reamostra os elementos de um vetor: | ||
| + | <code rsplus> | ||
| + | > meu.vetor | ||
| + | [1] " | ||
| + | > meu.vetor.bagunçado <- sample(meu.vetor) | ||
| + | > meu.vetor.bagunçado | ||
| + | [1] " | ||
| + | </ | ||
| + | |||
| + | Por //default// a função retorna um novo vetor de mesmo comprimento, | ||
| + | |||
| + | ==== Exercícios ==== | ||
| + | |||
| + | <box left | // | ||
| + | Você pode simular sorteios das loterias com a função sample. Consulte a ajuda da função para descobrir como simular um sorteio como o feito para o jogo da sena. | ||
| + | </ | ||
| + | |||
| + | ===== Reamostragens sem Reposição: | ||
| + | Nesse procedimentos apenas " | ||
| + | |||
| + | |||
| + | ==== Testes de Permutação ==== | ||
| + | Uma das aplicações simples das permutações ao acaso são testes de comparação de médias entre grupos, como o teste t, como mostramos abaixo. | ||
| + | |||
| + | Os dados que usaremos são numero de besouros no conteúdo estomacal de lagartos // | ||
| + | |||
| + | <code rsplus> | ||
| + | > lagartos <- data.frame(sexo=factor(rep(c(" | ||
| + | + ncoleop=c(256, | ||
| + | + | ||
| + | </ | ||
| + | |||
| + | Uma análise exploratória dos dados mostra que as médias amostrais são muito diferentes, mas as variâncias também, e a variação é muito grande, devido ao grande número de animais sem sinais de besouros no estômago: | ||
| + | |||
| + | <code rsplus> | ||
| + | > tapply(lagartos$ncoleop, | ||
| + | $f | ||
| + | Min. 1st Qu. Median | ||
| + | 0.0 | ||
| + | |||
| + | $m | ||
| + | Min. 1st Qu. Median | ||
| + | | ||
| + | |||
| + | ##Médias | ||
| + | > medias <- tapply(lagartos$ncoleop, | ||
| + | > medias | ||
| + | f m | ||
| + | 170.57143 | ||
| + | ## | ||
| + | > dif.obs <- abs( diff( as.vector(medias) ) ) | ||
| + | > dif.obs | ||
| + | [1] 108.3631 | ||
| + | |||
| + | ## | ||
| + | > tapply(lagartos$ncoleop, | ||
| + | f m | ||
| + | 43533.557 | ||
| + | </ | ||
| + | |||
| + | Os gráficos de quantis téoricos indicam um forte desvio em relação à distribuição normal: | ||
| + | |||
| + | <box center orange 70%> | ||
| + | <box center orange 70%> | ||
| + | |||
| + | Como os dados não atendem as premissas de um teste t, uma alternativa é substituí-lo por um teste de permutação. Como a hipótese nula é que as duas amostras vêm de populações com a mesma média, ela pode ser simulada permutando-se ao acaso os valores entre os sexos. | ||
| + | |||
| + | Calculamos então um índice de diferenças entre as médias das amostras que deve ser similar ao obtido, caso a hipótese nula esteja correta. Repetindo esse procedimento milhares de vezes, podemos estimar a chance de um valor igual ou maior que o observado ter ocorrido mesmo se as duas amostras vêm de populações com médias diferentes. | ||
| + | |||
| + | A permutação é feita com a função '' | ||
| + | |||
| + | <code rsplus> | ||
| + | > ##cria um vetor para armazenar os resultados | ||
| + | > results <- c() | ||
| + | > ##Permuta os valores das medidas, calcula a diferença absoluta entre as médias e | ||
| + | > ##armazena no vetor " | ||
| + | > for(i in 1:1000){ | ||
| + | + results[i] <- abs( diff( tapply(sample(lagartos$ncoleop), | ||
| + | + } | ||
| + | </ | ||
| + | |||
| + | Em apenas 15 das mil permutações a diferença absoluta das médias foi igual ou maior do que a observada: | ||
| + | <code rsplus> | ||
| + | > sum(results >= dif.obs) | ||
| + | [1] 15 | ||
| + | </ | ||
| + | |||
| + | Logo, a diferença observada é pouco provável sob a hipótese nula, o que nos permite rejeitá-la. Um gráfico de densidade probabilística dos valores das permutações ilustra isso: | ||
| + | <code rsplus> | ||
| + | > plot(density(results), | ||
| + | > abline(v = dif.obs, col=" | ||
| + | |||
| + | </ | ||
| + | |||
| + | <box orange center 100% > | ||
| + | |||
| + | ==== Modelos Nulos em Ecologia de Comunidades ==== | ||
| + | |||
| + | Modelos nulos em ecologia de comunidades ((ver GOTELLI, N. J. & G. R. GRAVES. 1996. Null models in ecology. Washington and London, Smithsonian Institution Press)) muitas vezes envolvem permutação de elementos de uma matriz, em geral de ocorrência ou abundância de espécies por local. | ||
| + | |||
| + | Vamos imaginar uma dessas matrizes, com seis espécies (linhas) e seis locais (colunas): | ||
| + | |||
| + | <code rsplus> | ||
| + | > cc2 | ||
| + | [,1] [,2] [,3] [,4] [,5] [,6] | ||
| + | sp1 1 1 0 0 0 0 | ||
| + | sp2 1 1 1 0 0 0 | ||
| + | sp3 0 0 1 1 0 0 | ||
| + | sp4 0 0 1 1 1 0 | ||
| + | sp5 0 0 0 0 1 1 | ||
| + | sp6 0 0 0 0 1 1 | ||
| + | > #Numero de especies por local | ||
| + | > S.obs <- apply(cc2, | ||
| + | > S.obs | ||
| + | [1] 2 2 3 2 3 2 | ||
| + | > ##Maximo de especies em coexistencia | ||
| + | > max(S.obs) | ||
| + | [1] 3 | ||
| + | </ | ||
| + | |||
| + | Podemos nos perguntar se há um limite ao número de espécies que podem coexistir. Se isso ocorre, o número máximo de espécies em co-ocorrência deve ser menor do que se distribuirmos as espécies ao acaso pelos locais. Há vários cenários nulos possíveis, mas ficaremos aqui com permutação dos locais em cada espécie ocorreu. | ||
| + | |||
| + | Para isso, basta permutar os valores dentro de cada linha: | ||
| + | |||
| + | <code rsplus> | ||
| + | > apply(cc2, | ||
| + | sp1 sp2 sp3 sp4 sp5 sp6 | ||
| + | [1,] | ||
| + | [2,] | ||
| + | [3,] | ||
| + | [4,] | ||
| + | [5,] | ||
| + | [6,] | ||
| + | </ | ||
| + | |||
| + | Ops! a função '' | ||
| + | |||
| + | <code rsplus> | ||
| + | > t(apply(cc2, | ||
| + | [,1] [,2] [,3] [,4] [,5] [,6] | ||
| + | sp1 0 1 0 0 1 0 | ||
| + | sp2 1 1 0 0 1 0 | ||
| + | sp3 0 1 0 1 0 0 | ||
| + | sp4 0 1 0 0 1 1 | ||
| + | sp5 1 0 0 0 0 1 | ||
| + | sp6 1 0 1 0 0 0 | ||
| + | </ | ||
| + | |||
| + | Agora basta repetir essa permutação muitas vezes e calcular o número máximo de espécies em co-ocorrência. Para esse cálculo, podemos criar uma função: | ||
| + | |||
| + | <code rsplus> | ||
| + | > ##Uma funcao para calcular o maximo de especies em co-ocorrencia | ||
| + | > max.c <- function(x){ max(apply(x, | ||
| + | > max.coc <- max.c(cc2) | ||
| + | > max.coc | ||
| + | [1] 3 | ||
| + | </ | ||
| + | |||
| + | E então repetimos as permutações 1000 vezes, inserindo-as em um //loop//: | ||
| + | |||
| + | <code rsplus> | ||
| + | ##Um vetor para guardar os resultados | ||
| + | > results <- c() | ||
| + | ## Mil simulações em um loop | ||
| + | > for(i in 1:1000){ | ||
| + | + | ||
| + | + } | ||
| + | </ | ||
| + | |||
| + | O número de randomizações que teve um máximo de espécies por local menor ou igual ao observado foi alto (21,6%), portanto a observação de que no máximo três espécies ocorrem no mesmo local não é evidência de que haja um limite a esse número: | ||
| + | |||
| + | <code rsplus> | ||
| + | > sum(result.c< | ||
| + | [1] 216 | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Reamostragem com Reposição: | ||
| + | |||
| + | Como a maioria das boas idéias, o conceito geral do bootstrap é muito simples: | ||
| + | <box center 80% orange> | ||
| + | //Se aceitamos que nossa amostra é a melhor informação disponível que temos sobre uma população estatística, | ||
| + | </ | ||
| + | |||
| + | |||
| + | A aplicação mais simples deste princípio é estimar intervalos de confiança por reamostragem. Para exemplificar, | ||
| + | |||
| + | <code rsplus> | ||
| + | ##Esse objeto de dados está no pacote " | ||
| + | > data(BCI, package=" | ||
| + | ##Visão de três linhas e três colunas | ||
| + | > BCI[1: | ||
| + | Brosimum.guianense Calophyllum.longifolium Casearia.aculeata Casearia.arborea | ||
| + | 1 0 | ||
| + | 2 0 | ||
| + | 3 0 | ||
| + | </ | ||
| + | |||
| + | Vamos criar uma função para calcular o índice de Shannon a partir de um vetor de abundâncias de espécies, e aplicar a cada parcela: | ||
| + | <code rsplus> | ||
| + | > H <- function(x){ | ||
| + | + y <- x[x>0] | ||
| + | + pi <- y/sum(y) | ||
| + | + | ||
| + | + } | ||
| + | > H.BCI <- apply(BCI, | ||
| + | </ | ||
| + | |||
| + | O vetor H.BCI contém os índices de Shannon de cada parcela de 1 ha. Sua distribuição não parece ser normal: | ||
| + | <code rsplus> | ||
| + | > hist(H.BCI, | ||
| + | > qqnorm(H.BCI); | ||
| + | </ | ||
| + | |||
| + | <box center orange 100%> | ||
| + | |||
| + | |||
| + | Vamos simular uma amostra deste conjuntos de parcelas, e estimar o intervalo de confiança da diversidade média por parcela: | ||
| + | <code rsplus> | ||
| + | > ##Uma amostra ao acaso de 20 parcelas | ||
| + | > bci.sample <- BCI[sample(1: | ||
| + | |||
| + | > ## | ||
| + | > t.test(H.am) | ||
| + | |||
| + | One Sample t-test | ||
| + | |||
| + | data: H.am | ||
| + | t = 114.8506, df = 19, p-value < 2.2e-16 | ||
| + | alternative hypothesis: true mean is not equal to 0 | ||
| + | 95 percent confidence interval: | ||
| + | | ||
| + | sample estimates: | ||
| + | mean of x | ||
| + | | ||
| + | </ | ||
| + | |||
| + | A função '' | ||
| + | |||
| + | No caso, esse intervalo não inclui o zero, o que rejeita a hipótese nula. Mas o que interessa aqui é que o intervalo inclui a média da população de parcelas de onde veio a amostra, que é : | ||
| + | |||
| + | <code rsplus> | ||
| + | > mean(H.BCI) | ||
| + | [1] 3.82084 | ||
| + | </ | ||
| + | |||
| + | Se a amostra vem de uma população de valores com distribuição normal, o intervalo deve incluir a média da população em 95% das vezes que uma amostragem for realizada ((Obs: é um erro comum pensar que o intervalo de confiança é fixo, e a média tem 95% de chance de estar dentro dele. Na verdade, a média populacional é fixa, pois é um parâmetro. O intervalo varia a cada vez que você repetir a amostragem, sendo uma // | ||
| + | |||
| + | Como a premissa de normalidade parece não ser verdadeira, uma solução é calcular um intervalo por // | ||
| + | |||
| + | <code rsplus> | ||
| + | ##Um vetor para armazenar os resultados | ||
| + | > results <- c() | ||
| + | ## | ||
| + | > for(i in 1:1000){ results[i] <- mean( sample(H.am, | ||
| + | </ | ||
| + | |||
| + | A diferença entre a média da amostra original e a média das aleatorizações estima o viés, no caso muito pequeno: | ||
| + | <code rsplus> | ||
| + | > mean(results) | ||
| + | [1] 3.853739 | ||
| + | > mean(H.am) - mean(results) | ||
| + | [1] -5.396726e-05 | ||
| + | </ | ||
| + | |||
| + | O intervalo de confiança por quantis a 95% está compreendida entre o valor abaixo do qual há apenas 2,5% das randomizaçôes e o valor acima do qual restam apenas 2,5% das randomizações. Portanto, são os quantis a 2,5% e 97,5% dos mil valores simulados. Usamos a função '' | ||
| + | |||
| + | <code rsplus> | ||
| + | > quantile(results, | ||
| + | 2.5% 97.5% | ||
| + | 3.788261 3.912513 | ||
| + | </ | ||
| + | |||
| + | No caso, não houve diferença importante entre os intervalos de confiança estimados por // | ||
| + | |||
| + | ===== Simulações com Distribuições Teóricas ===== | ||
| + | O R gera valores amostrados de distribuições teóricas de probabilidades (ver [[.: | ||
| + | |||
| + | Um delas é avaliar a eficácia de um procedimento, | ||
| + | |||
| + | Para ilustrar a forma dessas distribuições, | ||
| + | |||
| + | <code rsplus> | ||
| + | > x <- 0:25 | ||
| + | > y1 <- dnbinom(x, | ||
| + | > y2 <- dnbinom(x, | ||
| + | > plot(y1~x, type=" | ||
| + | + ylim=c(0, | ||
| + | > points(y2~x, | ||
| + | > legend(8, | ||
| + | + col=c(" | ||
| + | </ | ||
| + | |||
| + | <box orange center 100%> | ||
| + | |||
| + | As premissas do teste t são que as amostras vêm de populações com distribuições normais que têm variâncias iguais (pelo menos aproximadamente). A distribuição binomial negativa tem uma forma muito diferente da normal, e nela a variância é uma função da média. Assim, duas distribuições binomiais negativas com médias diferentes, como as ilustradas acima, terão variâncias diferentes. Além disso, a distribuição binomial negativa é **discreta**, | ||
| + | |||
| + | Em resumo, usar o teste t para comparar as médias de amostras tomadas de populações com distribuição binomial negativa implica em desconsiderar as premissas do teste, o que pode comprometer sua força. Mas como avaliar isso? Podemos simular amostras tomadas de populações com distribuição binomial negativa com médias diferentes, aplicar o teste t e contar o número de simulações em que o teste indicou uma diferença significativa entre as médias, a 5%. | ||
| + | |||
| + | Para simular a comparação de duas amostras de tamanho dez, usando um //loop// temos: | ||
| + | |||
| + | <code rsplus> | ||
| + | > ##Um vetor fator com 20 elementos, para representar cada elemento das duas amostras | ||
| + | > tratamento <- factor(x=rep(c(" | ||
| + | > ##Um vetor para armazenar os resultados da simulação | ||
| + | > results <- c() | ||
| + | > ##Dez mil simulações, | ||
| + | > for(i in 1:10000){ | ||
| + | + | ||
| + | + | ||
| + | + } | ||
| + | > ##Quantas das simulações indicaram uma diferença significativa das médias? | ||
| + | > sum(results< | ||
| + | [1] 1148 | ||
| + | </ | ||
| + | |||
| + | O teste detectou corretamente que as amostras vêm de populações com médias diferentes em 1148 das dez mil simulações, | ||
| + | |||
| + | Vamos agora avaliar o que acontece se tomamos amostras de populações com distribuição normal, mantendo as mesmas variâncias: | ||
| + | <code rsplus> | ||
| + | > for(i in 1:10000){ | ||
| + | + variaveis <- c(rnorm(n=10, | ||
| + | + | ||
| + | + results[i] <- t.test(variaveis~tratamento)$p.value | ||
| + | + } | ||
| + | > sum(results< | ||
| + | [1] 1389 | ||
| + | </ | ||
| + | |||
| + | Como poderíamos esperar, a força estimada foi maior, pois uma das premissas do teste agora é satisfeita. No entanto, a premissa de igualdade de variâncias ainda não é cumprida. Se simulamos amostras com variâncias iguais à média das duas variâncias usadas nas simulações anteriores, temos um ganho na força do teste, embora pequeno: | ||
| + | |||
| + | <code rsplus> | ||
| + | > ## Desvio-padrão médio correspondente às variâncias de 7,5 e 4 | ||
| + | > sd1 <- mean(sqrt(c(7.5, | ||
| + | > ## Verificando o valor | ||
| + | > sd1 | ||
| + | [1] 2.369306 | ||
| + | > for(i in 1:10000){ | ||
| + | + variaveis <- c(rnorm(n=10, | ||
| + | + | ||
| + | + results[i] <- t.test(variaveis~tratamento)$p.value | ||
| + | + } | ||
| + | > sum(results< | ||
| + | [1] 1419 | ||
| + | </ | ||
| + | |||
| + | Mesmo nesta situação ideal com todas as premissas cumpridas, em apenas 14% das tentativas o teste detectará a diferença que existe entre as populações. Isto acontece pelo pequeno tamanho amostral. As simulações podem prosseguir para avaliar o efeito de diferentes tamanhos amostrais. | ||
| + | |||
| + | |||
| + | ==== Exercícios ==== | ||
| + | |||
| + | <box left 100% | // | ||
| + | Descubra que simulação é feita com código abaixo: | ||
| + | <code rsplus> | ||
| + | |||
| + | > m1 <- matrix(data=rnbinom(n=10000, | ||
| + | > m2 <- matrix(data=rnbinom(n=10000, | ||
| + | > matrizona <- rbind(m1, | ||
| + | > tratamento <- factor(x=rep(c(" | ||
| + | > signif.t <- function(valores, | ||
| + | > sum(apply(X=matrizona, | ||
| + | |||
| + | </ | ||
| + | </ | ||