0Pricing
R Academy · Lektion

MCMC-Stichproben und Diagnostik

Führen Sie Stichproben durch, untersuchen Sie Ketten und interpretieren Sie die Diagnostiken Rhat und ESS

MCMC-Stichproben und Diagnostik ist eine kostenlose R Academy-Lektion auf CoddyKit. Dies ist Lektion 3 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 ist MCMC?

Markov Chain Monte Carlo (MCMC) bezeichnet eine Familie von Algorithmen, mit denen Stichproben aus einer Wahrscheinlichkeitsverteilung gezogen werden, wenn direktes Sampling nicht möglich ist. In der bayesianischen Statistik zieht MCMC Stichproben aus der Posterior-Verteilung P(parameters | data).

RStan implementiert den No-U-Turn-Sampler (NUTS), einen modernen MCMC-Algorithmus.

Ein einfaches Stan-Modell

Ein Stan-Modell ist ein Textblock, der Datentypen, Parameter und die Log-Posterior-Wahrscheinlichkeit definiert. Das einfachste Modell schätzt den Mittelwert einer Normalverteilung mit bekannter Varianz.

# library(rstan)
#
# stan_code <- '
# data {
#   int<lower=0> N;
#   vector[N] y;
# }
# parameters {
#   real mu;
#   real<lower=0> sigma;
# }
# model {
#   mu    ~ normal(0, 10);   // prior
#   sigma ~ exponential(1);   // prior
#   y     ~ normal(mu, sigma); // likelihood
# }
# '

stan() zum Sampling aufrufen

stan(model_code=..., data=..., chains=4, iter=2000, warmup=1000) kompiliert das Modell (einmalig) und zieht anschließend Stichproben. Bei iter=2000 und warmup=1000 erzeugt jede Kette 1000 Stichproben nach der Warm-up-Phase — insgesamt 4000 über 4 Ketten.

# library(rstan)
# options(mc.cores = parallel::detectCores())
#
# y <- c(2.1, 1.8, 2.4, 1.9, 2.3, 2.0, 1.7, 2.2)
# stan_data <- list(N = length(y), y = y)
#
# fit <- stan(
#   model_code = stan_code,
#   data       = stan_data,
#   chains     = 4,
#   iter       = 2000,
#   warmup     = 1000,
#   seed       = 42
# )

print(fit) — Die Übersichtstabelle

print(fit) zeigt für jeden Parameter eine Übersichtstabelle mit Posterior-Mittelwert, Standardabweichung, Quantilen, Rhat und n_eff. Diese beiden Diagnostiken sollten Sie zuerst prüfen.

# print(fit)
#
# Example output:
#       mean se_mean   sd  2.5%   25%   50%   75%  97.5%  n_eff Rhat
# mu    2.05    0.00 0.15  1.76  1.95  2.05  2.15   2.34   3842    1
# sigma 0.22    0.00 0.06  0.13  0.18  0.21  0.25   0.37   3521    1
# lp__  4.38    0.02 1.01  1.60  3.91  4.71  5.18   5.50   2148    1

Das Rhat-Konvergenzkriterium

Rhat (potenzieller Skalenreduktionsfaktor) vergleicht die Varianz innerhalb der Ketten mit der Varianz zwischen den Ketten. Werte nahe 1,0 zeigen an, dass alle Ketten gegen dieselbe Verteilung konvergiert sind.

  • Rhat < 1.01 — konvergiert (aktueller Standard)
  • Rhat > 1.01 — Ketten sind nicht gut durchmischt; führen Sie mehr Iterationen aus
  • Rhat > 1.1 — ernstes Konvergenzproblem
# Check Rhat for all parameters:
# s <- summary(fit)$summary
# rhat_vals <- s[, 'Rhat']
# cat('Max Rhat:', max(rhat_vals, na.rm = TRUE), '
')
# if (any(rhat_vals > 1.01, na.rm = TRUE)) {
#   warning('Convergence issue detected!')
# } else {
#   cat('All Rhat < 1.01 — chains converged
')
# }

n_eff — Effektive Stichprobengröße

n_eff (effektive Stichprobengröße) berücksichtigt die Autokorrelation zwischen aufeinanderfolgenden MCMC-Stichproben. Korrelierte Stichproben enthalten weniger Informationen als unabhängige.

  • n_eff nahe der Gesamtzahl der Iterationen — nahezu unabhängige Stichproben, ausgezeichnet
  • n_eff / total_samples > 0.1 — im Allgemeinen akzeptabel
  • Sehr niedriges n_eff — hohe Autokorrelation; ziehen Sie eine Reparametrisierung des Modells in Betracht
# s <- summary(fit)$summary
# n_eff_vals <- s[, 'n_eff']
# total_samples <- 4 * 1000   # chains * post-warmup iter
# ratio <- n_eff_vals / total_samples
# cat('n_eff ratio (mu)   :', round(ratio['mu'], 2), '
')
# cat('n_eff ratio (sigma):', round(ratio['sigma'], 2), '
')

traceplot() zur visuellen Konvergenzprüfung

traceplot(fit, pars = 'mu') stellt die Stichprobenwerte von mu über die Iterationen für jede Kette dar. Konvergierte Ketten sehen wie eine unscharfe Raupe aus — alle Ketten überlappen sich, ohne Trends oder Drift. Divergierende Ketten bewegen sich unregelmäßig oder bleiben getrennt.

# library(rstan)
#
# traceplot(fit, pars = c('mu', 'sigma'), inc_warmup = FALSE)
#
# Good traceplot characteristics:
# - All 4 chains overlapping completely (same range)
# - No visible drift or trend
# - Rapid mixing (values jump around quickly)
# - No flat regions (stuck sampler)
cat('A healthy traceplot looks like a fuzzy caterpillar
')

pairs() für Posterior-Korrelationen

pairs(fit, pars = c('mu', 'sigma')) zeigt eine Matrix von Streudiagrammen der Posterior-Stichproben. Sie macht Korrelationen zwischen Parametern sichtbar und hebt divergierende Übergänge hervor (rot dargestellt), die auf Bereiche hinweisen, mit denen der Sampler Schwierigkeiten hat.

# pairs(fit, pars = c('mu', 'sigma'))
#
# What to look for:
# - Elliptical clouds: mild correlation (OK)
# - Banana / funnel shapes: reparameterization needed
# - Red dots (divergences): geometry problem in posterior
#   => increase adapt_delta: stan(..., control=list(adapt_delta=0.95))
cat('Red dots in pairs() indicate divergent transitions — investigate!
')

Posterior-Stichproben extrahieren

extract(fit, pars = 'mu')$mu gibt einen numerischen Vektor mit allen Stichproben für mu nach der Warm-up-Phase zurück. Verwenden Sie diese Stichproben, um beliebige Posterior-Zusammenfassungen zu berechnen: Mittelwert, glaubwürdige Intervalle oder die Wahrscheinlichkeit einer Bedingung.

# mu_samples <- extract(fit, pars = 'mu')$mu
# cat('Posterior mean :', mean(mu_samples), '
')
# cat('95% CI:', quantile(mu_samples, c(0.025, 0.975)), '
')
# cat('P(mu > 2):', mean(mu_samples > 2), '
')
# hist(mu_samples, main = 'Posterior of mu', xlab = 'mu', col = 'steelblue')

ShinyStan für interaktive Diagnostik starten

shinystan::launch_shinystan(fit) öffnet eine interaktive Shiny-App mit Traceplots, Posterior-Verteilungen, Paarsplots und NUTS-Diagnostik an einem Ort. Dies ist das umfassendste Werkzeug zur Untersuchung eines RStan-Fits.

# install.packages('shinystan')
# library(shinystan)
#
# shinystan::launch_shinystan(fit)
#
# ShinyStan tabs:
# - Diagnose: Rhat, n_eff, divergences, energy
# - Explore:  marginal posteriors, scatter plots
# - Model:    Stan code, data
# - NUTS:     step size, tree depth per chain

Häufige Maßnahmen zur Verbesserung der Konvergenz

Wenn Rhat > 1.01 ist oder Sie Divergenzen sehen:

  • Erhöhen Sie iter und warmup
  • Erhöhen Sie adapt_delta in Richtung 1,0 (z. B. auf 0.95) in control
  • Parametrisieren Sie neu — verwenden Sie bei hierarchischen Modellen eine nicht-zentrierte Parametrisierung
  • Verwenden Sie engere Priors, wenn diese zu diffus sind
  • Prüfen Sie die Daten — Ausreißer oder Unterschiede in der Skalierung verursachen Probleme für den Sampler
# Re-run with higher adapt_delta to reduce divergences:
# fit2 <- stan(
#   model_code = stan_code,
#   data       = stan_data,
#   chains     = 4,
#   iter       = 4000,
#   warmup     = 2000,
#   control    = list(adapt_delta = 0.95, max_treedepth = 12),
#   seed       = 42
# )

Schnelltest: Rhat-Schwellenwert

Welcher aktuelle Standardschwellenwert für Rhat zeigt an, dass ein Stan-Modell konvergiert ist?

Zusammenfassung: MCMC-Sampling und Diagnostik

Wichtiger RStan-MCMC-Workflow:

  • stan(model_code=..., data=..., chains=4, iter=2000, warmup=1000) passt das Modell an
  • print(fit) zeigt Rhat und n_eff — die wichtigsten Konvergenzdiagnostiken
  • Rhat < 1.01 und n_eff / total > 0.1 weisen auf eine unauffällige Stichprobe hin
  • traceplot() — visuelle Prüfung der Durchmischung; pairs() — zeigt Probleme in der Posterior-Geometrie
  • extract(fit, pars='mu')$mu — Zugriff auf die rohen Posterior-Stichproben
  • shinystan::launch_shinystan(fit) — umfassende interaktive Diagnostik

Häufig gestellte Fragen

Ist die Lektion „MCMC-Stichproben und Diagnostik“ kostenlos?

Ja — der vollständige Text von „MCMC-Stichproben und Diagnostik“ 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 „MCMC-Stichproben und Diagnostik“?

Führen Sie Stichproben durch, untersuchen Sie Ketten und interpretieren Sie die Diagnostiken Rhat und ESS 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 3 von 4.

Wie lange dauert die Lektion „MCMC-Stichproben und Diagnostik“?

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