Wprowadzenie do myślenia bayesowskiego
Poznaj rozkład a priori, wiarygodność i rozkład a posteriori w ujęciu bayesowskim.
Wprowadzenie do myślenia bayesowskiego to bezpłatna lekcja R Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej R Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs R Academy zawiera 4 lekcji w sumie.
Częstościowe a bayesowskie
W statystyce częstościowej prawdopodobieństwo oznacza długookresową częstość występowania zdarzenia. W statystyce bayesowskiej prawdopodobieństwo wyraża stopień przekonania. Kluczowa różnica polega na tym, że statystycy częstościowi traktują parametry jako stałe (nieznane wartości), a statystycy bayesowscy — jako zmienne losowe o rozkładach prawdopodobieństwa.
# Frequentist: parameter theta is fixed, data is random
# Bayesian: data is fixed (observed), theta has a distribution
# Example: estimating coin bias p
# Frequentist: MLE -> p_hat = heads / total
heads <- 7; total <- 10
p_mle <- heads / total
cat('MLE estimate:', p_mle, '\n')
# Bayesian: update prior belief with observed data
# Prior: Beta(2, 2) -> slightly informative, centered at 0.5
# Posterior: Beta(2 + heads, 2 + (total - heads)) = Beta(9, 5)
alpha_post <- 2 + heads
beta_post <- 2 + (total - heads)
p_bayes <- alpha_post / (alpha_post + beta_post) # posterior mean
cat('Bayesian posterior mean:', round(p_bayes, 3), '\n')Twierdzenie Bayesa
Twierdzenie Bayesa wiąże wcześniejsze przekonanie o parametrze, wiarygodność danych przy danej wartości tego parametru oraz przekonanie a posteriori po zaobserwowaniu danych:
P(θ|data) = P(data|θ) × P(θ) / P(data)
Mianownik P(data) jest stałą normalizującą — sprawia, że rozkład a posteriori jest prawidłowym rozkładem prawdopodobieństwa.
# Bayes' theorem components
# P(theta | data) = posterior (what we want)
# P(data | theta) = likelihood (how well theta explains data)
# P(theta) = prior (what we believed before data)
# P(data) = evidence (normalising constant)
# Medical test example
P_disease <- 0.01 # prior: 1% prevalence
P_pos_given_disease <- 0.99 # sensitivity
P_pos_given_no_disease <- 0.05 # false positive rate
P_pos <- P_pos_given_disease * P_disease +
P_pos_given_no_disease * (1 - P_disease)
P_disease_given_pos <- (P_pos_given_disease * P_disease) / P_pos
cat('P(positive test):', round(P_pos, 4), '\n')
cat('P(disease | positive test):', round(P_disease_given_pos, 4), '\n')
cat('Only', round(P_disease_given_pos * 100, 1), '% chance despite positive test!\n')Rozkłady a priori
Rozkład a priori koduje przekonanie o parametrze przed zobaczeniem danych. Rozkłady a priori mogą być nieinformacyjne (płaskie, wyrażające minimalną wiedzę) lub informacyjne (silnie skupione, wyrażające wiedzę dziedzinową). Typowe rozkłady a priori: Beta(1,1) = jednostajny, Normal(0, 10) = słabo informacyjny.
# Visualise different Beta priors for a probability parameter
theta <- seq(0, 1, length.out = 200)
# Uniform (no prior knowledge)
prior_uniform <- dbeta(theta, 1, 1)
# Informative: believe p ~ 0.3
prior_informative <- dbeta(theta, 3, 7)
# Strong: believe p ~ 0.5
prior_strong <- dbeta(theta, 20, 20)
plot(theta, prior_uniform, type = 'l', col = 'gray',
ylim = c(0, 8), xlab = 'theta', ylab = 'Density',
main = 'Different Prior Beliefs')
lines(theta, prior_informative, col = 'blue')
lines(theta, prior_strong, col = 'red')
legend('topright', c('Uniform Beta(1,1)', 'Informative Beta(3,7)', 'Strong Beta(20,20)'),
col = c('gray', 'blue', 'red'), lty = 1)Funkcje wiarygodności
Wiarygodność P(data|θ) mierzy, jak prawdopodobne są zaobserwowane dane dla danej wartości parametru. W przypadku rzutów monetą wiarygodność ma rozkład dwumianowy. Dla danych ciągłych często ma rozkład normalny. Obliczamy wiarygodność dla wielu wartości θ, aby znaleźć tę, która najlepiej wyjaśnia dane.
# Likelihood for a coin flip experiment
# Data: 7 heads in 10 flips
heads <- 7; n <- 10
# Evaluate likelihood at many theta values
theta <- seq(0.01, 0.99, length.out = 200)
likelihood <- dbinom(heads, n, theta)
# Maximum likelihood
mle <- theta[which.max(likelihood)]
cat('MLE (max likelihood theta):', mle, '\n')
# Plot the likelihood function
plot(theta, likelihood, type = 'l', col = 'steelblue',
xlab = 'theta (coin bias)', ylab = 'Likelihood P(7H|theta)',
main = '7 Heads in 10 Flips: Likelihood')
abline(v = mle, lty = 2, col = 'red')
legend('topleft', paste('MLE =', mle), lty = 2, col = 'red')A posteriori = a priori × wiarygodność
Rozkład a posteriori jest proporcjonalny do iloczynu rozkładu a priori i wiarygodności. Dla modelu Beta-dwumianowego można go wyznaczyć analitycznie: jeśli rozkład a priori to Beta(α, β), a w n rzutach zaobserwowano h orłów, rozkład a posteriori to Beta(α + h, β + n − h).
# Beta-Binomial conjugate model
heads <- 7; n <- 10
alpha_prior <- 2; beta_prior <- 2 # prior: Beta(2,2)
# Update: posterior = Beta(alpha + heads, beta + tails)
alpha_post <- alpha_prior + heads
beta_post <- beta_prior + (n - heads)
theta <- seq(0.01, 0.99, length.out = 300)
prior <- dbeta(theta, alpha_prior, beta_prior)
likelihood <- dbinom(heads, n, theta)
likelihood <- likelihood / max(likelihood) # normalise for plotting
posterior <- dbeta(theta, alpha_post, beta_post)
plot(theta, posterior, type = 'l', col = 'red', lwd = 2,
xlab = 'theta', ylab = 'Density', main = 'Prior vs Posterior')
lines(theta, prior, col = 'blue', lwd = 2)
lines(theta, likelihood, col = 'gray', lwd = 2, lty = 2)
legend('topleft', c(paste0('Prior Beta(', alpha_prior, ',', beta_prior, ')'),
'Likelihood (scaled)',
paste0('Posterior Beta(', alpha_post, ',', beta_post, ')')),
col = c('blue', 'gray', 'red'), lty = c(1,2,1), lwd = 2)Rozkłady sprzężone a priori
Sprzężony rozkład a priori to taki rozkład, dla którego rozkład a posteriori należy do tej samej rodziny co rozkład a priori. Dzięki temu wnioskowanie można przeprowadzić analitycznie. Typowe pary sprzężone: Beta-dwumianowy (proporcje), normalny-normalny (średnie przy znanej wariancji), gamma-Poissona (częstości).
# Conjugate prior table (analytical results)
conjugates <- data.frame(
Likelihood = c('Binomial', 'Poisson', 'Normal (known sigma)',
'Exponential', 'Multinomial'),
Prior = c('Beta', 'Gamma', 'Normal',
'Gamma', 'Dirichlet'),
Posterior = c('Beta', 'Gamma', 'Normal',
'Gamma', 'Dirichlet'),
Update_Rule = c('(a+h, b+t)', '(a+x, b+n)', '(mu_n, sigma_n)',
'(a+n, b+sum)', '(a+counts)')
)
print(conjugates, row.names = FALSE)
# Beta-Binomial update
cat('\nBeta(2,3) + 7 heads, 3 tails -> Beta(',
2+7, ',', 3+3, ')\n')Przedziały wiarygodności
Przedział wiarygodności (CI) jest bayesowskim odpowiednikiem przedziału ufności: 95-procentowy CI oznacza, że istnieje 95-procentowe prawdopodobieństwo a posteriori, że θ znajduje się w tym przedziale. Jest to intuicyjna interpretacja, którą większość osób niesłusznie przypisuje częstościowym przedziałom ufności.
# 95% credible interval for Beta posterior
alpha_post <- 9; beta_post <- 5 # posterior from earlier
# Credible interval via quantile function
ci_lower <- qbeta(0.025, alpha_post, beta_post)
ci_upper <- qbeta(0.975, alpha_post, beta_post)
posterior_mean <- alpha_post / (alpha_post + beta_post)
cat('Posterior mean: ', round(posterior_mean, 3), '\n')
cat('95% Credible Interval: [',
round(ci_lower, 3), ',',
round(ci_upper, 3), ']\n')
cat('Interpretation: 95% probability theta is in this interval\n')
# Visualise
theta <- seq(0, 1, length.out = 300)
plot(theta, dbeta(theta, alpha_post, beta_post), type = 'l', col = 'red', lwd = 2,
main = '95% Credible Interval', xlab = 'theta', ylab = 'Density')
abline(v = c(ci_lower, ci_upper), lty = 2, col = 'blue')Aktualizacja bayesowska: uczenie sekwencyjne
Aktualizacja bayesowska ma charakter sekwencyjny: dzisiejszy rozkład a posteriori staje się jutrzejszym rozkładem a priori. Dzięki temu wnioskowanie bayesowskie naturalnie wspiera podejście przyrostowe — po pojawieniu się nowych danych nie trzeba dopasowywać modelu od początku, wystarczy zaktualizować istniejący rozkład a posteriori.
# Sequential Bayesian updating for a coin
# Start with uninformative prior Beta(1,1)
flips <- c(1, 0, 1, 1, 0, 1, 1, 1, 0, 1) # 1=H, 0=T
alpha <- 1; beta_p <- 1 # prior
cat('Prior: Beta(', alpha, ',', beta_p, ') mean =', round(alpha/(alpha+beta_p), 3), '\n')
for (i in seq_along(flips)) {
if (flips[i] == 1) alpha <- alpha + 1 else beta_p <- beta_p + 1
mean_post <- alpha / (alpha + beta_p)
cat('After flip', i, '(', flips[i], '): Beta(',
alpha, ',', beta_p, ') mean =', round(mean_post, 3), '\n')
}Estymacja MAP
Estymata Maximum A Posteriori (MAP) jest dominantą rozkładu a posteriori. Dla rozkładu a posteriori Beta(α, β) MAP = (α−1)/(α+β−2). MAP równoważy wpływ rozkładu a priori i wiarygodności, przesuwając estymaty w stronę rozkładu a priori przy małych próbach.
# Compare MLE vs MAP for small sample
heads <- 3; n <- 5
alpha_p <- 5; beta_p <- 5 # informative prior: believe p ~ 0.5
# MLE: ignores prior
mle <- heads / n
# MAP: mode of Beta posterior
alpha_post <- alpha_p + heads
beta_post <- beta_p + (n - heads)
map <- (alpha_post - 1) / (alpha_post + beta_post - 2)
# Posterior mean (alternative point estimate)
post_mean <- alpha_post / (alpha_post + beta_post)
cat('Data: 3 heads in 5 flips\n')
cat('MLE: ', round(mle, 3), '(ignores prior)\n')
cat('MAP: ', round(map, 3), '(mode of posterior)\n')
cat('Posterior mean:', round(post_mean, 3), '(mean of posterior)\n')
cat('Note: MAP and mean shrink toward prior (0.5) for small n\n')Kiedy stosować metody bayesowskie
Metody bayesowskie są szczególnie przydatne, gdy: (1) dysponujesz informacyjną wiedzą a priori, (2) liczebność próby jest mała, (3) potrzebujesz pełnej kwantyfikacji niepewności, (4) chcesz formułować stwierdzenia probabilistyczne dotyczące parametrów lub (5) przeprowadzasz analizę sekwencyjną, w której rozkłady a priori są przenoszone z wcześniejszych eksperymentów.
# Comparison: when Bayesian vs frequentist is preferred
comparison <- data.frame(
Scenario = c(
'Small sample (n < 30)',
'Prior domain knowledge',
'Probability about parameter',
'Sequential updating',
'Large sample, no prior',
'Regulatory/simple inference'
),
Preferred = c(
'Bayesian', 'Bayesian', 'Bayesian',
'Bayesian', 'Either', 'Frequentist'
)
)
print(comparison, row.names = FALSE)
# Example: medical device testing with historical data
alpha_historical <- 15 # prior based on 20 historical tests
beta_historical <- 5
cat('\nHistorical prior: Beta(', alpha_historical, ',', beta_historical, ')\n')
cat('Prior mean:', round(alpha_historical/(alpha_historical+beta_historical), 3), '\n')Wnioskowanie bayesowskie w praktyce
W przypadku prostych modeli sprzężonych wnioskowanie jest analityczne (jak pokazano powyżej). Dla modeli złożonych (hierarchicznych, niesprzężonych) używamy próbkowania metodą Monte Carlo łańcuchów Markowa (MCMC) za pomocą Stan (RStan), JAGS lub BUGS, aby numerycznie przybliżyć rozkład a posteriori.
# Analytical vs MCMC approaches
approaches <- data.frame(
Method = c('Conjugate (exact)', 'Grid approximation',
'Laplace approx.', 'MCMC (Stan/JAGS)',
'Variational Bayes'),
When = c('Conjugate prior+likelihood', 'Low-dim, discrete',
'Unimodal posterior', 'General complex models',
'Large scale, approximate'),
Speed = c('Instant', 'Fast', 'Fast', 'Slow', 'Moderate'),
Exactness = c('Exact', 'Exact on grid', 'Approximate',
'Asymptotically exact', 'Approximate')
)
print(approaches, row.names = FALSE)Szybkie sprawdzenie
W 10 rzutach monetą obserwujesz 7 orłów. Twój rozkład a priori to Beta(2, 2). Jaki jest prawidłowy rozkład a posteriori?
Podsumowanie: myślenie bayesowskie
Najważniejsze informacje:
- Twierdzenie Bayesa: P(θ|data) ∝ P(data|θ) × P(θ)
- Rozkład a priori koduje przekonanie przed uzyskaniem danych; wiarygodność koduje wsparcie wynikające z danych; rozkład a posteriori łączy oba te elementy
- Sprzężone rozkłady a priori dają analityczne rozkłady a posteriori (Beta-dwumianowy, normalny-normalny, gamma-Poissona)
- Aktualizacja Beta-dwumianowa: Beta(α, β) + (h orłów, t reszek) → Beta(α+h, β+t)
- Przedziały wiarygodności mają naturalną interpretację probabilistyczną, której nie mają przedziały ufności
- Aktualizacja bayesowska jest sekwencyjna — dzisiejszy rozkład a posteriori jest jutrzejszym rozkładem a priori
- W przypadku złożonych modeli używaj próbkowania MCMC (Stan, JAGS) do przybliżania rozkładów a posteriori
# Full Bayesian inference cycle for a proportion
alpha0 <- 2; beta0 <- 2 # prior
heads <- 12; total <- 20 # observed data
alpha_post <- alpha0 + heads
beta_post <- beta0 + (total - heads)
post_mean <- alpha_post / (alpha_post + beta_post)
ci <- qbeta(c(0.025, 0.975), alpha_post, beta_post)
cat('Prior: Beta(', alpha0, ',', beta0, ') mean =', round(alpha0/(alpha0+beta0), 2), '\n')
cat('Data:', heads, 'heads in', total, 'flips\n')
cat('Posterior: Beta(', alpha_post, ',', beta_post, ')\n')
cat('Posterior mean:', round(post_mean, 3), '\n')
cat('95% CI: [', round(ci[1],3), ',', round(ci[2],3), ']\n')Często zadawane pytania
Czy lekcja „Wprowadzenie do myślenia bayesowskiego” jest bezpłatna?
Tak — pełny tekst „Wprowadzenie do myślenia bayesowskiego” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu R Academy, przejdź na CoddyKit PRO. Kurs R Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Wprowadzenie do myślenia bayesowskiego”?
Poznaj rozkład a priori, wiarygodność i rozkład a posteriori w ujęciu bayesowskim. Ćwiczysz R Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć R Academy?
Nie wymagamy żadnego doświadczenia. R Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Wprowadzenie do myślenia bayesowskiego”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji R Academy?
Tak. Każda lekcja R Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Wprowadzenie do myślenia bayesowskiego
- Pisanie modeli Stan w R
- Próbkowanie MCMC i diagnostyka
- Posterior predictive checks