Vérifications prédictives a posteriori
Validez l’adéquation du modèle en comparant les distributions de données simulées et observées.
Vérifications prédictives a posteriori est une leçon R Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage R Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours R Academy comprend 4 leçons au total.
Que sont les vérifications prédictives a posteriori ?
Après avoir ajusté un modèle bayésien, vous devez vous demander : ce modèle génère-t-il des données qui ressemblent aux données observées ? Les vérifications prédictives a posteriori (PPC) répondent à cette question en simulant des jeux de données répliqués yrep à partir de la loi a posteriori, puis en les comparant graphiquement aux données observées y.
Extraire les échantillons a posteriori
extract(fit, pars='mu') renvoie une liste nommée ; $mu est un vecteur numérique contenant tous les échantillons après la phase d’échauffement pour ce paramètre. Avec 4 chaînes et 1000 itérations après l’échauffement, vous obtenez 4000 échantillons.
# 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)), '
')Générer yrep à partir des échantillons a posteriori
Pour chaque tirage a posteriori (mu_s, sigma_s), simulez un jeu de données répliqué de même taille que les données d’origine. Stockez-les dans une matrice yrep, où chaque ligne correspond à un jeu de données simulé.
# 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() — Comparaison des densités
bayesplot::ppc_dens_overlay(y, yrep[1:50,]) superpose la densité à noyau des données observées (ligne foncée) aux densités de 50 jeux de données simulés choisis aléatoirement (lignes claires). Un bon ajustement du modèle signifie que la ligne foncée se trouve à l’intérieur du nuage de lignes claires.
# 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() — Vérification d’une statistique de test
ppc_stat(y, yrep, stat = 'mean') affiche un histogramme de la statistique de test (par exemple, la moyenne) calculée sur chaque jeu de données simulé, avec une ligne verticale indiquant la statistique observée. Si la valeur observée se situe dans la partie centrale de l’histogramme, le modèle rend compte de cet aspect des données.
# 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.Valeur p bayésienne
La valeur p bayésienne (valeur p prédictive a posteriori) est la proportion de jeux de données simulés dont la statistique de test est plus extrême que la valeur observée. Des valeurs proches de 0,5 indiquent un bon calibrage ; des valeurs proches de 0 ou de 1 indiquent un mauvais ajustement du modèle pour cette statistique.
# 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 misfitAutres fonctions PPC de bayesplot
bayesplot propose de nombreuses visualisations PPC en plus des superpositions de densités :
ppc_hist(y, yrep[1:8,])— grille d’histogrammesppc_scatter_avg(y, yrep)— nuage de points des valeurs observées par rapport à la moyenne de yrepppc_intervals(y, yrep)— intervalles d’incertitude autour de chaque observationppc_rootogram(y, yrep)— pour les données de comptage
# 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)Interpréter les graphiques PPC — Mauvais ajustement du modèle
Motifs courants de mauvais ajustement et leurs causes :
- yrep trop étendu — la loi a priori est trop diffuse ou le modèle est surdispersé
- yrep décalé — famille de vraisemblance incorrecte (par exemple, une loi normale pour des données asymétriques)
- yrep ne reproduit pas la multimodalité — un modèle de mélange est nécessaire
- yrep échoue pour les valeurs extrêmes — une distribution à queues épaisses est nécessaire
# 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 dans le bloc model de Stan
Vous pouvez générer yrep directement dans Stan à l’aide du bloc generated quantities. Cela évite d’extraire à nouveau les paramètres dans R et est équivalent sur le plan des calculs.
# 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] matrixValidation croisée leave-one-out
En plus des PPC, loo::loo(fit) calcule une validation croisée leave-one-out afin de comparer des modèles concurrents. Le modèle dont l’ELPD (densité prédictive logarithmique attendue) est la plus élevée est privilégié. Utilisez loo::loo_compare(loo1, loo2) pour classer les modèles.
# 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 reliableBonnes pratiques pour les PPC
Suivez ces pratiques pour effectuer des vérifications prédictives a posteriori rigoureuses :
- Commencez toujours par
ppc_dens_overlay()comme vérification globale de cohérence - Poursuivez avec des statistiques propres à votre domaine (
ppc_stat()) et pertinentes pour vos objectifs d’analyse - Utilisez au moins 50 tirages yrep pour les vérifications visuelles ; utilisez les 4000 pour les valeurs p bayésiennes
- Les PPC qui échouent orientent l’amélioration du modèle : elles servent au diagnostic, et non à constater un échec
# 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-checkVérification rapide : interprétation de la valeur p bayésienne
Que signifie pour le modèle une valeur p bayésienne de 0,03 pour la statistique du maximum ?
Récapitulatif des vérifications prédictives a posteriori
Flux de travail PPC dans RStan et bayesplot :
- Extraire les échantillons :
extract(fit, pars='mu')$mu - Générer yrep : parcourir les tirages a posteriori en appelant
rnorm(n, mu_s, sigma_s) - Vérification globale :
ppc_dens_overlay(y, yrep[1:50,]) - Vérifications statistiques :
ppc_stat(y, yrep, stat='mean') - Valeur p bayésienne :
mean(apply(yrep,1,stat) >= stat(y))— une valeur proche de 0,5 est un bon résultat - Pour comparer les modèles, utilisez
loo::loo_compare()
Questions Fréquemment Posées
La leçon « Vérifications prédictives a posteriori » est-elle gratuite ?
Oui — le texte complet de « Vérifications prédictives a posteriori » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours R Academy, passe à CoddyKit PRO. Le cours R Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Vérifications prédictives a posteriori » ?
Validez l’adéquation du modèle en comparant les distributions de données simulées et observées. Tu pratiques R Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer R Academy ?
Aucune expérience préalable n'est requise. R Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « Vérifications prédictives a posteriori » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon R Academy ?
Oui. Chaque leçon R Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Introduction au raisonnement bayésien
- Écrire des modèles Stan dans R
- Échantillonnage MCMC et diagnostics
- Vérifications prédictives a posteriori