Avaliando algumas distribuições a priori e a posteriori (Aula Prática 3)
Considere o seguinte modelo observacional: \[\begin{eqnarray} Y_i|\theta &\stackrel{iid}\sim& Bern(\theta), \; i=1, \ldots, n. \end{eqnarray}\]
Vamos gerar então um conjunto de dados deste modelo da seguinte forma:
# Yi|theta ~ Bern(theta)
# gerando uma amostra deste modelo
n = 500 #tamanho da amostra
theta = 0.2 #probabilidade de sucesso da Bernoulli
y = rbinom(n, 1, theta) #gerando n valores da Bernoulli(theta)
Vamos agora avaliar os valores gerados através de um gráfico de barras:
#analisando a amostra de y gerada
par(mfrow=c(1,2))
barplot(table(y))
barplot(table(y)/sum(table(y)))
Agora suponha que \(\theta\) seja desconhecido. A função de verossimilhança é dada pela seguinte expressão: \[\begin{eqnarray} L(\theta; y_1, \ldots, y_n) &=& \prod_{i=1}^n{p(y_i|\theta)},%\\ %&=& \prod_{i=1}^n{\theta^{y_i}(1-\theta)^{1-y_i}}. \end{eqnarray}\] sendo \(p(y_i|\theta)\) a f.d. da distribuição \(Bern(\theta)\).
Então podemos avaliar como se comporta a função da log-verossimilhança nos dados gerados:
# Y1,...,Yn ~ Bern(theta)
# X = Y1+...+Yn ~ Bin(theta)
par(mfrow=c(1,2))
#analisando a log verossimilhança
thetas = seq(0,1,l=1000)
logvero = dbinom(sum(y), n, thetas, log=T)
plot(thetas,logvero, type="l", cex.lab=1.4, cex.axis=1.4,
xlab=expression(theta), bty="n", ylab="log L(theta; y1, ..., yn)")
abline(v=theta,col="red",lwd=2,lty=3) #plotando o valor verdadeiro
#analisando a log verossimilhança - DANDO UM ZOOM PARA VER MELHOR O COMPORTAMENTO DA FUNÇÃO
plot(thetas[which(thetas>0.1 & thetas<0.4)],logvero[which(thetas>0.1 & thetas<0.4)], type="l", cex.lab=1.4, cex.axis=1.4,
xlab=expression(theta), bty="n", ylab="log L(theta; y1, ..., yn)")
abline(v=theta,col="red",lwd=2,lty=3) #plotando o valor verdadeiro
A priori, considere que o parâmetro \(\theta\) tem a seguinte função de distribuição: \[\begin{eqnarray} p(\theta) &=& 0,7 \times I(\theta=0,1) + 0,2 \times I(\theta=0,2) + 0,1 \times I(\theta=0,4), \end{eqnarray}\] sendo \(I(A)\) uma função indicadora que resulta em 1 quando a condição \(A\) é atendida e 0 caso contrário. Podemos representar graficamente esta crença da seguinte forma:
#analisando a distribuição a priori
thetas = c(0.1, 0.2, 0.4)
dist_priori = c(0.7, 0.2, 0.1)
plot(thetas,dist_priori,type="h", cex.lab=1.4, cex.axis=1.4,
xlab=expression(theta), bty="n", ylab="p(theta)")
Uma outra forma de visualizarmos graficamente o comportamento da distribuição a priori é através de um gráfico de barras de uma amostra da distribuição a priori:
#analisando a distribuição a priori através de uma amostra desta distribuição
theta_priori = sample(thetas, 1000, replace=T, prob = dist_priori)
par(mfrow=c(1,2))
barplot(table(theta_priori))
barplot(table(theta_priori)/sum(table(theta_priori)))
Podemos também refazer o gráfico da função da log-verossimilhança considerando somente os 3 possíveis valores para o parâmetro \(\theta\) conforme imposto pela distribuição a priori:
# Y1,...,Yn ~ Bern(theta)
# X = Y1+...+Yn ~ Bin(theta)
#analisando a log verossimilhança
thetas = c(0.1, 0.2, 0.4)
logvero = dbinom(sum(y), n, thetas, log=T)
plot(thetas,logvero,type="h", cex.lab=1.4, cex.axis=1.4,
xlab=expression(theta), bty="n", ylab="log L(theta; y1, ..., yn)")
Dessa forma, temos que a distribuição a posteriori é \[\begin{eqnarray} p\left(\theta\left|x = \sum_{i=1}^n{y_i}\right.\right) &=& c \; 0,1^x 0,9^{n-x} \; 0,7 \; I(\theta=0,1) + \\ && c \; 0,2^x 0,8^{n-x} \; 0,2 \; I(\theta=0,2) + \\ && c \; 0,4^x 0,6^{n-x} \; 0,1 \; I(\theta=0,4). \end{eqnarray}\] E como \(p(\theta=0,1|x) + p(\theta=0,2|x) + p(\theta=0,4|x) = 1\), temos que \[\begin{eqnarray} c &=& \left( 0,1^x 0,9^{n-x} \; 0,7 + 0,2^x 0,8^{n-x} \; 0,2 + 0,4^x 0,6^{n-x} \; 0,1 \right)^{-1}. \end{eqnarray}\]
Logo, a representação gráfica da distribuição a posteriori é
x = sum(y)
dist_post = thetas^x * (1-thetas)^(n-x) * dist_priori
dist_post = dist_post/sum(dist_post)
dist_post
## [1] 9.091279e-09 1.000000e+00 3.536460e-22
plot(thetas,dist_post,type="h", cex.lab=1.4, cex.axis=1.4,
xlab=expression(theta), bty="n", ylab="p(theta|y1, ..., yn)")
Uma outra forma de visualizarmos graficamente o comportamento da distribuição a posteriori é através de um gráfico de barras de uma amostra desta distribuição:
#analisando a distribuição a posteriori através de uma amostra desta distribuição
theta_posteriori = sample(c(0.1, 0.2, 0.4), 1000, replace=T, prob = dist_post)
par(mfrow=c(1,2))
barplot(table(theta_posteriori))
barplot(table(theta_posteriori)/sum(table(theta_posteriori)))
Comparando a função de verossimilhança, com a distribuição a priori com a distribuição a posteriori:
par(mfrow=c(1,3))
plot(thetas,dist_priori,type="h", cex.lab=1.4, cex.axis=1.4,
xlab=expression(theta), bty="n", ylab="p(theta)")
plot(thetas,logvero,type="h", cex.lab=1.4, cex.axis=1.4,
xlab=expression(theta), bty="n", ylab="log L(theta; y1, ..., yn)")
plot(thetas,dist_post,type="h", cex.lab=1.4, cex.axis=1.4,
xlab=expression(theta), bty="n", ylab="p(theta|y1, ..., yn)")
Vimos em aulas passadas que \[\begin{eqnarray} Y_i|\theta &\stackrel{iid}{\sim}& Bern(\theta)\\ \theta &\sim& Beta(a,b)\\ \theta|x = \sum_{i=1}^n{y_i} &\sim& Beta(a + x, b + n - x) \end{eqnarray}\]
Usando o mesmo dado gerado anteriormente, avaliaremos como se comportará a distribuição a posteriori do parãmetro \(\theta\) quando mudamos a crença inicial sobre isso. Usaremos uma distribuição a priori Beta informativa e para isso considere \(a=4\) e \(b=2\).
#criando uma grade de possiveis valores para theta
thetas = seq(0,1,l=1000) #criando uma grade de valores para theta
#fixando os valores dos hiperparâmetros
a = 4
b = 2
#comparando o log da verossimilhança com a distribuição a priori com a distribuição a posteriori
lvero = dbinom(sum(y), n, thetas, log=T) #calculando o log da verossimilhança
dist_priori = dbeta(thetas, a, b) #calculando a distribuição a priori
dist_post = dbeta(thetas, a + sum(y), b + n - sum(y)) #calculando a distribuição a posteriori
u = c(dist_priori, dist_post)
plot(thetas, dist_priori, type="l", bty="n", lwd=2, cex.lab=1.4, cex.axis=1.4,
xlab=expression(theta), ylab="",
ylim=c(min(u), max(u)))
lines(thetas, dist_post, lwd=2, col="red")
lines(thetas, exp(lvero)*10, lwd=2, col="purple") #multipliquei a lvero para melhorar a escala
abline(v=theta,lwd=2, col="blue", lty=3)
O que acontece se agora colocarmos uma distribuição a priori não informativa? Consideraremos 2 distrbuições neste caso:
A distribuição uniforme, que é igual a distribuição Beta com parâmetros \(a=1\) e \(b=1\), para o parâmetro \(\theta\).
A distribuição proposta por Jeffreys que, conforme visto em aula, será uma \(Beta(a=1/2, b=1/2)\).
#análise de sensibilidade do modelo quanto à distribuição a priori
a2 = 1 #hiperparâmetro da distribuição a priori
b2 = 1 #hiperparâmetro da distribuição a priori
#Beta(a=1, b=1) = Unif(0,1) => dist. a priori não informativa
a3 = 1/2 #hiperparâmetro da distribuição a priori
b3 = 1/2 #hiperparâmetro da distribuição a priori
#Beta(a=1/2, b=1/2) => dist. a priori de Jeffreys
dist_priori2 = dbeta(thetas, a2, b2) #calculando a distribuição a priori
dist_post2 = dbeta(thetas, a2 + sum(y), b2 + n - sum(y)) #calculando a distribuição a posteriori
dist_priori3 = dbeta(thetas, a3, b3) #calculando a distribuição a priori
dist_post3 = dbeta(thetas, a3 + sum(y), b3 + n - sum(y)) #calculando a distribuição a posteriori
par(mfrow=c(1,2))
u = c(dist_priori, dist_priori2, dist_priori3)
u[abs(u)==Inf] = NA
plot(thetas, dist_priori, type="l", bty="n", lwd=2, cex.lab=1.4, cex.axis=1.4,
xlab=expression(theta), ylab="p(theta)",
ylim=c(min(u, na.rm=T), max(u, na.rm=T)))
lines(thetas, dist_priori2, lwd=2, col="red")
lines(thetas, dist_priori3, lwd=2, col="purple") #multipliquei a vero para melhorar a escala
abline(v=theta,lwd=2, col="blue", lty=3)
u = c(dist_post, dist_post2, dist_post3)
u[abs(u)==Inf] = NA
plot(thetas, dist_post, type="l", bty="n", lwd=2, cex.lab=1.4, cex.axis=1.4,
xlab=expression(theta), ylab="p(theta|y1,...,yn)",
ylim=c(min(u, na.rm=T), max(u, na.rm=T)))
lines(thetas, dist_post2, lwd=2, col="red")
lines(thetas, dist_post3, lwd=2, col="purple") #multipliquei a vero para melhorar a escala
abline(v=theta,lwd=2, col="blue", lty=3)
Note que mesmo com crenças iniciais tão diferentes, tivemos que as informações sobre o parâmetro baseadas nas distribuições a posteriori são bem semelhantes.
Considere o seguinte modelo observacional: \[\begin{eqnarray} Y_i|\theta, \sigma^2 &\stackrel{iid}\sim& N(\theta, \sigma^2), \; i=1, \ldots, n. \end{eqnarray}\]
Vamos gerar então um conjunto de dados deste modelo e analisar a função log-verossimilhança:
################################# Modelo 3 #############################
# Y|theta, sigma2 ~ N(theta, sigma2)
########################################################################
#gerando uma amostra deste modelo
n = 100 #tamanho da amostra
theta = 10
sigma2 = 1
y = rnorm(n, theta, sqrt(sigma2))
#analisando a amostra de y gerada
hist(y, freq=F, bty="n", ylab="densidade", xlab="y", main="", cex.lab=1.4,
cex.axis=1.4)
#analisando o log da verossimilhança perfilada
thetas = seq(0,20,l=1000) #criando uma grade de valores para theta
lvero = NULL
for(j in 1:length(thetas))
{
lvero[j] = sum( dnorm(y, thetas[j], sqrt(sigma2), log=T) ) #calculando o log da verossimilhança
}
plot(thetas, lvero, type="l", cex.lab=1.4, cex.axis=1.4, lwd=2, bty="n", xlab=expression(theta))
abline(v=theta,lwd=2,col="red",lty=3)
#analisando o log da verossimilhança perfilada
sigma2s = seq(0.1,5,l=1000) #criando uma grade de valores para sigma2
lvero2 = NULL
for(j in 1:length(sigma2s))
{
lvero2[j] = sum( dnorm(y, theta, sqrt(sigma2s[j]), log=T) ) #calculando o log da verossimilhança
}
plot(sigma2s, lvero2, type="l", cex.lab=1.4, cex.axis=1.4, lwd=2, bty="n", xlab=expression(sigma^2))
abline(v=sigma2,lwd=2,col="red",lty=3)
A priori, considere que \[\begin{eqnarray} \theta|\phi=\sigma^{-2} &\sim& N\left(\mu_0, \frac{1}{\phi\; C_0}\right)\\ \phi &\sim& G(a, b) \end{eqnarray}\]
Vimos, em sala de aula, que esta distribuição é conjugada com o modelo observacional normal. Podemos gerar uma amostra desta distribuição para avaliá-la, da seguinte forma:
################################# Modelo 3 #############################
# Y|theta, sigma2 ~ N(theta, sigma2)
# theta|phi=1/sigma2 ~ N(mu0, 1/(phi*C0))
# phi ~ G(a, b)
########################################################################
mu0 = 7 #hiperparâmetro da distribuição a priori
C0 = 1 #hiperparâmetro da distribuição a priori
a = 5 #hiperparâmetro da distribuição a priori
b = 2 #hiperparâmetro da distribuição a priori
# theta|phi=1/sigma2 ~ N(mu0, 1/(phi*C0))
# phi ~ G(a, b)
np = 1000
phi_pr = rgamma(np, a,b)
thetas_pr = rnorm(np, mu0, sqrt(1/(phi_pr*C0)))
par(mfrow=c(1,2))
hist(thetas_pr, freq=F, bty="n", ylab="densidade", xlab=expression(theta), main="", cex.lab=1.4,
cex.axis=1.4)
abline(v=theta, lwd=2, lty=3, col="red")
hist(1/phi_pr, freq=F, bty="n", ylab="densidade", xlab=expression(sigma^2), main="", cex.lab=1.4, cex.axis=1.4)
abline(v=sigma2, lwd=2, lty=3, col="red")
Note que a crença inicial não contemplou o valor verdadeiro de \(\theta\).
A posteriori, temos que \[\begin{eqnarray} \theta|\phi=\sigma^{-2}, y_1, \ldots, y_n &\sim& N\left(\frac{n \bar{y}+\mu_0 C_0}{n+C_0}, \frac{1}{\phi(n+ C_0)}\right)\\ \phi|y_1, \ldots, y_n &\sim& G\left(a+n/2, b+0,5\left[\sum_{i=1}^n{(y_i-\bar{y})^2} + n C_0 \frac{(\mu_0-\bar{y})^2}{n+C_0}\right]\right) \end{eqnarray}\] E então podemos obter uma amostra desta distribuição da seguinte forma:
# theta|y1, ..., yn,phi=1/sigma2 ~ N((n*ybarra+mu0*C0)/(n+C0), 1/(phi*(n+C0)))
# phi|y1, ..., yn, ~ G(a+n/2, b+0.5[sum((y-ybarra)^2) + n*C0*(mu0-ybarra)^2/(n+C0)])
phi_post = rgamma(np, a+n/2,b+0.5*(sum((y-mean(y))^2) + n*C0*(mu0-mean(y))^2/(n+C0)))
thetas_post = rnorm(np, (n*mean(y)+mu0*C0)/(n+C0), sqrt(1/(phi_post*(n+C0))))
par(mfrow=c(1,2))
hist(thetas_post, freq=F, bty="n", ylab="densidade", xlab=expression(theta), main="", cex.lab=1.4, cex.axis=1.4)
abline(v=theta, lwd=2, lty=3, col="red")
hist(1/phi_post, freq=F, bty="n", ylab="densidade", xlab=expression(sigma^2), main="", cex.lab=1.4, cex.axis=1.4)
abline(v=sigma2, lwd=2, lty=3, col="red")