A Bayesi frissítés rácson alfejezetben rácsos posteriorral becsültük egy Bernoulli-folyamat siker-valószínűségét. Most nem elégszünk meg a pontbecsléssel: intervallumot és modell-ellenőrzést készítünk.
A konkrét bemenet a 15 elemű megfigyelt sorozat:
A megfigyelési egység egyetlen bináris kimenet (0 vagy 1). Az elemű mintában siker és 9 kudarc van. A cél:
Mielőtt a kódot megnéznéd, adj magadnak gyors becslést. A flat priorral a Bayesi frissítés rácson szerint a posterior Beta, várható értéke . A 15 új megfigyelés várható sikere tehát , a megfigyelt ennek közelében van. A 95%-os intervallum nagyságrendje a posterior Beta-szórása alapján körülbelül lehet; ezt a kódban ellenőrizzük.
A bayesi keretben a paraméter valószínűségi változó. A posterior sűrűség azt fejezi ki, hogy a prior és a likelihood együttes elfogadása után mely -értékek a legplauzibilisebbek. Egy szintű credible interval, magyarul hiteles intervallum, olyan tartomány, amelyre
A leggyakoribb, kvantilisen alapuló változat az equal-tailed interval: a posterior eloszlás és kvantilise határolja. Ha a posterior sűrűséget a rácson diszkréten ismerjük, akkor a kumulált tömegek alapján keressük meg a kvantiliseket:
A Bayesi frissítés rácson rácsos feladatában
flat priorral a posterior
Beta.
A pontos equal-tailed 95%-os intervallum a SciPy
beta.ppf([0.025, 0.975], 7, 10) hívásával kapható meg; az
ott megadott ponthoz közeli rácspont pedig a normalizált posteriorból
kereshető ki. A két értéknek
nagyságrendű rácshibán belül egyeznie kell.
Az equal-tailed intervallum nem az egyetlen választás. A highest posterior density interval (HPDI) azt a legrövidebb tartományt keresi, amelyre a posterior tömeg , ezért ferde eloszlásnál eltérhet az equal-tailed változattól. Itt a Beta csak enyhén ferde, ezért a különbség kicsi; a tanulási célhoz az equal-tailed kvantilisintervallum egyszerűbb és közvetlenül kapcsolódik a Standard error és konfidenciaintervallum alfejezetben használt kvantilis fogalmához.
A bayesi intervallum állítása feltételes a priorra és a modellre: adott mellett a posterior valószínűség , hogy az intervallumban van. Ez nem ugyanaz, mint a konfidenciaintervallum ismételt mintavételes lefedettségi garanciája. A különbséget érdemes azonnal kimondani, még a kód előtt:
| Kérdés | 95% credible interval | 95% confidence interval |
|---|---|---|
| Mit állít? | A posterior szerint 0.95 valószínűséggel az intervallumban van | Az eljárás ismételt mintavételnél 95%-ban tartalmazza a rögzített -t |
| Függ a priortól? | Igen | Nem |
| Garancia rögzített -re? | Csak ha a prior-modell együttesen kalibrált | Igen, a statisztikai feltételek mellett |
A kettő tehát nem automatikusan felcserélhető, még akkor sem, ha egy adott példában a számértékük hasonló.
A posteriorból nemcsak a paraméterre, hanem új megfigyelésre is tehetünk valószínűségi állítást. Egy új megfigyelés posterior predictive eloszlása a likelihood posterior szerinti keveréke:
A keverés miatt nem elég p-t a posterior átlaggal vagy
módusszal helyettesíteni, mert akkor elvész a paraméterbizonytalanság.
Egyetlen új Bernoulli-megfigyelésre a posterior átlag jelenik meg:
Ha viszont új elemű összeget tekintünk, akkor a béta-posteriorral a sikerösszeg eloszlása béta-binomiális:
Ennek várható értéke , de a varianciája nagyobb, mint egy rögzített melletti eloszlás varianciája, mert a bizonytalansága is hozzáadódik.
A prior predictive eloszlás ugyanezt a keveréket az adat megfigyelése előtt, a priorral számítja:
Ez a prior ellenőrzésére szolgál: mielőtt a likelihood frissítené a modellt, megmutatja, milyen adatokat tart a prior eleve valószínűnek. Flat Beta prior esetén a 15 kísérletből álló sikerösszeg prior predictive eloszlása egyenletes:
Ez jól ellenőrizhető kézi invariant: a flat prior nem részesít előnyben semmilyen sikergyakoriságot, ezért a lehetséges 16 összeg mindegyike ugyanolyan plauzibilis.
A posterior predictive check (PPC) a modell illeszkedését a következő módon vizsgálja. Minden replikációban:
Itt két statisztikát használunk. Az első a sikerösszeg:
amely az átlagos szintet ellenőrzi. A második a leghosszabb egyesekből álló futam hossza, ; ez érzékeny arra, ha a generált sorozatban a sikerek csomósodnak vagy éppen túl szabályosan váltakoznak. A PPC lokális -értéke, a , azt méri, hogy a replikált statisztikák mekkora része éri el a megfigyelt értéket:
A vagy azt jelzi, hogy a megfigyelt adat a posterior predictive eloszlás valamelyik szélére esik, tehát a modell az adott statisztikát rosszul írja le. A azonban nem klasszikus nullhipotézis-p-érték: ugyanazt az adatot használja a posterior illesztéséhez és az ellenőrzéshez is, ezért a gyakorisági kalibrációja nem automatikus. Kétoldali diagnosztikaként a érték szolgálhat, de küszöb helyett a modellhibák közötti rangsorolásra érdemes használni.
A calibration szó itt két dolgot jelenthet. Az egyik a posterior predictive intervallumok kalibrációja: ha a paramétert valóban a priornak megfelelően sorsoljuk, az adatot a likelihood szerint generáljuk, majd a posteriorból 95%-os predikciós intervallumot készítünk, a jövőbeli megfigyelés a sok ismétlés során közel 95%-ban esik bele. Ez a joint prior-data folyamatra vonatkozó állítás. Egy rögzített, ismeretlen mellett viszont egy credible interval nem garantál frekventista lefedettséget; ezt az alábbi gyakori tévedésnél számpéldával is megmutatjuk. A másik jelentés a prediktív valószínűségek pontossága: akkor nevezzük jól kalibráltnak a modellt, ha az 50%-os valószínűséggel jelzett események körülbelül 50%-ban következnek be.
A következő, NumPy/SciPy alapú minimal script a rácsos posteriorból kiindulva számítja ki a credible intervalt, generál posterior predictive replikációkat, és két PPC-statisztikát hasonlít össze. A labor környezetében, a projekt gyökeréből futtatható:
# Linux/macOS terminál, a tankönyvi lab projekt gyökerében
uv run python ppc_grid.py# Windows PowerShell, a projekt gyökerében
uv run python ppc_grid.pyA kód kimenetét itt nem ellenőrzött futtatásként közöljük; a seed megismételhetőséget segít egy gépen belül, de nem garantál bitazonos eredményt minden NumPy-verzión.
import numpy as np
from scipy.stats import beta as beta_dist
rng = np.random.default_rng(20261020)
y_obs = np.array([0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1])
n = len(y_obs) # 15
s = int(y_obs.sum()) # 6
def longest_run(x: np.ndarray) -> int:
best = cur = 0
for v in x:
if v == 1:
cur += 1
best = max(best, cur)
else:
cur = 0
return best
# Rácsos posterior: flat Beta(1,1) prior
grid = np.linspace(0.0, 1.0, 2001)
prior = np.ones_like(grid)
lik = grid**s * (1.0 - grid) ** (n - s)
post = prior * lik
post /= post.sum() # normalizálás: sum(post) == 1
# 95%-os equal-tailed credible interval a rácsból
cdf = np.cumsum(post)
lo = grid[int(np.searchsorted(cdf, 0.025))]
hi = grid[int(np.searchsorted(cdf, 0.975))]
# Posterior predictive replikációk
S = 5000
p_draws = rng.choice(grid, size=S, p=post) # shape: (S,)
y_rep = rng.binomial(1, p_draws[:, None], size=(S, n)) # shape: (S, 15)
sum_rep = y_rep.sum(axis=1) # shape: (S,)
run_rep = np.array([longest_run(row) for row in y_rep]) # shape: (S,)
t1_obs = s
t2_obs = longest_run(y_obs)
p_b_sum_right = float(np.mean(sum_rep >= t1_obs))
p_b_run_right = float(np.mean(run_rep >= t2_obs))
p_b_sum_two = float(2.0 * min(p_b_sum_right, 1.0 - p_b_sum_right))
p_b_run_two = float(2.0 * min(p_b_run_right, 1.0 - p_b_run_right))
print(f"posterior mean: {np.sum(grid * post):.4f} (elvárás: {7/17:.4f})")
print(f"grid CI: [{lo:.3f}, {hi:.3f}]")
print(f"Beta(7,10) CI: {beta_dist.ppf([0.025, 0.975], 7, 10).round(3)}")
print(f"pred. sum mean: {sum_rep.mean():.2f} (elvárás: {n*7/17:.2f})")
print(f"observed: sum={t1_obs}, longest_run={t2_obs}")
print(f"PPC sum: right={p_b_sum_right:.3f}, two-sided={p_b_sum_two:.3f}")
print(f"PPC run: right={p_b_run_right:.3f}, two-sided={p_b_run_two:.3f}")A kód minden replikációban a posteriorból sorsol p-t,
majd abból generálja a 15 Bernoulli-megfigyelést. A replikált sorok
száma
,
az oszlopok száma
,
tehát a replikáció nem változtatja meg az eredeti megfigyelési egységet.
A statisztikák közül sum_rep a sikerösszeg,
run_rep a leghosszabb sikeres futam.
A kód futtatása nélkül is rögzíthetők az elméletileg várt ellenőrző pontok:
post /= post.sum() lépés után; a float
kerekítés miatt
nagyságrendű eltérés elfogadható.np.sum(grid * post) a
Beta
várható értékéhez,
-hoz
tart. A rács és a folytonos béta közötti numerikus eltérés tipikusan
alatt marad.beta.ppf
intervallumhoz közelinek kell lennie; a rácshiba a 2001 pontból adódóan
kisebb
-nél.
A megfigyelt
a prediktív átlag alatt van, de a prediktív szórás tartományában.A PPC-számok értelmezésénél ne egyetlen gépi küszöböt nézzünk. Ha
például a p_b_sum_two 0.2 és 0.8 között van, a sikerösszeg
nem mutat durva ütközést a modellel. Ha viszont a leghosszabb futamra a
kétoldali érték 0.05 alá esik, akkor a modell nem jól ragadja meg a
megfigyelt sorozat szomszédsági mintázatát; ilyenkor érdemes az időbeli
függőséget vagy az egyenlő valószínűség feltételét gyanúba fogni. A
p_B tehát diagnosztika, nem a parameter igazságáról szóló
döntés.
Intervallumértelmezés: a 95%-os credible interval a modell és a prior feltételei mellett 95% posterior tömeget tartalmaz. Ettől különbözik a gyakorisági konfidenciaintervallum lefedettségi állítása. A posterior predictive check modellspecifikációs diagnosztika, nem az általános modelligazság igazolása.
1. Értelmezés. A futás után a 95%-os equal-tailed credible interval körülbelül . Kollégád ezt mondja: „Ebből következik, hogy a valódi 95% valószínűséggel 0.20 és 0.64 között van, tehát ha 100 hasonló mintát gyűjtenénk, akkor 95 ilyen intervallum tartalmazná a valódi -t.” Melyik mondatrész igaz, melyik hamis? Pontosan nevezd meg, milyen feltétel mellett igaz az első rész, és miért nem következik belőle a második.
2. Megvalósítás. Írj egy
quantile_interval(post, grid, level) függvényt, amely adott
level mellett equal-tailed credible intervalt ad vissza.
Futtasd 80%-os szinten, és növeld a posterior predictive replikációk
számát
-re.
Ellenőrizd a p_draws, y_rep,
sum_rep alakját, és add meg mindkét PPC-statisztika jobb
oldali és kétoldali értékét. Az input a fenti y_obs és a
flat prior.
3. Hibakeresés. Az alábbi kódrészlet a posterior predictive eloszlást a posterior móduszával próbálja generálni:
p_map = grid[np.argmax(post)]
y_wrong = rng.binomial(1, p=p_map, size=(S, n))
wrong_mean = y_wrong.sum(axis=1).mean()
print(wrong_mean)Mi a statisztikai hiba? Melyik varianciatag hiányzik a generált eloszlásból? Milyen következménye lehet ennek a PPC-re? Javítsd úgy a sort, hogy a posterior bizonytalanságát is megőrizze.
4. Transzfer megváltozott priorra. Ismételd meg a teljes számítást a szkeptikus Beta priorral, amelynek sűrűsége arányos -nel. Mi lesz a posterior család és a posterior predictive sikerösszeg várható értéke? Hasonlítsd össze a flat és a szkeptikus prior predictive eloszlást is a 15 kísérletből álló, még nem látott mintára. Az eredmény hogyan változtatja meg a megfigyelt értelmezését?
1. A mondat első fele a bayesi Markov-feltételekkel pontosítható: ha elfogadjuk a Beta priort és a Bernoulli-likelihoodot, akkor adott mellett a posterior valószínűség , hogy . Ez posterior valószínűségi állítás a paraméterről. A második fele hamis: abból, hogy a posterior tömeg 95%-ot ad az intervallumnak, nem következik, hogy az eljárás rögzített, ismeretlen mellett ismételt mintavételnél 95%-os lefedettséget ad. A konfidenciaintervallum lefedettsége az eljárás ismételt tulajdonsága, és nem függ a priortól; a credible interval ezt nem garantálja. A két fogalom tehát más kérdésre válaszol.
2. Lehetséges megoldás:
def quantile_interval(post, grid, level):
lo_q = (1.0 - level) / 2.0
hi_q = 1.0 - lo_q
cdf = np.cumsum(post)
lo = grid[int(np.searchsorted(cdf, lo_q))]
hi = grid[int(np.searchsorted(cdf, hi_q))]
return lo, hi
lo80, hi80 = quantile_interval(post, grid, 0.80)
print(f"80% grid CI: [{lo80:.3f}, {hi80:.3f}]")
print("80% Beta CI:", beta_dist.ppf([0.10, 0.90], 7, 10).round(3))
S = 10000
p_draws = rng.choice(grid, size=S, p=post)
y_rep = rng.binomial(1, p_draws[:, None], size=(S, n))
sum_rep = y_rep.sum(axis=1)
assert p_draws.shape == (S,)
assert y_rep.shape == (S, n)
assert sum_rep.shape == (S,)
p_b_right = float(np.mean(sum_rep >= s))
p_b_two = 2.0 * min(p_b_right, 1.0 - p_b_right)
print(f"PPC sum: right={p_b_right:.3f}, two-sided={p_b_two:.3f}")A 80%-os intervallum szűkebb, mint a 95%-os, mert a posterior eloszlás középső tömegét fogja közre; a megfigyelt adat nem változott. A replikációk alakja a befoglaló mátrix dimenzióival ellenőrizhető.
3. A p_map a posterior módusza, azaz
egyetlen legvalószínűbb pont. Ha minden replikációt ezzel az egy
értékkel generálunk, akkor valójában
eloszlást kapunk, nem a posterior predictive-eloszlást. A
béta-binomiális varianciája két tagra bomlik:
ahol az első tag a mintavételi zaj, a második a paraméter posterior
bizonytalansága. A rögzített
mellett a második tag nulla, ezért a szórás alulbecsült lesz. A PPC-ben
ez mesterségesen szűk prediktív eloszlást ad, és a megfigyelt
statisztikát indokolatlanul szélsőségesnek mutathatja. A javítás az,
hogy p-t a teljes posteriorból sorsoljuk:
p_draws = rng.choice(grid, size=S, p=post)
y_rep = rng.binomial(1, p_draws[:, None], size=(S, n))Az így kapott eloszlás már a posterior predictive-et közelíti.
4. A szkeptikus prior sűrűsége , ami Beta. A likelihood továbbra is . A posterior tehát arányos -nel, ami Beta. Várható értéke:
A 15 jövőbeli elemű posterior predictive sikerösszeg várható értéke
.
A prior predictive eloszlás flat priorral az egyenletes
eloszlás, várható értéke
.
A szkeptikus prior predictive
Beta-binomiális,
várható értéke
.
A prior tehát alapból kevés sikert tart plauzibilisnek; a megfigyelt
ebben a keretben már nem a prediktív eloszlás alsó oldala, hanem a
szkeptikus prior utáni posteriorhoz képest kissé magasabb, kevésbé
szélsőséges érték. A kódban ezt például a
scipy.stats.betabinom.pmf segítségével ellenőrizhetjük:
from scipy.stats import betabinom
k_vals = np.arange(n + 1)
prior_pred_flat = betabinom.pmf(k_vals, n, 1, 1) # közel egyenletes
prior_pred_skept = betabinom.pmf(k_vals, n, 1, 4)
post_pred_skept = betabinom.pmf(k_vals, n, 7, 13)
print("prior pred mean flat: ", float(np.sum(k_vals * prior_pred_flat)))
print("prior pred mean skept: ", float(np.sum(k_vals * prior_pred_skept)))
print("post pred mean skept: ", float(np.sum(k_vals * post_pred_skept)))A kézi kontroll szerint 7.5, 3.0 és 5.25 körüli értékeket várunk.
A leggyakoribb hiba az, hogy a credible intervalt automatikusan konfidenciaintervallumként értelmezzük. Ellenpélda: tegyük fel, hogy a prior degenerált, azaz teljes tömegét egyetlen pontra teszi. Ekkor bármilyen adat után a 95%-os credible interval is a pont. Ha a valódi , akkor ez az intervallum ráadásul soha nem tartalmazza a paramétert, tehát az ismételt mintavételes lefedettsége 0. A posterior állítás a modellen belül továbbra is „igaz”, de a prior hibás volt a külvilághoz képest. Ezért a credible interval nem állít frekventista lefedettséget, és a konfidenciaintervallum sem állít posterior valószínűséget.
A második hiba a PPC-p-érték mechanikus 0.05-ös küszöbölése. A nem nullmodell szerinti p-érték, és ugyanaz az adat kétszeresen szerepel: először a posterior illesztésében, másodszor az ellenőrzésben. Ezért a eloszlása akkor sem feltétlenül egyenletes, ha a modell igaz. A gyakorlatban a nagyon kicsi vagy nagyon nagy érték irányíthatja a figyelmet a modellhibára, de döntési küszöbként nem ugyanolyan státuszú, mint a Standard error és konfidenciaintervallum kontrollált ismételt mintavételes eljárása.
A credible interval a posterior kvantiliseiből készített tartomány: flat priorral a Beta posterior 95%-os intervalluma körülbelül . A posterior predictive eloszlás a likelihood posterior szerinti keveréke; 15 új Bernoulli-megfigyelés sikerösszegének várható értéke . A prior predictive a prior ellenőrzésére való, flat priorral egyenletes sikerösszeget ad. A PPC replikált adatokat generál a posteriorból, és két statisztikát, itt a sikerösszeget és a leghosszabb futást veti össze. A diagnosztikai érték, nem klasszikus p-érték. A credible és confidence interval értelmezése különbözik. Következő alkalmazásként a PyMC modell és MCMC diagnosztika alfejezetben ugyanezt PyMC és MCMC segítségével ismételjük meg.