A Northstar kísérleti projekt mintájára egy szintetikus
Bernoulli-kimenetet elemzünk: a kezelési ág egy kis kohorszában a 7
napos konverzió (conversion_7d) értéke 0 vagy 1. A
megfigyelési egység ügyfél, az adat-összegzés egyetlen eseménysorozatot
ad:
Itt a konverziók száma, a kezelt ügyfelek száma. A kérdéses paraméter : a kezelési ág konverziós valószínűsége, dimenzió nélküli valószínűség. A cél a feletti normalizált posterior-sűrűség kiszámítása rácsos közelítéssel, két eltérő priorral. Előzetes becslés a Paraméter, becslő és likelihood maximum likelihood gondolatából: a mintaarány , tehát a posterior módusz körül várható; flat priorral a posterior várható érték -nél kissé nagyobb lesz, mert a balra korlátos tartomány aszimmetriája felfelé húz.
Az alábbi kódok futtathatók, de az itt közölt numerikus kimenetek elméletileg várt, szemléltető értékek; e szöveg írásakor nem futott Python-kód. A tanuló saját futtatása az ellenőrzés.
Prior (a priori eloszlás). A prior a paraméter feletti bizonytalanságunkat fejezi ki az adat megtekintése előtt. Sűrűség: , . Két példát használunk:
A Beta prior alakja:
Itt a prior „mintanagyság-ereje”: nagyobb összeg szűkebb, határozottabb priort jelent.
Likelihood. A Bernoulli-mintához tartozó likelihood a függvénye, ahol az adat rögzített:
A teljes binomiális valószínűség ennek -szorosa. A tényező -től független konstans, ezért a posterior normalizálásánál kiesik; elég a likelihood-magot, -t használni. A likelihood nem valószínűségi eloszlás felett: integrálja általában nem 1. Az , adatnál a kernel -nél körülbelül , -nél ; a hányados , tehát az adat önmagában a -et jobban támogatja, mint a -et.
Posterior (a posteriori eloszlás). Bayes tétele alapján a posterior-sűrűség arányos a prior és a likelihood szorzatával:
A normalizáló konstans, más néven marginális likelihood / evidence. Az itt használt kernel esetén a kernel-evidence; a teljes binomiális evidenciához a tényezőt is meg kell szorozni.
Normalizálás (normalization). A folytonos integrált egy pontból álló, és közötti egyenletes rácson közelítjük:
Minden rácspontban kiszámítjuk az unnormalizált posterior értéket:
A normalizáló konstans trapézszabállyal közelítve:
A normalizált posterior:
Ekkor . A normalizálás nélkül görbe formája azonos, de a magasság nem sűrűség, és a posterior várható érték vagy intervallum hibásan súlyozott értéket adna.
Predictive (posterior prediktív eloszlás). Egy új, a mintától független kezelt ügyfél sikerének valószínűsége, feltéve a modellt és a múlt adatot:
Rácson ez a posterior várható értéke:
trapezoid(grid * posterior, grid). A prediktív valószínűség
tehát nem a
kimenet, hanem a siker valószínűségének posterior-átlaga. Ez a mennyiség
a paraméterbizonytalanságot átlagolja ki, nem az egyedi
zaját adja meg; utóbbihoz a teljes posterior prediktív eloszlás
tartozik.
A posterior credible interval (bayesi hitelességi intervallum) adott és prior mellett a posterior tömeg 95%-át tartalmazza. Ez más értelmezés, mint a Standard error és konfidenciaintervallum alfejezetbeli konfidenciaintervallum ismételt mintavételi lefedettségi állítása.
A kód Python 3.12-t, NumPy-t és SciPy-t igényel; a lab
projektgyökeréből uv sync után
uv run python s073_grid_bayes.py módon futtatható. Ha már
van lock, használjon uv run --locked-ot. A kód egyszerre
számítja a két priort és a minta növelésének hatását.
import numpy as np
from scipy.integrate import trapezoid
grid = np.linspace(0.0, 1.0, 1001)
step = grid[1] - grid[0]
def kernel(p_grid, k, n):
return p_grid**k * (1.0 - p_grid)**(n - k)
def posterior_on_grid(prior, k, n):
unnorm = prior * kernel(grid, k, n)
z = trapezoid(unnorm, grid)
return unnorm / z
def posterior_mean(post):
return trapezoid(grid * post, grid)
def equal_tail_interval(post, alpha=0.05):
# Trapézonkénti területekből CDF, majd lineáris kvantiliskeresés.
areas = 0.5 * (post[:-1] + post[1:]) * np.diff(grid)
cdf = np.concatenate(([0.0], np.cumsum(areas)))
cdf[-1] = 1.0
lo = np.interp(alpha / 2, cdf, grid)
hi = np.interp(1.0 - alpha / 2, cdf, grid)
return lo, hi
flat_prior = np.ones_like(grid)
skeptical_prior = 4.0 * (1.0 - grid)**3 # Beta(1,4), normált sűrűség
for name, prior in [("flat", flat_prior), ("skeptical Beta(1,4)", skeptical_prior)]:
post = posterior_on_grid(prior, 6, 15)
print(name,
"mean=%.6f" % posterior_mean(post),
"95% CI=", tuple(round(v, 4) for v in equal_tail_interval(post)),
"normalization_error=%.1e" % (trapezoid(post, grid) - 1.0))
print("\nA minta növelése, rögzített k/n = 0.4 aránnyal:")
for k, n in [(6, 15), (24, 60), (240, 600)]:
mean_flat = posterior_mean(posterior_on_grid(flat_prior, k, n))
mean_skep = posterior_mean(posterior_on_grid(skeptical_prior, k, n))
print(f"n={n:4d} k={k:3d} flat_mean={mean_flat:.4f} skeptical_mean={mean_skep:.4f}")
# A posterior görbék ábrája, ha vizuális ellenőrzés is kell:
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(7, 4))
for name, prior in [("flat", flat_prior), ("skeptical Beta(1,4)", skeptical_prior)]:
post = posterior_on_grid(prior, 6, 15)
ax.plot(grid, post, label=name)
ax.set_xlabel("p: konverziós valószínűség")
ax.set_ylabel("Posterior-sűrűség")
ax.set_title("n=15, k=6: két prior posteriorja")
ax.legend()
plt.tight_layout()
plt.show()A kód kimenete analitikusan ellenőrizhető:
A posterior várható értékek:
| prior | posterior | várható érték |
|---|---|---|
| flat Beta | Beta | |
| szkeptikus Beta | Beta |
A flat prior posterior módusza , pontosan a mintaarány. A szkeptikus prior módusza ; a prior a felől húzza felfelé az adat -ét.
A minta növelése rögzített arány mellett:
| n | k | flat posterior várható értéke | szkeptikus posterior várható értéke |
|---|---|---|---|
| 15 | 6 | ||
| 60 | 24 | ||
| 600 | 240 |
A két prior közötti különbség -nél , -nál már csak körüli; a minta növekedésével a prior hatása eltűnik, de a priorválasztás továbbra is explicit marad.
Kézi kontroll: a
Beta
és
Beta
sűrűség integrálja 1, tehát a rácsos posterior normalizáltsága az
-től
való eltérés
nagyságrendben várható. Az unnormalizált posterior shape-e
a griddel egyező (1001,), dtype
float64, minden érték nemnegatív, a tömeg a
–
tartományban koncentrálódik. A posterior módusz a grid finomságától
függően a maximum indexénél kereshető; a lineáris kvantilisintervallum
pontosságát a step = 0.001 rács korlátozza, tehát a
credible interval határait legfeljebb néhány ezrelék hibával érdemes
jelenteni.
Fontos: ez a posterior a kezelési ág konverziós valószínűségét becsli, nem önmagában az oksági hatást. A kontrollággal való ATE-összehasonlítás a randomizálás és az Oksági cél és megfigyelési torzítás alfejezetbeli azonosítási feltételek témája. A posterior paraméterbizonytalanság, a prediktív valószínűség a paraméter átlaga egy új ügyfélnél, a szimulációs hiba pedig a Predikciós, paraméter- és Monte Carlo intervallum alfejezetben bevezetett harmadik bizonytalanságfajta; itt nincs Monte Carlo-ismétlés, ezért szimulációs standard hibát nem számolunk.
Rácsközelítés: a posterior rácson számított diszkrét súlyait a teljes összeggel kell normalizálni; a rács felbontása és szélei ellenőrizendők. A priori megválasztása nem puszta technikai részlet, ezért érzékenységi vizsgálat ajánlott.
Értelmezés: A flat priorral kapott posterior Beta módusza , várható értéke . Miért tér el a kettő, és miért a mintaarány a módusz? Indokolja a Beta-módusz és -átlag képletéből.
Implementálás: Írjon
posterior_summary(prior, k, n) függvényt, amely a fenti
grid-et használja, normalizálja a posterior-t, és visszaad
egy (posterior, mean, mode, lo, hi) rendezett ötöst, ahol
mode a legnagyobb posterior-sűrűségű rácspont,
lo és hi a 95%-os equal-tailed intervallum.
Ellenőrizze a normalizáltságot
hibahatárral. Futtassa
,
flat priorral; adja meg a várt mean és mode
értéket.
Hibadiagnózis: Egy elemző a , flat prior esetben így „átlagol”:
unnorm = flat_prior * kernel(grid, 6, 15)
mean_wrong = trapezoid(grid * unnorm, grid)
evidence_wrong = trapezoid(unnorm, grid)Mi a két hiba? Miért nem a posterior várható érték a
mean_wrong, és miért nem teljes binomiális evidence az
evidence_wrong? Számítsa ki a javítást, és adja meg a flat
priorral a teljes binomiális marginális likelihood pontos értékét
esetén.
Megváltoztatott prior / transzfer: Ugyanaz a minta, , de a prior most optimista Beta sűrűség, . Írja fel a posterior Beta-paramétereit, várható értékét és móduszát. Mit tapasztal? Ismételje meg mellett, és fogalmazza meg, hogyan függ a prior hatása a minta nagyságától.
A Beta módusz, ha : . Itt , tehát módusz . A likelihood kernel deriváltjának elsőrendű feltétele , ami szintén -et ad flat prior mellett. A várható érték ; a sűrűség jobb széle hosszabb, ezért az átlag felfelé tolódik a móduszhoz képest. A módusz a legvalószínűbb paraméterpont, az átlag a posterior szerinti valószínűséggel súlyozott p-átlag.
Lehetséges implementáció:
def posterior_summary(prior, k, n):
post = posterior_on_grid(prior, k, n)
assert abs(trapezoid(post, grid) - 1.0) < 1e-8
mean = posterior_mean(post)
mode = grid[int(np.argmax(post))]
lo, hi = equal_tail_interval(post)
return post, mean, mode, lo, hi
_, mean, mode, lo, hi = posterior_summary(flat_prior, 3, 10)
print(mean, mode, lo, hi)A flat priorral a posterior
Beta
Beta:
várható érték
,
módusz
.
A numerikus mean-nek
nagyságrendű grid-hibán belül egyeznie kell; a mode az
argmax miatt pontosan a legközelebbi rácspont,
vagy
körül.
A mean_wrong az
érték, nem oszt a
-vel.
A flat
esetben
,
és a helyes átlag:
A mean_wrong nagyságrendje
,
tehát nem értelmezhető prediktív valószínűségként. Az
evidence_wrong nem teljes binomiális evidence, mert
hiányzik a
konstans. A helyes marginális likelihood flat priorral:
A javítás tehát: Z = trapezoid(unnorm, grid);
mean = trapezoid(grid*unnorm, grid) / Z;
exact_evidence = comb(15, 6) * Z (rácsos hiba
mellett).
A Beta priorban . A konjugált frissítés:
A posterior Beta: várható érték , módusz . A prior erős, a minta nem elég a -es gyakoriság teljes átültetéséhez: a prior felfelé, a likelihood lefelé húz, az egyensúly éppen -re esik. esetén , ; várható érték , módusz . A nagyobb minta már érezhetően a felé húzza a posterior-t, tehát a priorhatás csökken.
A leggyakoribb hiba az implicit prior elhallgatása. Példa: megfigyelés esetén a mintaarány , de a posterior erősen priortól függ. Flat priorral a posterior Beta várható értéke . Szkeptikus Beta priorral a posterior Beta várható értéke . Optimista Beta priorral a posterior Beta várható értéke . Ugyanaz a nulla sikerű minta tehát és közötti prediktív valószínűséget is adhat. Aki „csak likelihoodot” mutat, de nem nevezi meg a priort, az valójában priorválasztást rejtett el; a prior elhallgatása nem teszi az elemzést feltételmentessé.
Önellenőrzés:
shape == grid.shape, és a
módusz a likelihood magas tartományában van.A rácsos Bayesi frissítés a paramétert diszkrét pontokra bontja, minden pontban kiszámítja a prior és a Bernoulli-likelihood szorzatát, majd -vel normalizálja. A flat priorral a posterior Beta, várható értéke ; a szkeptikus Beta priorral Beta, várható értéke . A prediktív valószínűség a posterior átlag, a normalizálás nélkül pedig sem prediktív, sem intervallum-állítás nem tehető. A prior explicit megadása kis minta esetén meghatározó, nagy minta esetén hatása csökken. Következő alkalmazásként a Credible interval és posterior predictive check alfejezetben a credible interval és posterior predictive check kerül elő, majd a teljes PyMC-modellezés.