0Pricing
R Academy · Aula

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 model

ppc_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 misfit

Mais 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 histogramas
  • ppc_scatter_avg(y, yrep) — gráfico de dispersão dos valores observados versus a média de yrep
  • ppc_intervals(y, yrep) — intervalos de incerteza em torno de cada observação
  • ppc_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] matrix

Validaçã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 reliable

Boas 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-check

Verificaçã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

  1. Introdução ao pensamento bayesiano
  2. Escrevendo modelos Stan em R
  3. Amostragem MCMC e diagnósticos
  4. Verificações preditivas a posteriori
← Voltar para R Academy