Posterior-prediktive kontroller
Valider modelltilpasningen ved å sammenligne simulerte og observerte datafordelinger.
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 modelppc_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 misfitFlere bayesplot-funksjoner for PPC
bayesplot tilbyr mange PPC-visualiseringer utover overlappende tettheter:
ppc_hist(y, yrep[1:8,])— rutenett med histogrammerppc_scatter_avg(y, yrep)— spredningsplott av observerte verdier mot gjennomsnittet av yrepppc_intervals(y, yrep)— usikkerhetsintervaller rundt hver observasjonppc_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] matrixKryssvalidering 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 reliableBeste 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-checkHurtigsjekk: 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
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
- Introduksjon til bayesiansk tenkning
- Skrive Stan-modeller i R
- MCMC-trekking og diagnostikk
- Posterior-prediktive kontroller