R Academy · Les

MCMC-steekproeven en diagnostiek

Voer steekproeven uit, inspecteer chains en interpreteer de diagnostieken Rhat en ESS.

Les 3 van 413 stappen

MCMC-steekproeven en diagnostiek is een gratis R Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject R Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus R Academy bevat in totaal 4 lessen.

Wat is MCMC?

Markov Chain Monte Carlo (MCMC) is een verzameling algoritmen om steekproeven te trekken uit een kansverdeling wanneer rechtstreeks samplen onmogelijk is. In de Bayesiaanse statistiek genereert MCMC steekproeven uit de posteriorverdeling P(parameters | data).

RStan implementeert de No-U-Turn Sampler (NUTS), een geavanceerd MCMC-algoritme.

Een eenvoudig Stan-model

Een Stan-model is een tekstblok waarin gegevenstypen, parameters en de log-posteriorverdeling worden gedefinieerd. Het eenvoudigste model schat het gemiddelde van een normale verdeling met bekende variantie.

# 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() aanroepen om te samplen

stan(model_code=..., data=..., chains=4, iter=2000, warmup=1000) compileert het model eenmaal en trekt daarna steekproeven. Met iter=2000 en warmup=1000 produceert elke keten 1000 steekproeven na de opwarmingsfase — in totaal 4000 over 4 ketens.

# 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) — De overzichtstabel

print(fit) toont voor elke parameter een overzichtstabel met het posteriorgemiddelde, de standaardafwijking, kwantielen, Rhat en n_eff. Deze twee diagnostische maten zijn de eerste zaken die je moet controleren.

# 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

Het Rhat-convergentiecriterium

Rhat (factor voor potentiële schaalreductie) vergelijkt de variantie binnen ketens met de variantie tussen ketens. Waarden dicht bij 1,0 geven aan dat alle ketens naar dezelfde verdeling zijn geconvergeerd.

  • Rhat < 1.01 — geconvergeerd (huidige standaard)
  • Rhat > 1.01 — de ketens zijn niet goed gemengd; voer meer iteraties uit
  • Rhat > 1.1 — ernstig convergentieprobleem
# 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 — Effectieve steekproefgrootte

n_eff (effectieve steekproefgrootte) houdt rekening met autocorrelatie tussen opeenvolgende MCMC-steekproeven. Gecorreleerde steekproeven bevatten minder informatie dan onafhankelijke steekproeven.

  • n_eff dicht bij het totale aantal iteraties — vrijwel onafhankelijke steekproeven, uitstekend
  • n_eff / total_samples > 0.1 — over het algemeen acceptabel
  • Erg lage n_eff — sterke autocorrelatie; overweeg het model opnieuw te parametriseren
# 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() voor visuele convergentie

traceplot(fit, pars = 'mu') zet voor elke keten de gesamplede waarden van mu uit tegen de iteraties. Geconvergeerde ketens zien eruit als een wazige rups: alle ketens overlappen elkaar en vertonen geen trends of verschuivingen. Niet-geconvergeerde ketens zwerven rond of blijven van elkaar gescheiden.

# 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() voor posteriorcorrelaties

pairs(fit, pars = c('mu', 'sigma')) toont een matrix met spreidingsgrafieken van de posteriorsteekproeven. Hiermee zie je correlaties tussen parameters en worden divergente transities zichtbaar (rood weergegeven); die geven gebieden aan waar de sampler moeite mee heeft.

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

Posteriorsteekproeven extraheren

extract(fit, pars = 'mu')$mu retourneert een numerieke vector met alle steekproeven na de opwarmingsfase voor mu. Gebruik deze steekproeven om elke gewenste samenvatting van de posteriorverdeling te berekenen: een gemiddelde, geloofwaardige intervallen of de kans op een voorwaarde.

# 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 starten voor interactieve diagnostiek

shinystan::launch_shinystan(fit) opent een interactieve Shiny-app met traceplots, posteriorverdelingen, pairs-grafieken en NUTS-diagnostiek op één plek. Dit is het meest uitgebreide hulpmiddel om een RStan-schatting te verkennen.

# 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

Veelgebruikte oplossingen voor convergentieproblemen

Wanneer Rhat > 1.01 is of je divergenties ziet:

  • Verhoog iter en warmup
  • Verhoog adapt_delta richting 1,0, bijvoorbeeld naar 0,95, in control
  • Parametriseer opnieuw — gebruik een niet-gecentreerde parametrisatie voor hiërarchische modellen
  • Maak a-prioriverdelingen specifieker als ze te weinig informatief zijn
  • Controleer de gegevens — uitschieters of schaalverschillen veroorzaken problemen voor de 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
# )

Snelle controle: Rhat-drempelwaarde

Wat is de huidige standaarddrempelwaarde voor Rhat die aangeeft dat een Stan-model is geconvergeerd?

Samenvatting: MCMC-sampling en diagnostiek

Belangrijke RStan MCMC-werkstroom:

  • stan(model_code=..., data=..., chains=4, iter=2000, warmup=1000) schat het model
  • print(fit) toont Rhat en n_eff — de belangrijkste convergentiediagnostiek
  • Rhat < 1.01 en n_eff / total > 0.1 wijzen op een goed verlopende steekproef
  • traceplot() — visuele controle van de menging; pairs() — maakt problemen met de geometrie van de posteriorverdeling zichtbaar
  • extract(fit, pars='mu')$mu — geeft toegang tot de onbewerkte posteriorsteekproeven
  • shinystan::launch_shinystan(fit) — uitgebreide interactieve diagnostiek
Gratis beginnen

Leer R met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
43
Lessen
159

Veelgestelde vragen

Is de les “MCMC-steekproeven en diagnostiek” gratis?

Ja — je kunt hier op het web alle 3 lessen van het leerpad R Academy, waaronder “MCMC-steekproeven en diagnostiek”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus R Academy bevat in totaal 4 lessen.

Wat leer ik in “MCMC-steekproeven en diagnostiek”?

Voer steekproeven uit, inspecteer chains en interpreteer de diagnostieken Rhat en ESS. Je oefent met R Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met R Academy te beginnen?

Ervaring vooraf is niet nodig. R Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.

Hoe lang duurt de les “MCMC-steekproeven en diagnostiek”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over R Academy?

Ja. Elke les over R Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Inleiding tot Bayesiaans denken
  2. Stan-modellen schrijven in R
  3. MCMC-steekproeven en diagnostiek
  4. Posterior-predictive checks
← Terug naar R Academy