Introduktion til bayesiansk tænkning
Forstå prior, likelihood og posterior i den bayesianske ramme.
Introduktion til bayesiansk tænkning er en gratis R Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i R Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. R Academy-kurset indeholder 4 lektioner i alt.
Frequentistisk statistik vs. Bayesiansk statistik
I frequentistisk statistik er sandsynlighed den langsigtede hyppighed af en hændelse. I Bayesiansk statistik repræsenterer sandsynlighed en grad af overbevisning. Den afgørende forskel er, at frequentister betragter parametre som faste (ukendte konstanter), mens Bayesianske statistikere betragter parametre som stokastiske variable med sandsynlighedsfordelinger.
# 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')Bayes' sætning
Bayes' sætning forbinder den forudgående antagelse om en parameter, sandsynligheden for data givet denne parameter og den efterfølgende antagelse efter observationen af data:
P(θ|data) = P(data|θ) × P(θ) / P(data)
Nævneren P(data) er en normaliseringskonstant — den gør den efterfølgende fordeling til en gyldig sandsynlighedsfordeling.
# 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')Forudgående fordelinger
Den forudgående fordeling udtrykker din antagelse om en parameter før du ser data. Forudgående fordelinger kan være uinformative (flade og udtrykker minimal viden) eller informative (skarpt koncentrerede og udtrykker domæneekspertise). Almindelige forudgående fordelinger er: Beta(1,1) = uniform, Normal(0, 10) = svagt informativ.
# 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)Likelihood-funktioner
Likelihood P(data|θ) måler, hvor sandsynlige de observerede data er for en given parameterværdi. Ved møntkast er likelihood-fordelingen binomial. For kontinuerte data er den ofte gaussisk. Vi evaluerer likelihood ved mange θ-værdier for at finde den værdi, der bedst forklarer dataene.
# 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')Posterior = prior × likelihood
Den efterfølgende fordeling er proportional med den forudgående fordeling gange likelihood-funktionen. For Beta-binomialmodellen kan dette beregnes analytisk: Hvis den forudgående fordeling er Beta(α, β), og du observerer h plat i n kast, er den efterfølgende fordeling 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)Konjugerede forudgående fordelinger
En konjugeret forudgående fordeling er en fordeling, hvor den efterfølgende fordeling tilhører samme familie som den forudgående. Det gør statistisk inferens analytisk håndterbar. Almindelige konjugerede par er: Beta-binomial (proportioner), normal-normal (middelværdier med kendt varians) og gamma-Poisson (rater).
# 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')Troværdighedsintervaller
Et troværdighedsinterval (CI) er den Bayesianske pendant til et konfidensinterval: Et CI på 95 % betyder, at der er 95 % posterior sandsynlighed for, at θ ligger i intervallet. Det er den intuitive fortolkning, som de fleste forkert tillægger frequentistiske konfidensintervaller.
# 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')Bayesiansk opdatering: Sekventiel læring
Bayesiansk opdatering er sekventiel: Dagens efterfølgende fordeling bliver morgendagens forudgående fordeling. Det gør Bayesiansk inferens naturligt trinvis — du behøver ikke tilpasse modellen fra bunden, når der kommer nye data; du skal blot opdatere den eksisterende efterfølgende fordeling.
# 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')
}MAP-estimering
Maximum A Posteriori-estimatet (MAP) er toppunktet i den efterfølgende fordeling. For en Beta(α, β)-fordeling er MAP = (α−1)/(α+β−2). MAP afvejer den forudgående fordelings påvirkning mod likelihood-funktionens påvirkning og trækker estimater mod den forudgående fordeling ved små stikprøver.
# 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')Hvornår skal du bruge Bayesianske metoder?
Bayesianske metoder er særligt nyttige, når: (1) du har informativ forhåndsviden, (2) stikprøvestørrelserne er små, (3) du har brug for en fuldstændig kvantificering af usikkerhed, (4) du vil fremsætte sandsynlighedsudsagn om parametre, eller (5) du udfører sekventiel analyse, hvor forudgående fordelinger videreføres fra tidligere eksperimenter.
# 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')Bayesiansk inferens i praksis
For simple konjugerede modeller er inferensen analytisk, som vist ovenfor. For komplekse modeller (hierarkiske modeller uden konjugerede fordelinger) bruger vi Markov Chain Monte Carlo-sampling (MCMC) via Stan (RStan), JAGS eller BUGS til numerisk at approksimere den efterfølgende fordeling.
# 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)Hurtigt tjek
Du observerer 7 plat i 10 møntkast. Din forudgående fordeling er Beta(2, 2). Hvad er den korrekte efterfølgende fordeling?
Opsummering: Bayesiansk tankegang
Vigtigste pointer:
- Bayes' sætning: P(θ|data) ∝ P(data|θ) × P(θ)
- Den forudgående fordeling udtrykker antagelsen før data; likelihood-funktionen udtrykker datagrundlaget; den efterfølgende fordeling kombinerer begge
- Konjugerede forudgående fordelinger giver analytiske efterfølgende fordelinger (beta-binomial, normal-normal, gamma-Poisson)
- Beta-binomial-opdatering: Beta(α, β) + (h plat, t krone) → Beta(α+h, β+t)
- Troværdighedsintervaller har en naturlig sandsynlighedsfortolkning, som CI'er ikke har
- Bayesiansk opdatering er sekventiel — dagens efterfølgende fordeling er morgendagens forudgående fordeling
- Brug MCMC-sampling (Stan, JAGS) til at approksimere efterfølgende fordelinger i komplekse modeller
# 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')Lær R med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 43
- Lektioner
- 159
Ofte stillede spørgsmål
Er lektionen “Introduktion til bayesiansk tænkning” gratis?
Ja — alle 3 lektioner i læringssporet R Academy, inklusive “Introduktion til bayesiansk tænkning”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. R Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Introduktion til bayesiansk tænkning”?
Forstå prior, likelihood og posterior i den bayesianske ramme. Du øver dig i R Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på R Academy?
Der kræves ingen tidligere erfaring. R Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.
Hvor lang tid tager lektionen “Introduktion til bayesiansk tænkning”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne R Academy-lektion?
Ja. Alle R Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Introduktion til bayesiansk tænkning
- Skriv Stan-modeller i R
- MCMC-stikprøvetagning og diagnostik
- Posterior-predictive checks