A estatística bayesiana é uma abordagem estatística que se baseia no Teorema de Bayes para fazer inferências sobre parâmetros desconhecidos ou realizar previsões, levando em consideração a probabilidade de um evento ocorrer.
Ou seja, a probabilidade de um evento ocorrer é atualizada à medida que novas evidências são coletadas.
Ao contrário da abordagem frequentista tradicional, que trata os parâmetros como fixos e desconhecidos, a estatística bayesiana expressa incerteza em termos de distribuições de probabilidade.
A estatística bayesiana começa com a especificação de uma distribuição de probabilidade inicial, conhecida como priori (probabilidade anterior), que representa o conhecimento ou crenças prévias sobre o parâmetro desconhecido.
Essa distribuição inicial pode ser baseada em informações históricas, conhecimento especializado ou até mesmo opiniões subjetivas.
Em seguida, com base nos dados observados, é calculada a distribuição de probabilidade posterior, que representa a atualização das crenças sobre o parâmetro desconhecido.
O Teorema de Bayes é fundamental para a estatística bayesiana, pois descreve como a distribuição de probabilidade posterior pode ser obtida a partir da distribuição priori e da verossimilhança dos dados.
A distribuição posterior é proporcional ao produto da distribuição priori e da verossimilhança dos dados.
Em termos matemáticos, isso pode ser expresso da seguinte forma:
onde:
A distribuição posterior fornece uma estimativa atualizada da incerteza sobre o parâmetro desconhecido, levando em consideração tanto as informações prévias quanto as evidências dos dados observados.
Essa distribuição posterior pode ser usada para fazer inferências sobre o parâmetro, como estimativas pontuais, intervalos de confiança e previsões.
Uma das vantagens da estatística bayesiana é a flexibilidade para incorporar informações prévias e atualizá-las à medida que mais dados são coletados.
Além disso, a abordagem bayesiana permite a inclusão de informações subjetivas, tornando-se útil em situações em que o conhecimento especializado é relevante.
No entanto, a estatística bayesiana também apresenta desafios.
A escolha da distribuição priori pode ser um desafio em si, pois ela influencia fortemente a distribuição posterior resultante.
Além disso, a estimação da distribuição posterior pode exigir cálculos complexos, especialmente para modelos estatísticos mais complicados.
No geral, a estatística bayesiana é uma abordagem poderosa que permite atualizar as estimativas e fazer inferências sobre parâmetros desconhecidos com base em informações prévias e evidências dos dados observados.
Ela encontra aplicação em diversas áreas, incluindo medicina, ciências sociais, finanças e ciência de dados.
Na Ciência da Estatística, as computações de decisões bayesianas são aplicadas para tomada de decisões fundamentadas e informadas com base em modelos estatísticos e dados observados.
Alguns métodos comuns de computação de decisões bayesianas utilizados na ciência da estatística incluem:
Em resumo, as computações de decisões bayesianas na ciência da estatística envolvem o uso de métodos estatísticos bayesianos para calcular estimativas, intervalos de credibilidade, realizar testes de hipóteses, modelar incertezas e tomar decisões informadas. Essas técnicas são amplamente utilizadas para análise de dados, inferência estatística e tomada de decisões em uma variedade de campos, desde pesquisas científicas até análise de dados empresariais.
A seguir são apresentados exemplos usando a biblioteca pymc3 para:
Para instalar o PyMC3, você pode usar o gerenciador de pacotes pip:
pip install pymc3
Neste exemplo, estamos interessados em estimar a probabilidade p de um evento ocorrer, dado um conjunto de dados observados dados_observados.
Usamos uma distribuição Beta como priori sobre p e uma verossimilhança binomial para modelar os dados observados.
Em seguida, realizamos amostragem da distribuição a posteriori usando o algoritmo de Monte Carlo Markov Chain (MCMC) implementado no PyMC3.
O número de amostras e a fase de ajuste (tune) podem ser ajustados de acordo com a complexidade do modelo e a precisão desejada.
Por fim, utilizamos a função pm.summary() para gerar um resumo estatístico das estimativas, incluindo a média, desvio padrão, intervalos de credibilidade, entre outros.
import pymc3 as pm
import numpy as np
# Dados observados
dados_observados = np.array([1, 0, 1, 1, 0, 1])
# Modelo bayesiano
with pm.Model() as modelo:
# Priori sobre a probabilidade
p = pm.Beta('p', alpha=1, beta=1)
#
# Verossimilhança binomial
verossimilhanca = pm.Bernoulli('verossimilhanca', p=p, observed=dados_observados)
#
# Amostragem da distribuição posterior usando MCMC
trace = pm.sample(1000, tune=1000)
Resultado:
# Resumo das estimativas
print(pm.summary(trace))
mean sd hdi_3% hdi_97% mcse_mean mcse_sd ess_bulk ess_tail r_hat
p 0.628 0.162 0.328 0.903 0.004 0.003 1846.0 2409.0 1.0
Quando você obtém um resumo (summary) de um modelo no PyMC3, é comum encontrar vários campos de parâmetros p, incluindo "mean" (média), "sd" (desvio padrão), "hdi_3%" e "hdi_97%" (intervalos de credibilidade de 3% e 97%), "mcse_mean" (erro padrão da média), "mcse_sd" (erro padrão do desvio padrão), "ess_bulk" (essência em massa) e "ess_tail" (essência da cauda), além do "r_hat" (R-hat).
Esses campos fornecem informações úteis sobre os parâmetros inferidos pelo modelo de inferência bayesiana.
Descrição dos campos:
Esses campos são úteis para avaliar a qualidade do ajuste do modelo, a precisão das estimativas dos parâmetros e a convergência das cadeias de Markov utilizadas pelo algoritmo MCMC.
É importante lembrar que esse é apenas um exemplo básico de cálculo de estimativas bayesianas.
Dependendo do problema em questão, podem ser necessárias considerações adicionais, como escolha de prioris mais informativas, modelagem de efeitos aleatórios, entre outros.
Neste exemplo, estamos estimando a probabilidade p de um evento ocorrer, com base em um conjunto de dados observados dados_observados.
Utilizamos uma distribuição Beta como priori e uma verossimilhança binomial para modelar os dados observados.
Após a amostragem da distribuição a posteriori usando MCMC, utilizamos a função pm.stats.hdi() do PyMC3 para calcular o intervalo de credibilidade.
O parâmetro alpha define o nível de credibilidade desejado (nesse caso, 0.05, correspondendo a um intervalo de 95% de credibilidade)
O resultado é um intervalo de valores que contém a probabilidade p com o nível de credibilidade especificado.
import pymc3 as pm
import numpy as np
# Dados observados
dados_observados = np.array([1, 0, 1, 1, 0, 1])
# Modelo bayesiano
with pm.Model() as modelo:
# Priori sobre a probabilidade
p = pm.Beta('p', alpha=1, beta=1)
#
# Verossimilhança binomial
verossimilhanca = pm.Bernoulli('verossimilhanca', p=p, observed=dados_observados)
#
# Amostragem da distribuição posterior usando MCMC
trace = pm.sample(1000, tune=1000)
intervalo_credibilidade = pm.stats.hdi(trace['p'], alpha=0.05)
Resultado:
# Cálculo dos intervalos de credibilidade
print("Intervalo de Credibilidade: ", intervalo_credibilidade)
Intervalo de Credibilidade: [0.32843014 0.90319928]
Observe que o exemplo é similar ao exemplo anterior de cálculo de estimativas bayesianas, mas a diferença é que agora estamos calculando um intervalo de credibilidade ao invés de uma estimativa pontual.
Neste exemplo, estamos realizando um teste de hipóteses bayesianos para comparar as médias de duas populações representadas pelos conjuntos de dados grupo_dados_1 e grupo_dados_2.
Estamos interessados em testar a hipótese nula de que as médias são iguais versus a hipótese alternativa de que as médias são diferentes.
Utilizamos distribuições normais como priori para as médias das duas populações e uma verossimilhança normal para modelar os dados observados
A diferença entre as médias é calculada como uma variável determinística.
Após a amostragem da distribuição a posteriori usando MCMC, calculamos o valor-p.
Neste exemplo, o valor-p é a proporção de amostras em que a diferença entre as médias é maior que zero.
O valor-p nos dá uma medida da evidência em favor da hipótese alternativa.
import pymc3 as pm
import numpy as np
# Dados observados
grupo_dados_1 = np.array([2, 3, 4, 3, 2, 4])
grupo_dados_2 = np.array([5, 6, 7, 6, 5, 7])
# Modelo bayesiano
with pm.Model() as model:
# Priori sobre as médias das duas populações
mu1 = pm.Normal('mu1', mu=0, sd=10)
mu2 = pm.Normal('mu2', mu=0, sd=10)
# Verossimilhança normal
verossimilhanca_1 = pm.Normal('verossimilhanca_1', mu=mu1, sd=1, observed=grupo_dados_1)
verossimilhanca_2 = pm.Normal('verossimilhanca_2', mu=mu2, sd=1, observed=grupo_dados_2)
# Diferença entre as médias
dif_medias = pm.Deterministic('dif_medias', mu1 - mu2)
# Amostragem da distribuição posterior usando MCMC
trace = pm.sample(1000, tune=1000)
Resultado:
# Teste de hipóteses
p_value = (trace['dif_medias'] > 0).mean()
print("Valor-p: ", p_value)
Valor-p: 0.0
É importante ressaltar que a interpretação dos resultados em testes de hipóteses bayesianos difere um pouco da abordagem frequentista.
No caso bayesiano, não fazemos uma decisão binária (aceitar ou rejeitar a hipótese nula), mas sim avaliamos a evidência em favor de cada hipótese com base na distribuição a posteriori.
Neste exemplo, estamos realizando a modelagem de incertezas em um modelo de regressão linear simples.
Temos um conjunto de dados observados x e y, onde y é uma função linear de x com ruído adicional.
Utilizamos distribuições normais como prioris para os parâmetros intercepto e inclinacao do modelo linear.
A verossimilhança é modelada como uma distribuição normal com média igual à soma do intercepto e da inclinação, multiplicada por x, e desvio padrão igual a 1.
Após a amostragem da distribuição a posteriori usando MCMC, obtemos amostras dos parâmetros intercepto e inclinacao.
Em seguida, podemos visualizar as incertezas modeladas, plotando várias linhas de regressão geradas a partir das amostras dos parâmetros.
import pymc3 as pm
import numpy as np
import matplotlib.pyplot as plt
# Dados observados
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 6, 8, 10]) + np.random.normal(0, 1, 5)
# Modelo bayesiano
with pm.Model() as model:
# Priori sobre os parâmetros
intercepto = pm.Normal('intercepto', mu=0, sd=10)
inclinacao = pm.Normal('inclinacao', mu=0, sd=10)
# Verossimilhança linear
verossimilhanca = pm.Normal('verossimilhanca', mu=intercepto + inclinacao * x, sd=1, observed=y)
# Amostragem da distribuição posterior usando MCMC
trace = pm.sample(1000, tune=1000)
# Amostras dos parâmetros
samples_intercept = trace['intercepto']
samples_slope = trace['inclinacao']
# Plot dos resultados
plt.scatter(x, y, label='Dados Observados')
for i in range(100):
plt.plot(x, samples_intercept[i] + samples_slope[i] * x, color='gray', alpha=0.1)
plt.xlabel('x')
plt.ylabel('y')
plt.title('Modelagem de Incertezas')
plt.legend()
plt.show()
Resultado:
O gráfico resultante mostra os dados observados (pontos) juntamente com várias linhas de regressão (linhas cinzas) que representam a incerteza nas estimativas dos parâmetros.
Essa abordagem permite visualizar a variabilidade nas estimativas e a incerteza associada ao modelo.
Neste exemplo, estamos realizando a previsão e tomada de decisões usando um modelo de regressão linear simples.
Temos um conjunto de dados observados x e y, onde y é uma função linear de x com ruído adicional.
Após a construção do modelo bayesiano e a amostragem da distribuição a posteriori usando MCMC, realizamos a previsão para novos dados representados por novo_x.
Utilizamos a distribuição normal para modelar a verossimilhança dos dados previstos, com os parâmetros intercepto e inclinacao obtidos a partir do modelo.
Em seguida, realizamos amostragem da distribuição posterior preditiva usando a função pm.sample_posterior_predictive() do PyMC3.
Isso nos fornece amostras dos dados previstos, permitindo calcular medidas estatísticas, como a média e intervalos de credibilidade.
import pymc3 as pm
import numpy as np
import matplotlib.pyplot as plt
# Dados observados
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 6, 8, 10]) + np.random.normal(0, 1, 5)
# Modelo bayesiano
with pm.Model() as model:
# Priori sobre os parâmetros
intercepto = pm.Normal('intercepto', mu=0, sd=10)
inclinacao = pm.Normal('inclinacao', mu=0, sd=10)
# Verossimilhança linear
verossimilhanca = pm.Normal('verossimilhanca', mu=intercepto + inclinacao * x, sd=1, observed=y)
# Amostragem da distribuição posterior usando MCMC
trace = pm.sample(1000, tune=1000)
# Previsão e tomada de decisões
novo_x = np.array([6, 7, 8])
with model:
# Previsão para novos dados
y_pred = pm.Normal('y_pred', mu=intercepto + inclinacao * novo_x, sd=1, shape=len(novo_x))
# Amostragem da distribuição posterior preditiva
trace_pred = pm.sample_posterior_predictive(trace, var_names=['y_pred'], samples=500)
# Plot dos resultados
plt.scatter(x, y, label='Dados Observados')
plt.plot(novo_x, np.mean(trace_pred['y_pred'], axis=0), color='red', label='Previsão Média')
plt.fill_between(novo_x, np.percentile(trace_pred['y_pred'], 5, axis=0),
np.percentile(trace_pred['y_pred'], 95, axis=0), color='gray',
alpha=0.2, label='Intervalo de Credibilidade (90%)')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Previsão e Tomada de Decisões')
plt.legend()
plt.show()
Resultado:
O gráfico resultante mostra os dados observados (pontos), a previsão média (linha vermelha) e um intervalo de credibilidade de 90% (área cinza) para os novos dados previstos.
Essas informações ajudam na tomada de decisões ao avaliar a incerteza nas previsões e fornecer uma faixa de valores prováveis para os novos dados.