0Pricing
R Academy · Lección

Comprobaciones predictivas posteriores

Valide el ajuste del modelo comparando las distribuciones de datos simulados y observados.

Comprobaciones predictivas posteriores es una lección gratuita de R Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de R Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de R Academy incluye 4 lecciones en total.

¿Qué son las comprobaciones predictivas posteriores?

Después de ajustar un modelo bayesiano, debe preguntarse: ¿este modelo genera datos parecidos a los datos observados? Las comprobaciones predictivas posteriores (PPC) responden a esta pregunta simulando conjuntos de datos replicados yrep a partir de la distribución posterior y comparándolos gráficamente con los datos observados y.

Extraer muestras posteriores

extract(fit, pars='mu') devuelve una lista con nombre; $mu es un vector numérico con todas las muestras posteriores al calentamiento de ese parámetro. Con 4 cadenas y 1000 iteraciones posteriores al calentamiento se obtienen 4000 muestras.

# 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)), '
')

Generar yrep a partir de muestras posteriores

Para cada extracción posterior (mu_s, sigma_s), simule un conjunto de datos replicado del mismo tamaño que los datos originales. Almacene estos conjuntos en una matriz yrep, donde cada fila representa un conjunto de datos 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(): comparación de densidades

bayesplot::ppc_dens_overlay(y, yrep[1:50,]) superpone la densidad estimada mediante kernel de los datos observados (línea oscura) con las densidades de 50 conjuntos de datos simulados elegidos al azar (líneas claras). Un buen ajuste del modelo significa que la línea oscura se encuentra dentro de la nube de líneas 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(): comprobación del estadístico de prueba

ppc_stat(y, yrep, stat = 'mean') muestra un histograma del estadístico de prueba (por ejemplo, la media) calculado para cada conjunto de datos simulado, con una línea vertical en el estadístico observado. Si el valor observado se encuentra en la parte central del histograma, el modelo captura ese aspecto de los datos.

# 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

El valor p bayesiano (valor p predictivo posterior) es la proporción de conjuntos de datos simulados cuyo estadístico de prueba es más extremo que el valor observado. Los valores cercanos a 0.5 indican una buena calibración; los valores cercanos a 0 o 1 indican un mal ajuste del modelo para ese estadístico.

# 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

Más funciones PPC de bayesplot

bayesplot ofrece numerosas visualizaciones PPC además de las superposiciones de densidades:

  • ppc_hist(y, yrep[1:8,]): cuadrícula de histogramas
  • ppc_scatter_avg(y, yrep): dispersión de los datos observados frente a la media de yrep
  • ppc_intervals(y, yrep): intervalos de incertidumbre alrededor de cada observación
  • ppc_rootogram(y, yrep): para datos de conteo
# 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)

Interpretar los gráficos PPC: mal ajuste del modelo

Patrones habituales de mal ajuste y sus causas:

  • yrep demasiado amplio: la distribución previa es demasiado difusa o el modelo presenta sobredispersión
  • yrep desplazado: familia de verosimilitud incorrecta (por ejemplo, normal para datos asimétricos)
  • yrep no reproduce la multimodalidad: se necesita un modelo de mezcla
  • yrep no reproduce los valores extremos: se necesita una distribución de colas 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
')

PPC en el bloque model de Stan

Puede generar yrep directamente en Stan mediante el bloque generated quantities. Esto evita volver a extraer los parámetros en R y es equivalente desde el punto de vista computacional.

# 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

Validación cruzada dejando uno fuera

Además de las PPC, loo::loo(fit) calcula la validación cruzada dejando uno fuera para comparar modelos alternativos. Se prefiere el modelo con un ELPD (densidad predictiva logarítmica esperada) mayor. Use loo::loo_compare(loo1, loo2) para ordenar los 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

Buenas prácticas para las PPC

Siga estas prácticas para realizar comprobaciones predictivas posteriores rigurosas:

  • Comience siempre con ppc_dens_overlay() como comprobación general de coherencia
  • Continúe con estadísticos específicos del área (ppc_stat()) relevantes para sus objetivos de análisis
  • Use al menos 50 extracciones de yrep para las comprobaciones visuales; use las 4000 para los valores p bayesianos
  • Las PPC fallidas orientan la mejora del modelo: son diagnósticas, no un fracaso
# 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

Comprobación rápida: interpretación del valor p bayesiano

¿Qué significa para el modelo un valor p bayesiano de 0.03 para el estadístico máximo?

Repaso de las comprobaciones predictivas posteriores

Flujo de trabajo de las PPC en RStan y bayesplot:

  • Extraer muestras: extract(fit, pars='mu')$mu
  • Generar yrep: recorrer las extracciones posteriores llamando a rnorm(n, mu_s, sigma_s)
  • Comprobación general: ppc_dens_overlay(y, yrep[1:50,])
  • Comprobaciones de estadísticos: ppc_stat(y, yrep, stat='mean')
  • Valor p bayesiano: mean(apply(yrep,1,stat) >= stat(y)): un valor cercano a 0.5 es adecuado
  • Para comparar modelos, use loo::loo_compare()

Preguntas frecuentes

¿La lección «Comprobaciones predictivas posteriores» es gratis?

Sí — el texto completo de «Comprobaciones predictivas posteriores» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de R Academy, actualiza a CoddyKit PRO. El curso de R Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Comprobaciones predictivas posteriores»?

Valide el ajuste del modelo comparando las distribuciones de datos simulados y observados. Practicas R Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar R Academy?

No se requiere experiencia previa. R Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Comprobaciones predictivas posteriores»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de R Academy?

Sí. Cada lección de R Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Introducción al pensamiento bayesiano
  2. Escritura de modelos de Stan en R
  3. Muestreo MCMC y diagnósticos
  4. Comprobaciones predictivas posteriores
← Volver a R Academy