R Academy · leksjon

Posterior-prediktive kontroller

Valider modelltilpasningen ved å sammenligne simulerte og observerte datafordelinger.

Leksjon 4 av 413 trinn

Posterior-prediktive kontroller er en gratis leksjon i R Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i R Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i R Academy inneholder totalt 4 leksjoner.

Hva er posteriorprediktive kontroller?

Etter at De har tilpasset en bayesiansk modell, må De spørre: genererer denne modellen data som ligner på dataene De observerte? Posteriorprediktive kontroller (PPC-er) svarer på dette ved å simulere replikerte datasett yrep fra posteriorfordelingen og sammenligne dem grafisk med de observerte dataene y.

Hente ut posteriorutvalg

extract(fit, pars='mu') returnerer en navngitt liste; $mu er en numerisk vektor med alle utvalg etter oppvarmingen for parameteren. Med 4 kjeder × 1000 iterasjoner etter oppvarmingen får De 4000 utvalg.

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

Generere yrep fra posteriorutvalg

For hvert posteriorutvalg (mu_s, sigma_s) simulerer De et replikert datasett med samme størrelse som de opprinnelige dataene. Lagre disse i en matrise yrep, der hver rad er ett simulert datasett.

# 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() — sammenligning av tettheter

bayesplot::ppc_dens_overlay(y, yrep[1:50,]) legger kjernetettheten til de observerte dataene (mørk linje) oppå tetthetene fra 50 tilfeldig valgte simulerte datasett (lyse linjer). God modelltilpasning betyr at den mørke linjen ligger innenfor skyen av lyse linjer.

# 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() — kontroll av teststatistikk

ppc_stat(y, yrep, stat = 'mean') viser et histogram over teststatistikken (for eksempel gjennomsnittet) beregnet for hvert simulerte datasett, med en vertikal linje ved den observerte teststatistikken. Hvis den observerte verdien ligger i hoveddelen av histogrammet, fanger modellen opp dette aspektet ved dataene.

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

Bayesiansk p-verdi

Den bayesianske p-verdien (posteriorprediktiv p-verdi) er andelen simulerte datasett der teststatistikken er mer ekstrem enn den observerte verdien. Verdier nær 0,5 indikerer god kalibrering; verdier nær 0 eller 1 indikerer at modellen ikke passer for denne teststatistikken.

# 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

Flere bayesplot-funksjoner for PPC

bayesplot tilbyr mange PPC-visualiseringer utover overlappende tettheter:

  • ppc_hist(y, yrep[1:8,]) — rutenett med histogrammer
  • ppc_scatter_avg(y, yrep) — spredningsplott av observerte verdier mot gjennomsnittet av yrep
  • ppc_intervals(y, yrep) — usikkerhetsintervaller rundt hver observasjon
  • ppc_rootogram(y, yrep) — for telledata
# 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)

Tolke PPC-plott — dårlig modelltilpasning

Vanlige mønstre ved dårlig tilpasning og deres årsaker:

  • yrep er for bredt — prioren er for diffus, eller modellen har for stor spredning
  • yrep er forskjøvet — feil likelihood-familie (for eksempel normalfordeling for skjevfordelte data)
  • yrep mangler multimodalitet — det trengs en blandingsmodell
  • yrep gjengir ikke ekstreme verdier — det trengs en fordeling med tunge haler
# 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-er i Stan-modellblokken

De kan generere yrep direkte i Stan ved hjelp av blokken generated quantities. Dette unngår at parametere må hentes ut på nytt i R, og er beregningsmessig ekvivalent.

# 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

Kryssvalidering ved å utelate én observasjon

I tillegg til PPC-er beregner loo::loo(fit) kryssvalidering ved å utelate én observasjon for å sammenligne konkurrerende modeller. Modellen med høyest ELPD (forventet logaritmisk prediktiv tetthet) foretrekkes. Bruk loo::loo_compare(loo1, loo2) for å rangere modellene.

# 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

Beste praksis for PPC

Følg denne praksisen for grundige posteriorprediktive kontroller:

  • Start alltid med ppc_dens_overlay() som en overordnet rimelighetskontroll
  • Følg opp med domenespesifikke statistikker (ppc_stat()) som er relevante for analyseformålene
  • Bruk minst 50 yrep-utvalg til visuelle kontroller, og alle 4000 til bayesianske p-verdier
  • Mislykkede PPC-er gir veiledning for modellforbedring — de er diagnostiske, ikke et nederlag
# 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

Hurtigsjekk: Tolkning av bayesiansk p-verdi

Hva betyr en bayesiansk p-verdi på 0,03 for maksimumsstatistikken for modellen?

Oppsummering av posteriorprediktive kontroller

Arbeidsflyt for PPC i RStan og bayesplot:

  • Hent utvalg: extract(fit, pars='mu')$mu
  • Generer yrep: gå gjennom posteriorutvalgene i en løkke og kall rnorm(n, mu_s, sigma_s)
  • Overordnet kontroll: ppc_dens_overlay(y, yrep[1:50,])
  • Kontroll av statistikk: ppc_stat(y, yrep, stat='mean')
  • Bayesiansk p-verdi: mean(apply(yrep,1,stat) >= stat(y)) — nær 0,5 er bra
  • Bruk loo::loo_compare() til modellsammenligning
Gratis å komme i gang

Lær deg R med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
43
Leksjoner
159

Ofte stilte spørsmål

Er leksjonen «Posterior-prediktive kontroller» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien R Academy, inkludert «Posterior-prediktive kontroller», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i R Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Posterior-prediktive kontroller»?

Valider modelltilpasningen ved å sammenligne simulerte og observerte datafordelinger. Du øver på R Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med R Academy?

Ingen tidligere erfaring er nødvendig. R Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.

Hvor lang tid tar leksjonen «Posterior-prediktive kontroller»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne R Academy-leksjonen?

Ja. Alle R Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Introduksjon til bayesiansk tenkning
  2. Skrive Stan-modeller i R
  3. MCMC-trekking og diagnostikk
  4. Posterior-prediktive kontroller
← Tilbake til R Academy