R Academy · Lektion

Posterior-predictive Checks

Validieren Sie die Modellanpassung, indem Sie simulierte und beobachtete Datenverteilungen vergleichen

Lektion 4 von 413 Schritte

Posterior-predictive Checks ist eine kostenlose R Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des R Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der R Academy-Kurs umfasst insgesamt 4 Lektionen.

Was sind posterior-prädiktive Prüfungen?

Nach dem Anpassen eines bayesianischen Modells müssen Sie fragen: Erzeugt dieses Modell Daten, die den beobachteten Daten ähneln? Posterior Predictive Checks (PPCs) beantworten diese Frage, indem sie replizierte Datensätze yrep aus der Posterior-Verteilung simulieren und grafisch mit den beobachteten Daten y vergleichen.

Posterior-Stichproben extrahieren

extract(fit, pars='mu') gibt eine benannte Liste zurück; $mu ist ein numerischer Vektor mit allen Stichproben für diesen Parameter nach der Warm-up-Phase. Bei 4 Ketten und 1000 Iterationen nach der Warm-up-Phase erhalten Sie 4000 Stichproben.

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

yrep aus Posterior-Stichproben erzeugen

Simulieren Sie für jeden Posterior-Zug (mu_s, sigma_s) einen replizierten Datensatz mit derselben Größe wie die ursprünglichen Daten. Speichern Sie diese in einer Matrix yrep, in der jede Zeile einem simulierten Datensatz entspricht.

# 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() — Dichtevergleich

bayesplot::ppc_dens_overlay(y, yrep[1:50,]) legt die Kerndichte der beobachteten Daten (dunkle Linie) über die Dichten von 50 zufällig ausgewählten simulierten Datensätzen (helle Linien). Bei guter Modellanpassung liegt die dunkle Linie innerhalb der Wolke heller Linien.

# 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() — Prüfung einer Teststatistik

ppc_stat(y, yrep, stat = 'mean') zeigt ein Histogramm der Teststatistik (z. B. des Mittelwerts), die für jeden simulierten Datensatz berechnet wurde, mit einer vertikalen Linie bei der beobachteten Teststatistik. Liegt der beobachtete Wert im Hauptbereich des Histogramms, bildet das Modell diesen Aspekt der Daten angemessen ab.

# 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.

Bayesianischer p-Wert

Der bayesianische p-Wert (posterior-prädiktiver p-Wert) ist der Anteil der simulierten Datensätze, deren Teststatistik extremer ist als der beobachtete Wert. Werte nahe 0,5 weisen auf eine gute Kalibrierung hin; Werte nahe 0 oder 1 zeigen eine schlechte Modellanpassung für diese Teststatistik an.

# 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

Weitere bayesplot-PPC-Funktionen

bayesplot bietet neben Dichteüberlagerungen zahlreiche weitere PPC-Visualisierungen:

  • ppc_hist(y, yrep[1:8,]) — Histogrammraster
  • ppc_scatter_avg(y, yrep) — Streudiagramm der beobachteten Werte gegenüber dem Mittelwert von yrep
  • ppc_intervals(y, yrep) — Unsicherheitsintervalle um jede Beobachtung
  • ppc_rootogram(y, yrep) — für Zähldaten
# 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)

PPC-Diagramme interpretieren — schlechte Modellanpassung

Häufige Muster schlechter Modellanpassung und ihre Ursachen:

  • yrep zu breit — der Prior ist zu diffus oder das Modell weist eine zu hohe Dispersion auf
  • yrep verschoben — falsche Likelihood-Familie (z. B. Normalverteilung für schiefe Daten)
  • yrep bildet die Multimodalität nicht ab — ein Mischmodell ist erforderlich
  • yrep bildet Extremwerte nicht ab — eine Verteilung mit schweren Rändern ist erforderlich
# 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 im Stan-Model-Block

Sie können yrep direkt in Stan mithilfe des Blocks generated quantities erzeugen. Dadurch entfällt das erneute Extrahieren der Parameter in R; rechnerisch ist das Vorgehen gleichwertig.

# 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

Leave-One-Out-Kreuzvalidierung

Zusätzlich zu PPCs berechnet loo::loo(fit) eine Leave-One-Out-Kreuzvalidierung, um konkurrierende Modelle zu vergleichen. Das Modell mit der höheren ELPD (erwartete logarithmische Vorhersagedichte) wird bevorzugt. Verwenden Sie loo::loo_compare(loo1, loo2), um Modelle zu ordnen.

# 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

Bewährte Vorgehensweisen für PPCs

Befolgen Sie diese Vorgehensweisen für eine sorgfältige posterior-prädiktive Prüfung:

  • Beginnen Sie immer mit ppc_dens_overlay() als globaler Plausibilitätsprüfung
  • Führen Sie anschließend domänenspezifische, für Ihre Analyseziele relevante Statistiken mit ppc_stat() durch
  • Verwenden Sie für visuelle Prüfungen mindestens 50 yrep-Züge und für bayesianische p-Werte alle 4000
  • Fehlgeschlagene PPCs geben Hinweise zur Verbesserung des Modells — sie sind diagnostisch und kein Misserfolg
# 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

Schnelltest: Interpretation des bayesianischen p-Werts

Was bedeutet ein bayesianischer p-Wert von 0,03 für die Maximum-Teststatistik in Bezug auf das Modell?

Zusammenfassung: Posterior-prädiktive Prüfungen

PPC-Workflow in RStan und bayesplot:

  • Stichproben extrahieren: extract(fit, pars='mu')$mu
  • yrep erzeugen: Durch die Posterior-Züge iterieren und dabei rnorm(n, mu_s, sigma_s) aufrufen
  • Globale Prüfung: ppc_dens_overlay(y, yrep[1:50,])
  • Prüfung von Teststatistiken: ppc_stat(y, yrep, stat='mean')
  • Bayesianischer p-Wert: mean(apply(yrep,1,stat) >= stat(y)) — Werte nahe 0,5 sind gut
  • Verwenden Sie für den Modellvergleich loo::loo_compare()
Kostenlos starten

Lerne R mit einem KI-Tutor — kostenlos

Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.

Kurse
43
Lektionen
159

Häufig gestellte Fragen

Ist die Lektion „Posterior-predictive Checks“ kostenlos?

Ja — der vollständige Text von „Posterior-predictive Checks“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des R Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der R Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Posterior-predictive Checks“?

Validieren Sie die Modellanpassung, indem Sie simulierte und beobachtete Datenverteilungen vergleichen Du übst R Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um R Academy zu starten?

Keine Vorkenntnisse erforderlich. R Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Posterior-predictive Checks“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser R Academy-Lektion Code schreiben und ausführen?

Ja. Jede R Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Einführung in das Bayes-Denken
  2. Stan-Modelle in R schreiben
  3. MCMC-Stichproben und Diagnostik
  4. Posterior-predictive Checks
← Zurück zu R Academy