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 [2022/10/30 05:05] – [Extras] 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:// | ||