AlgorĂ­tmo de Gibbs: Modelo Poisson com prioris (conjugadas) em dois estĂ¡gios

Modelo e expressões

Seja um modelo com estrutura hierĂ¡rquica no qual assume-se a distribuiĂ§Ă£o \(Poisson(\lambda)\) para as observações, priori \(Gamma(a, \beta)\) com \(a\) considerado aqui constante e hiperpriori \(GammaInversa(c, d)\) para \(\beta\). Neste modelo nĂ£o Ă© possĂ­vel amostrar diretamente da posteriori e obter as marginais em forma fechada. Implementar o algoritmo de Gibbs.

\[\begin{align*} Y|\lambda &\sim {\rm Po}(\lambda) \\ \lambda|\beta &\sim {\rm Ga}(a, \beta) \\ \beta &\sim {\rm IGa}(c,d) \end{align*}\]

Neste modelo os parĂ¢metros sĂ£o \(\theta = (\lambda, \beta)^{\prime}\) e \((a, c, d)\) sĂ£o constantes conhecidas/fixadas.

A funĂ§Ă£o de probabilidade para uma observaĂ§Ă£o \(y_i\) Ă© \[f(y; \lambda) = \frac{\exp\{-\lambda\} \lambda^{y_i}}{y_i!}\] e a verossimilhança para as observações, consideradas condicionalmente independentes dado \(\lambda\): \[L(\lambda; y) = \frac{\exp\{-n\lambda\} \lambda^{\sum{y_i}}}{\prod y!}\] As prioris sĂ£o: \[\begin{align*} f(\lambda|\beta) &= \frac{1}{\beta^a \Gamma(a)} \lambda^{a-1} \exp\{-\lambda/\beta\}\\ f(\beta) &= \frac{1}{d^c \Gamma(c)} \beta^{-c-1} \exp\{-1/d\beta\} \end{align*}\]

A posteriori Ă© obtida por \[f(\lambda,\beta|y) = \frac{f(\lambda,\beta,y)}{f(y)} \propto f(\lambda,\beta,y) = f(y|\lambda,\beta)f(\lambda|\beta)f(\beta) = f(y|\lambda)f(\lambda|\beta)f(\beta) \] Na expressĂ£o anterior, a estrutura de independĂªncia condicional do modelo implica que \(f(y|\lambda,\beta) = f(y|\lambda)\).

Tem-se entĂ£o que \[\begin{align*} f(\lambda,\beta|y) &= \frac{\exp\{-n\lambda\} \lambda^{\sum{y_i}}}{\prod y!} \frac{1}{\beta^a \Gamma(a)} \lambda^{a-1} \exp\{-\lambda/\beta\} \frac{1}{d^c \Gamma(c)} \beta^{-c-1} \exp\{-1/d\beta\} \\ &\propto \lambda^{a-1} \lambda^{\sum y_i} \beta^{-a}\beta^{-c-1} \exp\{-n\lambda\}\exp\{-\lambda/\beta\}\exp\{-1/d\beta\} \\ & = \lambda^{a+\sum y_i} \beta^{-(a+c)-1} \exp\{-n\lambda -\frac{\lambda}{\beta} -\frac{1}{d\beta}\} \end{align*}\] Neste exemplo Ă© possĂ­vel obter a posteriori \(f(\lambda,\beta|y)\) analiticamente que pode ser escrita como \[f(\lambda,\beta|y) = f(\lambda|\beta,y) f(\beta|y). \] As marginais sĂ£o obtidas analiticamente integrando-se a conjunta \[\begin{align*} f(\lambda|y) &= \int f(\lambda,\beta|y) {\rm d} \beta \\ \mbox{e} & \\ f(\beta|y) &= \int f(\lambda,\beta|y) {\rm d} \lambda . \end{align*}\] Portanto a inferĂªncia baseada na posteriori Ă© disponĂ­vel e, pode-se amostrar diretamente desta distribuiĂ§Ă£o com os passos: Entretanto, o objetivo aqui Ă© ilustrar a implementaĂ§Ă£o do algoritmo de Gibbs que requer apenas as condicionais completas, que sĂ£o facilmente obtidas conforme a seguir. \[\begin{align*} f(\lambda|y, \beta) & \propto \lambda^{a+(\sum{y_i}) -1} \exp\{-n\lambda -\frac{\lambda}{\beta}\} = \lambda^{a+(\sum{y_i}) -1} \exp\{-\left(\frac{\beta}{n\beta+1}\right)^{-1} \lambda\} \\ [\lambda|y, \beta] &\sim {\rm G}(a+\sum y_i, \frac{\beta}{n\beta + 1}) \\ f(\beta|y, \lambda) &= \beta^{-(a+c)-1} \exp\{-\frac{\lambda}{\beta} -\frac{1}{d\beta}\} = \beta^{-(a+c)-1} \exp\{-\left(\frac{d}{d \lambda + 1}\right)^{-1}\frac{1}{\beta}\}\\ [\beta|y, \lambda] &\sim {\rm IG}(a+c, \frac{d}{d\lambda + 1}) \end{align*}\]

CĂ³digos em R para o Exemplo

Inicialmente vamos definir duas funções auxiliares, uma para densidade da distribuiĂ§Ă£o \(Gama-Inversa(a,b)\) e outra que retorna a esperança e variĂ¢ncia desta distribuiĂ§Ă£o.

dinvgamma <- function(x, shape, scale) dgamma(1/x, shape=shape, scale=scale)/x^2
##
EVIG <- function(a,b){
    E <- ifelse(a > 1, 1/(b * (a-1)), "nĂ£o pode ser calculada para este valor de a")
    V  <- ifelse(a > 2, 1/((b^2) * ((a-1)^2) * (a-2)), "nĂ£o pode ser calculada para este valor de a")
    return(c(E,V))
}
Consideramos neste exemplo \(a=4,5\), \(c=2,2\) e \(d=0,6\). Na prĂ³xima figura pode-se visualizar a priori para \(\beta\). Note que para \(\lambda\) o modelos define apenas a condicional \(\lambda|\beta\) mas pode-se obter a marginal. \[\begin{align*} f(\lambda) &= \int f(\lambda, \beta) {\rm d}\beta = \int f(\lambda|\beta) f(\beta) {\rm d}\beta. \end{align*}\]
par(mar=c(3,3,0,0), mgp=c(2,1,0))
curve(dinvgamma(x, shape=2.2, scale=0.6),
      from=0, to=5, xlab=expression(beta), ylab=expression(f(beta)))

A seguir serĂ¡ simulado um conjunto de dados com 50 observações. Para isto sĂ£o inicialmente fixadas as constantes no modelo. Na sequencia simulam-se valores de \(\beta\) e para cada um deles simula-se um valor de \(\lambda\). Finalmente simula-se, respectivamente, uma observaĂ§Ă£o da variĂ¡vel resposta \(Y\).

set.seed(2018)
ctes <- list(a=4.5, c=2.2, d=0.6, n=50)
with(ctes, EVIG(c, d))
## [1] 1.388889 9.645062
betas <- with(ctes, 1/rgamma(n, shape=c, scale=d))
c(mean(betas),var(betas))
## [1] 1.385987 1.247596
lambdas <- with(ctes, rgamma(n, shape=a, scale=betas))
(ctes$y <- rpois(ctes$n, lambda=lambdas))
##  [1]  5 12  4  1  4  3  0 11  1  5  4  3 14  3  4  7 10  5  3  5  9  2 13
## [24] 18  5  2 10  2  4 11  2  4  3  2 13  6 35  0  3  1 13  2  8  4  1  0
## [47]  0  7  4  4

A seguir temos estatĂ­sticas dscritivas do dados. Notamos que a mĂ©dia Ă© bem inferior Ă  variĂ¢ncia, caracterizando uma sobredispersĂ£o. No grĂ¡fico dos dados (linhas escura) vĂª-se claramente qua a distribuiĂ§Ă£o Poisson (linhas vermelhas) com parĂ¢metro constante nĂ£o se ajusta bem aos dados.

with(ctes, c(media=mean(y), var=var(y)))
##    media      var 
##  5.84000 35.97388
with(ctes, plot(prop.table(table(y)), type="h", ylab="P[Y=y]"))
with(ctes,lines((0:max(y))+0.1, dpois(0:max(y), lambda=mean(y)), type="h", col=2))

Vamos agora implementar um amostrador de Gibbs para obter amostras da posteriori. SerĂ£o tomadas 11.000 simulações.

ctes$sumY <- sum(ctes$y)
N <- 11000
beta.sam <- lambda.sam <- numeric(N) 
beta.sam[1] <- lambda.sam[1] <- 10 ## valores iniciais
{
for(i in 2:N){
    beta.sam[i] <- with(ctes, 1/rgamma(1, shape=a+c, scale=d/(d*lambda.sam[i-1]+1)))
    lambda.sam[i] <- with(ctes, rgamma(1, shape=a+sumY, scale=beta.sam[i]/(n*beta.sam[i]+1)))
}}

A seguir temos a visualizaĂ§Ă£o das cadeias para uma inspeĂ§Ă£o visual inicial.

par(mfrow=c(2,1), mar=c(2.7,2.7,1,1), mgp=c(1.8,0.8,1))
plot(beta.sam, type="l")
plot(lambda.sam, type="l")

Entretanto Ă© preciso atentar para a necessidade de aquecimento (//burn-in//) da cadeia. Ou seja, amostras iniciais podem nĂ£o ser represetnativas da distribuiĂ§Ă£o estacionĂ¡ria. SerĂ£o agora descartadas 1.000 como aquecimento da cadeia (//burn-in//).

AlĂ©m disto iremos tambĂ©m proceder um raleamento (//thining//) armazenando apenas uma a cada dez amostras uma vez que as cedeias geradas tendem a ter muita autocorrelaĂ§Ă£o entre as amostras o que implica em redundĂ¢ncia de informaĂ§Ă£o e uso desnecessĂ¡rio de memĂ³ria.

B <- 1000
beta.sam <- beta.sam[-(1:B)]
lambda.sam <- lambda.sam[-(1:B)]
beta.sam <- beta.sam[seq(1,N-B, by=10)]
lambda.sam <- lambda.sam[seq(1,N-B, by=10)]

OBS: os cĂ³digos acima sĂ£o ineficientes pois nĂ£o seria necessĂ¡rio armazenar as amostras de aquecimento nem as que seriam descartadas no raleamento. Deixamos desta forma simplesmente para ilustrar os procedimentos e refazemos o cĂ³digo sem usar tal armazenamento no final destas notas.

A seguir temos a visualizaĂ§Ă£o das cadeias para uma nova inspeĂ§Ă£o visual.

par(mfrow=c(2,1), mar=c(2.7,2.7,0,0), mgp=c(1.8,0.8,0))
plot(beta.sam, type="l"); lines(lowess(beta.sam), col=2)
plot(lambda.sam, type="l"); lines(lowess(lambda.sam), col=2)

NĂ£o se percebe nenhum problema obvio com as cadeias mas nota-se a posteriori de \(\beta\) parece ter um comportamento assimĂ©trico. Vamos entĂ£o examinar a cadeia para escala logarĂ­tmica.

par(mfrow=c(1,1), mar=c(2.7,2.7,1,1), mgp=c(1.8,0.8,0))
plot(log(beta.sam), type="l"); lines(lowess(log(beta.sam)), col=2)

E vamos tambĂ©m verificar a autocorrelaĂ§Ă£o apĂ³s o raleamento.

par(mfrow=c(1,2), mar=c(2.7,2.7,0,0), mgp=c(1.8,0.8,0))
acf(beta.sam, xlab=expression(beta))
acf(lambda.sam, xlab=expression(lambda))

Estas anĂ¡liss iniciais nĂ£o apontam problemas Ă³bvios e parece que temos uma boa amostra. Entretanto uma anĂ¡lise mais cuidadosa deveria incluir testes de diagnĂ³stico de convergĂªncia, possivelmente com a obtenĂ§Ă£o de nĂ£o apenas uma cadeia. NĂ£o vamos abordar estes testes aqui e seguiremos com a anĂ¡lise a partir da amostra obtida.

A seguir visualiza-se as amostras das distribuições marginais. Os valores indicados nos eixos sĂ£o os gerados na simulaĂ§Ă£o dos dados.

par(mfrow=c(1,2), mar=c(2.7,2.7,0,0), mgp=c(1.8,0.8,0))
plot(density(beta.sam), main=""); rug(betas)
plot(density(lambda.sam), main=""); rug(lambdas)
## Warning in rug(lambdas): some values will be clipped

A seguir visualiza-se as amostras da conjunta com \(\beta\) na escala original e logarĂ­tmica.

par(mfrow=c(1,2), mar=c(2.7,2.7,0,0), mgp=c(1.8,0.8,0))
plot(beta.sam, lambda.sam, pch=19, cex=0.4); rug(betas, side=1); rug(lambdas, side=2)
## Warning in rug(lambdas, side = 2): some values will be clipped
plot(log(beta.sam), lambda.sam, pch=19, cex=0.4); rug(log(betas), side=1); rug(lambdas, side=2)
## Warning in rug(log(betas), side = 1): some values will be clipped

## Warning in rug(log(betas), side = 1): some values will be clipped

Resumos dos dados e das posterioris dos parĂ¢metros.

summary(ctes$y)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.00    2.00    4.00    5.84    7.75   35.00
summary(betas)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.2341  0.7331  1.1373  1.3860  1.5907  5.6039
summary(beta.sam)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.4102  0.9008  1.1640  1.2989  1.5469  6.2081
summary(lambdas)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.1716  2.7200  4.0948  5.8029  6.4230 40.6322
summary(lambda.sam)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   4.634   5.569   5.809   5.814   6.053   6.835
dbetapost <- function(x, a, c, d, soma, n, log=FALSE){
res <- lgamma(a+soma+1) + (a+soma+1)*(log(x)-log(n*x+1))-(a+c+1)*log(x) - 1/(d*x)
if(log) return(res) else return(exp(res))
}
dlambdapost <- function(x, a, c, d, soma, n, log=FALSE){
res <- lgamma(a+c) + (a+c)*(log(d)-log(d*x-1))+(s+soma)*log(x) - n*x
if(log) return(res) else return(exp(res))
}