Verificações preditivas a posteriori
Valide o ajuste do modelo comparando distribuições de dados simulados e observados.
Verificações preditivas a posteriori é uma aula grátis de R Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de R Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de R Academy inclui 4 aulas no total.
O que são verificações preditivas a posteriori?
Após ajustar um modelo bayesiano, é preciso perguntar: este modelo gera dados semelhantes aos dados observados? As verificações preditivas a posteriori (PPCs) respondem a isso simulando conjuntos de dados replicados yrep a partir da distribuição a posteriori e comparando-os graficamente com o y observado.
Extraindo amostras a posteriori
extract(fit, pars='mu') retorna uma lista nomeada; $mu é um vetor numérico com todas as amostras após o aquecimento para esse parâmetro. Com 4 cadeias × 1000 iterações após o aquecimento, obtém-se um total de 4000 amostras.
# library(rstan)
# mu_samples <- extract(fit, pars = 'mu')$mu
# sigma_samples <- extract(fit, pars = 'sigma')$sigma
#
# cat('Samples drawn:', length(mu_samples), '
')
# cat('Posterior mean of mu:', mean(mu_samples), '
')
# cat('90% CI:', quantile(mu_samples, c(0.05, 0.95)), '
')Gerando yrep a partir das amostras a posteriori
Para cada extração da distribuição a posteriori (mu_s, sigma_s), simule um conjunto de dados replicado com o mesmo tamanho dos dados originais. Armazene-os em uma matriz yrep, na qual cada linha representa um conjunto de dados simulado.
# y <- c(2.1, 1.8, 2.4, 1.9, 2.3, 2.0, 1.7, 2.2)
# n_obs <- length(y)
# S <- length(mu_samples) # 4000 posterior draws
#
# yrep <- matrix(NA, nrow = S, ncol = n_obs)
# for (s in seq_len(S)) {
# yrep[s, ] <- rnorm(n_obs, mean = mu_samples[s], sd = sigma_samples[s])
# }
# dim(yrep) # [4000, 8]ppc_dens_overlay() — Comparação de densidades
bayesplot::ppc_dens_overlay(y, yrep[1:50,]) sobrepõe a densidade de núcleo dos dados observados (linha escura) às densidades de 50 conjuntos de dados simulados escolhidos aleatoriamente (linhas claras). Um bom ajuste do modelo significa que a linha escura fica dentro da nuvem de linhas claras.
# library(bayesplot)
#
# ppc_dens_overlay(y, yrep[1:50, ])
#
# Interpretation:
# - Dark line (y_obs) surrounded by light lines (yrep): good fit
# - Dark line systematically outside the cloud: model misfit
# - Light lines much wider than dark: overdispersed model
# - Light lines much narrower than dark: underdispersed modelppc_stat() — Verificação da estatística de teste
ppc_stat(y, yrep, stat = 'mean') mostra um histograma da estatística de teste (por exemplo, a média) calculada em cada conjunto de dados simulado, com uma linha vertical na estatística observada. Se o valor observado estiver na região central do histograma, o modelo captura esse aspecto dos dados.
# library(bayesplot)
#
# ppc_stat(y, yrep, stat = 'mean') # does model capture the mean?
# ppc_stat(y, yrep, stat = 'sd') # does model capture spread?
# ppc_stat(y, yrep, stat = 'max') # does model capture extremes?
#
# If observed stat is in the tail of the histogram,
# the model fails to reproduce that statistic.Valor-p bayesiano
O valor-p bayesiano (valor-p preditivo a posteriori) é a proporção de conjuntos de dados simulados cuja estatística de teste é mais extrema que o valor observado. Valores próximos de 0,5 indicam boa calibração; valores próximos de 0 ou 1 indicam falta de ajuste do modelo para essa estatística.
# Bayesian p-value for the mean:
# obs_mean <- mean(y)
# rep_means <- apply(yrep, 1, mean)
# pval <- mean(rep_means >= obs_mean)
# cat('Bayesian p-value (mean):', round(pval, 3), '
')
# # 0.5 is perfect; < 0.05 or > 0.95 suggests misfitMais funções PPC do bayesplot
O bayesplot oferece muitas visualizações PPC além das sobreposições de densidade:
ppc_hist(y, yrep[1:8,])— grade de histogramasppc_scatter_avg(y, yrep)— gráfico de dispersão dos valores observados versus a média de yrepppc_intervals(y, yrep)— intervalos de incerteza em torno de cada observaçãoppc_rootogram(y, yrep)— para dados de contagem
# library(bayesplot)
#
# # Grid of 8 simulated histograms vs the observed
# ppc_hist(y, yrep[1:8, ])
#
# # Scatter: y_obs (x) vs mean of yrep (y) — should hug diagonal
# ppc_scatter_avg(y, yrep)
#
# # 50% and 90% posterior predictive intervals around each y_i
# ppc_intervals(y, yrep)Interpretando gráficos PPC — falta de ajuste do modelo
Padrões comuns de falta de ajuste e suas causas:
- yrep muito amplo — a distribuição a priori é muito difusa ou o modelo apresenta sobredispersão
- yrep deslocado — família de verossimilhança incorreta (por exemplo, normal para dados assimétricos)
- yrep não captura a multimodalidade — é necessário um modelo de mistura
- yrep falha para valores extremos — é necessária uma distribuição de caudas pesadas
# Example: if data has a long right tail but yrep does not,
# consider switching:
# y ~ normal(mu, sigma) => y ~ student_t(nu, mu, sigma)
#
# Or for count data:
# y ~ poisson(lambda) => y ~ neg_binomial_2(mu, phi) (overdispersion)
cat('PPCs guide model improvement by revealing specific failure modes
')PPCs no bloco do modelo Stan
É possível gerar yrep diretamente no Stan usando o bloco generated quantities. Isso evita extrair novamente os parâmetros no R e é computacionalmente equivalente.
# Stan model with generated quantities:
# '
# generated quantities {
# array[N] real y_rep;
# for (n in 1:N) {
# y_rep[n] = normal_rng(mu, sigma);
# }
# }
# '
# Then extract in R:
# yrep <- extract(fit, pars = 'y_rep')$y_rep # [S, N] matrixValidação cruzada deixando um de fora
Além das PPCs, loo::loo(fit) calcula a validação cruzada deixando uma observação de fora para comparar modelos concorrentes. O modelo com maior ELPD (densidade preditiva logarítmica esperada) é preferível. Use loo::loo_compare(loo1, loo2) para classificar os modelos.
# library(loo)
# loo1 <- loo(fit1) # normal model
# loo2 <- loo(fit2) # student-t model
#
# comparison <- loo_compare(loo1, loo2)
# print(comparison)
#
# Model with elpd_diff > 0 is preferred
# se_diff > |elpd_diff| means difference is not reliableBoas práticas para PPCs
Siga estas práticas para realizar verificações preditivas a posteriori rigorosas:
- Comece sempre com
ppc_dens_overlay()como verificação geral de sanidade - Em seguida, use estatísticas específicas do domínio (
ppc_stat()) relevantes para os objetivos da análise - Use pelo menos 50 extrações de yrep para verificações visuais; use todas as 4000 para valores-p bayesianos
- PPCs que falham orientam o aprimoramento do modelo — são diagnósticas, não representam um fracasso
# Workflow:
# 1. Fit model -> extract() -> generate yrep matrix
# 2. ppc_dens_overlay(y, yrep[1:50,]) -- visual global check
# 3. ppc_stat(y, yrep, stat='mean') -- check mean
# 4. ppc_stat(y, yrep, stat='sd') -- check spread
# 5. ppc_stat(y, yrep, stat='max') -- check tails
# 6. If misfit found -> revise model -> refit -> re-checkVerificação rápida: interpretação do valor-p bayesiano
O que um valor-p bayesiano de 0,03 para a estatística máxima significa para o modelo?
Recapitulação das verificações preditivas a posteriori
Fluxo de trabalho de PPC no RStan e no bayesplot:
- Extraia as amostras:
extract(fit, pars='mu')$mu - Gere yrep: percorra as extrações da distribuição a posteriori chamando
rnorm(n, mu_s, sigma_s) - Verificação geral:
ppc_dens_overlay(y, yrep[1:50,]) - Verificações de estatísticas:
ppc_stat(y, yrep, stat='mean') - Valor-p bayesiano:
mean(apply(yrep,1,stat) >= stat(y))— próximo de 0,5 é bom - Para comparar modelos, use
loo::loo_compare()
Perguntas Frequentes
A aula “Verificações preditivas a posteriori” é grátis?
Sim — o texto completo de “Verificações preditivas a posteriori” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de R Academy, atualize para CoddyKit PRO. O curso de R Academy inclui 4 aulas no total.
O que vou aprender em “Verificações preditivas a posteriori”?
Valide o ajuste do modelo comparando distribuições de dados simulados e observados. Você pratica R Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar R Academy?
Nenhuma experiência prévia é necessária. R Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Verificações preditivas a posteriori”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de R Academy?
Sim. Cada aula de R Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Introdução ao pensamento bayesiano
- Escrevendo modelos Stan em R
- Amostragem MCMC e diagnósticos
- Verificações preditivas a posteriori