04-parametros-constantes:04-parametros-constantes
Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
| Ambos lados da revisão anteriorRevisão anteriorPróxima revisão | Revisão anterior | ||
| 04-parametros-constantes:04-parametros-constantes [2020/11/27 12:27] – paulo | 04-parametros-constantes:04-parametros-constantes [2024/11/11 13:24] (atual) – paulo | ||
|---|---|---|---|
| Linha 1: | Linha 1: | ||
| + | < | ||
| + | <script src=" | ||
| + | <script src=" | ||
| + | < | ||
| + | sagecell.makeSagecell({inputLocation: | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ====== 4. Modelos com Parâmetros Constantes ====== | ||
| + | |||
| + | Na seção anterior vimos que a função de verossimilhança liga nossos dados a modelos probabilísticos. Nesta unidade veremos como podemos usar a função de verossimilhança para encontrar os parâmetros de uma distribuição de probabilidade que melhor descreve os dados. Em outras palavras, vamos ajustar distribuições de probabilidade a conjuntos de dados. Estes são os modelos estatísticos mais simples. | ||
| + | \\ | ||
| + | |||
| + | |||
| + | ====== Conceitos ====== | ||
| + | * Distribuições de Probabilidade como Modelos | ||
| + | * Parâmetros e estimativas de máxima verossimilhança | ||
| + | * Ajuste por soluções analíticas de MLEs | ||
| + | * Ajuste por soluções numéricas de MLEs | ||
| + | * Diagnóstico de ajustes | ||
| + | * Comparação de ajustes | ||
| + | |||
| + | |||
| + | ====== Tutoriais ====== | ||
| + | |||
| + | ===== Distribuição Geométrica: | ||
| + | |||
| + | A distribuição geométrica é um modelo simples de ser ajustado a dados porque há uma expressão para o [[03-funcao-veros: | ||
| + | |||
| + | $$\widehat p \ = \ \frac{N}{N+\sum x_i}$$ | ||
| + | |||
| + | Onde $N$ é o total de observações e $\sum x_i$ é a soma dos valores observados. | ||
| + | |||
| + | Como chegamos a isso? Neste caso por meio de manipulações matemáticas. Quando isso nos leva a uma expressão de funções matemáticas conhecidas dizemos que temos uma **solução analítica** ((Isso é bem raro, em geral apenas para casos simples.)). | ||
| + | |||
| + | Para ter uma ideia mais concreta deste processo, vamos refazer passo a passo a dedução analítica do mle da geométrica, | ||
| + | |||
| + | 1. Em Python, usando um Jupyter notebook, com a interface online Google Colab: [[https:// | ||
| + | |||
| + | 2 . Executar os comandos nesta página mesmo, usando o software [[http:// | ||
| + | |||
| + | ==== Usando o Maxima === | ||
| + | Nas caixas abaixo há comandos do Maxima que são executados por um servidor remoto. Para enviar cada comando clique no botão **Evaluate** (( Você pode também instalar o Maxima em seu computador e executar estes comandos a partir deste arquivo: {{: | ||
| + | |||
| + | ===A função de log-verossimilhança === | ||
| + | |||
| + | O comando abaixo cria um objeto simbólico da função de densidade da geométrica. | ||
| + | |||
| + | |||
| + | < | ||
| + | <div class=" | ||
| + | P: | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Ao executar você terá de volta apenas a expressão, o que significa que ela pode ser manipulada no Maxima. Demos à expressão o nome '' | ||
| + | |||
| + | |||
| + | < | ||
| + | <div class=" | ||
| + | lP:log(P); | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | e então distribuímos os logaritmos ((lembre-se que $\log(xy)=\log x+\log y$ e que $\log x^a = a \log x$)): | ||
| + | |||
| + | < | ||
| + | <div class=" | ||
| + | lP2: lP, logexpand=super; | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | A log-verossimilhança é a soma da expressão acima aplicada para cada dado $x_i$: | ||
| + | |||
| + | < | ||
| + | <div class=" | ||
| + | LL:sum(lP2, i, 1, N); | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | O que é a representação no Maxima para | ||
| + | |||
| + | $$\sum_{i=1}^{N}\ \log p+x_i\,\log (1-p) $$ | ||
| + | |||
| + | Como a somatória é apenas em $x_i$, os outros termos são tratados como constantes. Com isso a somatória restringe-se ao termo $\sum x_i$, que chamamos de $S$. O comando a seguir faz esta substituição de termos: | ||
| + | |||
| + | < | ||
| + | <div class=" | ||
| + | LL:LL, simpsum=true; | ||
| + | LL:subst(S, sum(x[i], | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | O resultado é a representação no Maxima da subsitutição de $\sum x_i$ por $S$ na expressão acima, que fica então: | ||
| + | |||
| + | $$N \log p\ +\ S\,\log (1-p) $$ | ||
| + | |||
| + | |||
| + | === Solução de máxima verossimilhança === | ||
| + | |||
| + | O MLE $\widehat p$ é o valor do parâmetro $p$ que minimiza a função de log-verossimilhança. | ||
| + | O truque para encontrar isso é achar o valor de $p$ | ||
| + | que faz a derivada da função ser igual a zero. Primeiro encontramos a derivada em relação a $p$ da expressão simbólica '' | ||
| + | |||
| + | < | ||
| + | <div class=" | ||
| + | dLL: diff(LL,p); | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | e finalmente igualamos esta expressão a zero e resolvemos para $p$: | ||
| + | |||
| + | < | ||
| + | <div class=" | ||
| + | solve(dLL=0, | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | === Extras === | ||
| + | Veja mais notebooks de deduções analíticas de MLEs [[.:# | ||
| + | |||
| + | ===== Ajuste da Geométrica ===== | ||
| + | |||
| + | Ajustar uma distribuição a dados consiste em encontrar os valores mais plausíveis dos parâmetros da distribuição escolhida, condicionados aos dados. Ou seja, obter o valor do MLEs. Isso é simples quando há uma solução analítica de seus MLEs. Basta aplicar a expressão desta solução, que é uma função de quantidades obtidas dos dados. Mas além disso temos que analisar o comportamento da função de verossimilhança na vizinhança do MLE. | ||
| + | |||
| + | Vamos fazer isso ajustando a distribuição geométrica a dados de sobrevivência de aves [[http:// | ||
| + | |||
| + | Comece importando os dados para um objeto no R: | ||
| + | <code rsplus> | ||
| + | (vanellus <- read.csv2(" | ||
| + | </ | ||
| + | |||
| + | Note que o //data frame// tem cada valor de número de anos sobrevividos após a anilhagem e o número de aves que viveu até cada um. | ||
| + | |||
| + | Agora vamos calcular o valor do MLE da geométrica para estes dados, usando sua expressão analítica(( $$\widehat p \ = \ \frac{N}{N+\sum x_i}$$, veja [[04-parametros-constantes: | ||
| + | |||
| + | <code rsplus> | ||
| + | (n <- sum(vanellus$freq)) #total de observações | ||
| + | (soma.x <- sum(vanellus$tempo*vanellus$freq)) #soma dos tempos | ||
| + | (p <- n / (n+soma.x)) #mle | ||
| + | </ | ||
| + | |||
| + | Para facilitar a construção do gráfico da curva de verossimilhança, | ||
| + | |||
| + | <code rsplus> | ||
| + | nllgeom <- function(p, n, sx, rel=FALSE, p.mle){ | ||
| + | nll = -n*log(p) - log(1-p) * sx | ||
| + | if(rel) | ||
| + | nll = nll - nllgeom(p.mle, | ||
| + | nll | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Com essa função é fácil criar um gráfico com a curva de verossimilhança e traçar o intervalo de | ||
| + | verossimilhança (razão de 8). Basta usá-la para calcular a verossimilhança para uma sequência de valores do parâmetro $p$, em torno do valor do MLE: | ||
| + | |||
| + | <code rsplus> | ||
| + | curve(nllgeom(x, | ||
| + | col=" | ||
| + | ylab=" | ||
| + | abline(v=p, col=" | ||
| + | </ | ||
| + | |||
| + | A linha vertical marca o MLE. Para delimitar o intervalo de verossimilhança, | ||
| + | |||
| + | <code rsplus> | ||
| + | abline(h=log(8), | ||
| + | </ | ||
| + | |||
| + | Agora que você conhece a distribuição geométrica mais plausível para este conjunto de dados você pode comparar o que ela prevê com o que você observou. Isto é um maneira de avaliar a qualidade do ajuste, | ||
| + | |||
| + | <code rsplus> | ||
| + | plot(freq~tempo, | ||
| + | | ||
| + | x <- 0: | ||
| + | points(x, dgeom(x, p)*n, col=" | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Ajuste numérico da Weibull ===== | ||
| + | |||
| + | Soluções analíticas são muito raras, e não existem para muitos MLEs, Por exemplo, não é possível obter solução analítica para as MLEs dos parâmetros da distribuição Weibull. Nesses casos usamos aproximações numéricas, em geral com ajuda de computadores ((veja o [[03-funcao-veros: | ||
| + | |||
| + | Vamos usar dados de DAP de árvores de floresta de Paragominas, | ||
| + | <code rsplus> | ||
| + | ##Leitura dos dados | ||
| + | parag<- read.table(" | ||
| + | # Seleciona daps > 25 | ||
| + | dap = parag$dap[ parag$dap > 25 ] | ||
| + | par(mfrow=c(1, | ||
| + | hist(dap, xlim=c(0, | ||
| + | </ | ||
| + | |||
| + | Para evitarmos o problema do **parâmetro de locação** da Weibull, vamos trabalhar como se o DAP de 25cm fosse o ponto inicial (zero): | ||
| + | <code rsplus> | ||
| + | dap0 = dap - 25 | ||
| + | hist(dap0, xlim=c(0, | ||
| + | par(mfrow=c(1, | ||
| + | </ | ||
| + | |||
| + | Para ajustarmos a dist. Weibull é necessário construir a função de log-verossimilhança negativa no R: | ||
| + | <code rsplus> | ||
| + | nllweibull = function(escala, | ||
| + | -sum(dweibull(x =dap0, shape=forma, | ||
| + | </ | ||
| + | |||
| + | Obtemos o ajuste com a função ' | ||
| + | <code rsplus> | ||
| + | parag.wei = mle2(nllweibull, | ||
| + | </ | ||
| + | |||
| + | Se quisermos olhar a superfície de log-verossimilhança negativa é necessário // | ||
| + | <code rsplus> | ||
| + | nllweibull.V = Vectorize( nllweibull, c(" | ||
| + | </ | ||
| + | |||
| + | Com a função vetorizada podemos construir um gráfico de linhas de contorno: | ||
| + | <code rsplus> | ||
| + | dx = seq(11,16, length=50) | ||
| + | dy = seq(0.8, 1.1, length=50) | ||
| + | z = outer( dx, dy, " | ||
| + | z <- z-min(z)# verossimilhança padronizada | ||
| + | contour(dx, dy, z, xlab=" | ||
| + | contour(dx, dy, z, levels=2, col=" | ||
| + | abline(v=coef(parag.wei)[1], | ||
| + | abline(h=coef(parag.wei)[2], | ||
| + | </ | ||
| + | |||
| + | As curvas de verossimilhança perfilhada são obtidas **// | ||
| + | <code rsplus> | ||
| + | parag.wei.prof = profile(parag.wei) | ||
| + | par(mfrow=c(1, | ||
| + | plotprofmle(parag.wei.prof) | ||
| + | par(mfrow=c(1, | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Ajuste numérico da Poisson e binomial negativa ===== | ||
| + | |||
| + | Também não há solução analítica para o parâmetro de disperão da binomial negativa. Neste tutorial comparamos os ajustes da binomial negativa e da Poisson((cujo mle tem solução analítica)) a dados de contagens. | ||
| + | |||
| + | Vamos retomar os tutoriais sobre [[01-discretas: | ||
| + | |||
| + | <code rsplus> | ||
| + | set.seed(42) | ||
| + | cx <- runif(20, | ||
| + | cy <- runif(20, | ||
| + | px <- rnorm(2000) | ||
| + | py <- rnorm(2000) | ||
| + | x1 <- cx+px | ||
| + | y1 <- cy+py | ||
| + | x2 <- x1[x1> | ||
| + | y2 <- y1[x1> | ||
| + | x2.parc <- cut(x2, | ||
| + | y2.parc <- cut(y2, | ||
| + | </ | ||
| + | |||
| + | O numero de plantas por parcela é obtido com: | ||
| + | |||
| + | <code rsplus> | ||
| + | cont2 <- data.frame(table(x2.parc, | ||
| + | </ | ||
| + | |||
| + | A avaliação visual feita no [[[[01-discretas: | ||
| + | |||
| + | Primeiro definimos funções de log-verossimilhança negativa para cada modelo: | ||
| + | |||
| + | <code rsplus> | ||
| + | LL.pois <- function(lam){ | ||
| + | -sum(dpois(cont2, | ||
| + | } | ||
| + | |||
| + | LL.nbin <- function(media, | ||
| + | -sum(dnbinom(cont2, | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Em seguida minimizamos numericamente essas funções com o R ((veja o [[03-funcao-veros: | ||
| + | <code rsplus> | ||
| + | library(bbmle) # basta uma vez por seção | ||
| + | mod1 <- mle2(LL.pois, | ||
| + | mod2 <- mle2(LL.nbin, | ||
| + | </ | ||
| + | |||
| + | Como esperado, a binomial negativa é um modelo muito mais plausível: | ||
| + | |||
| + | <code rsplus> | ||
| + | > logLik(mod1) | ||
| + | 'log Lik.' -1786.502 (df=1) | ||
| + | > logLik(mod2) | ||
| + | 'log Lik.' -1014.969 (df=2) | ||
| + | </ | ||
| + | |||
| + | Você pode obter um resumo dos modelo com o comando '' | ||
| + | <code rsplus> | ||
| + | summary(mod1) | ||
| + | summary(mod2) | ||
| + | </ | ||
| + | |||
| + | E podemos fazer um gráfico dos valores previsto pelos dois modelos com: | ||
| + | |||
| + | <code rsplus> | ||
| + | ##MLEs de cada modelo | ||
| + | (cf1 <- coef(mod1)) | ||
| + | (cf2 <- coef(mod2)) | ||
| + | |||
| + | ##grafico | ||
| + | cont2.f <- factor(cont2, | ||
| + | plot(table(cont2.f)/ | ||
| + | points(x=0: | ||
| + | points(x=0: | ||
| + | |||
| + | </ | ||
| + | |||
| + | Por fim, avalie o perfil de verossimilhança dos dois parâmetros da binomial negativa ((para isto você vai precisar da função [[http:// | ||
| + | |||
| + | <code rsplus> | ||
| + | library(sads) | ||
| + | p.mod2 <- profile(mod2) | ||
| + | par(mfrow=c(1, | ||
| + | plotprofmle(p.mod2) | ||
| + | par(mfrow=c(1, | ||
| + | </ | ||
| + | |||
| + | ===== Gráficos quantil-quantil ===== | ||
| + | |||
| + | Como avaliar o ajuste de uma distribuição de probabilidade aos nossos dados? O gráfico quantil-quantil (ou qqplot) oferece um critério simples: os quantis empíricos e previstos pelo modelo de distribuição devem ser iguais. | ||
| + | |||
| + | O padrão esperado são pontos ao longo da linha de equivalência (1:1) em um gráfico de dispersão dos quantis observados em função dos teóricos. Como somos capazes de perceber desvios pequenos em relação a retas, este critério visual é mais sensível do que muitos testes estatísticos de aderência. | ||
| + | |||
| + | Apesar da regra de decisão simples, a maneira de construir o qqplot é menos intuitiva. Neste tutorial vamos refazê-la passo a passo, para fins didáticos ((No dia a dia você pode usar funções do R que já fazem tudo isso automaticamente)). | ||
| + | |||
| + | Para começar vamos perguntar ao R quais são os **quantis empíricos**, | ||
| + | |||
| + | Vamos usar os objetos criados no tutorial anterior de ajuste de contagens à Poisson e binomial negativa. Começamos calculando os decis dos dados, que são os quantis que delimitam cada décimo do total de valores. | ||
| + | |||
| + | <code rsplus> | ||
| + | (qqs <- data.frame(decis =seq(.1, | ||
| + | ## Quantis observados | ||
| + | qqs$q.obs <- quantile(cont2, | ||
| + | qqs | ||
| + | </ | ||
| + | |||
| + | Agora adicionamos os quantis esperados para os mesmos decis, pelos modelos Poisson e binomial ajustados: | ||
| + | |||
| + | <code rsplus> | ||
| + | qqs$q.pois <- qpois(qqs$decis, | ||
| + | qqs$q.bn <- qnbinom(qqs$decis, | ||
| + | qqs | ||
| + | </ | ||
| + | |||
| + | Qual dos dois modelos faz uma melhor previsão dos decis de 10% a 90%? O gráfico quantil-quantil confronta estes valores: | ||
| + | |||
| + | <code rsplus> | ||
| + | par(mfrow=c(1, | ||
| + | plot(q.obs~q.pois, | ||
| + | | ||
| + | | ||
| + | | ||
| + | abline(0,1, col=" | ||
| + | plot(q.obs~q.bn, | ||
| + | | ||
| + | | ||
| + | | ||
| + | ", | ||
| + | abline(0,1, col=" | ||
| + | par(mfrow=c(1, | ||
| + | </ | ||
| + | |||
| + | Os dados deste tutorial têm 400 observações, | ||
| + | |||
| + | <code rsplus> | ||
| + | ## dados ordenados: | ||
| + | cont3 <- sort(cont2) | ||
| + | ## percentis | ||
| + | cont3.p <- ppoints(cont3) | ||
| + | </ | ||
| + | |||
| + | Em seguida calculamos os quantis esperados por cada modelo | ||
| + | |||
| + | <code rsplus> | ||
| + | ## quantis da poisson associados a cada percentil | ||
| + | cont3.qp <- qpois(cont3.p, | ||
| + | ## quantis da bn associados a cada percentil | ||
| + | cont3.qbn <- qnbinom(cont3.p, | ||
| + | </ | ||
| + | |||
| + | E finalmente fazemos os gráficos | ||
| + | |||
| + | <code rsplus> | ||
| + | par(mfrow=c(1, | ||
| + | plot(cont3.qp, | ||
| + | | ||
| + | | ||
| + | abline(0,1, col=" | ||
| + | plot(cont3.qbn, | ||
| + | | ||
| + | | ||
| + | abline(0,1, col=" | ||
| + | par(mfrow=c(1, | ||
| + | </ | ||
| + | |||
| + | ===CODA=== | ||
| + | |||
| + | Há ainda detalhes técnicos como a maneira de definir os percentis empíricos ou traçar a linha de equivalência. Há muitas funções no R com variações do qqplot. Uma bastante flexível é a [[http:// | ||
| + | |||
| + | <code rsplus> | ||
| + | library(car) | ||
| + | par(mfrow=c(1, | ||
| + | qqPlot(cont2, | ||
| + | | ||
| + | qqPlot(cont2, | ||
| + | | ||
| + | par(mfrow=c(1, | ||
| + | </ | ||
| + | \\ | ||
| + | --------------------- | ||
| + | \\ | ||
| + | |||
| + | ====== Questões motivadoras para discussão ====== | ||
| + | ===1. Dados agregados=== | ||
| + | É possível definir uma função de verossimilhança para dados agregados em intervalos de classe? | ||
| + | ==a) Na prática== | ||
| + | Proponha um código em R para fazer o ajuste de máxima verossimilhança a uma log-normal dos dados abaixo: | ||
| + | |||
| + | ^Classe^Frequência^ | ||
| + | |0--2 | 213| | ||
| + | |2--4 | 52| | ||
| + | |4--6 | 12| | ||
| + | |6--8 | 1| | ||
| + | |8--10 | 1| | ||
| + | |10--12 | 1| | ||
| + | |||
| + | ==b) generalizando== | ||
| + | Definindo: | ||
| + | * $F_i$ : a frequência de observações na classe $i$ | ||
| + | * $a_i$, $b_i$: os limites inferior e superior do intervalo de classe $i$ | ||
| + | * $N$: número de classes | ||
| + | * $f(x)$: uma função de densidade probabilística | ||
| + | |||
| + | Proponha uma expressão genérica para a função de log-verossmilhança de dados agregados em classes. | ||
| + | |||
| + | <wrap hide> | ||
| + | ==Um exemplo em R== | ||
| + | * {{: | ||
| + | </ | ||
| + | |||
| + | ===2. Dados censurados e truncados=== | ||
| + | |||
| + | * Explique e exemplifique o que são dados truncados e censurados. | ||
| + | * Como ajustar um modelo de distribuição a dados truncados e censurados com o método de máxima verossimilhança? | ||
| + | |||
| + | |||
| + | ===3. Dados com excesso de zeros === | ||
| + | * Explique e exemplifique o que são dados de contagens com excesso de zeros | ||
| + | * Como ajustar um modelo de distribuição a dados com excesso de zeros com o método de máxima verossimilhança? | ||
| + | |||
| + | ===4. Binomial com parâmetro p variável=== | ||
| + | |||
| + | Imagine um experimento de predação similar ao descrito no item 6.3.1.1. de Bolker (2008), mas que tenha duas quantidades de girinos: 10 e 100 por tanque. Como ajustar uma distribuição binomial ao número de girinos predados permitindo que a probabilidade de predação dependa do número inicial de girinos no tanque? Outros detalhes sobre o sistema de estudo estão na seção 2.5.2 do livro. | ||
| + | |||
| + | |||
| + | |||
| + | ====== Exercícios ====== | ||
| + | |||
| + | Faça os exercícios desta unidade (204.1 e 204.2) no sistema [[http:// | ||
| + | ====== Recursos para Estudo ====== | ||
| + | |||
| + | ===== Leituras ===== | ||
| + | ==== Principal ==== | ||
| + | * Likelihood and All That, seções 6.1 a 6.2.1.2 do Capítulo 6 de: Bolker, B.M. 2008 Ecological Models and Data in R Princeton: Princeton University Press. | ||
| + | |||
| + | ==== Complementar ==== | ||
| + | * Anderson, D. R. (2008). Model based inference in the life sciences: a primer on evidence. New York, Springer: capítulos 2 e 3. | ||
| + | |||
| + | ===== Na Internet ===== | ||
| + | |||
| + | * Um roteiro de ajuste de modelos na página do [[http:// | ||
| + | * [[http:// | ||
| + | * Excelentes exercícios de simulação e ajustes de distribuições no [[http:// | ||
| + | |||
| + | ====Notebooks de deduções analíticas de MLEs==== | ||
| + | |||
| + | Nossos notebooks | ||
| + | |||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | |||
| + | Ou você pode ver as páginas estáticas dos mesmos códigos, já com os resultados: | ||
| + | |||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | |||
| + | Todos estes notebooks estão no [[https:// | ||
| + | |||
| + | === Distribuições truncadas e censuradas === | ||
| + | * Nadarajah, S., & Kotz, S. (2006). R Programs for Truncated Distributions. [[https:// | ||
| + | * Frederick Novomestky and Saralees Nadarajah (2016). truncdist: Truncated Random Variables. R package [[https:// | ||