0Pricing
R Academy · Lección

Introducción al pensamiento bayesiano

Comprenda la distribución previa, la verosimilitud y la distribución posterior en el marco bayesiano.

Introducción al pensamiento bayesiano es una lección gratuita de R Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de R Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de R Academy incluye 4 lecciones en total.

Frecuentista frente a bayesiano

En la estadística frecuentista, la probabilidad es la frecuencia a largo plazo de un suceso. En la estadística bayesiana, la probabilidad representa un grado de creencia. La diferencia principal es que los frecuentistas consideran los parámetros constantes fijas desconocidas, mientras que los bayesianos los consideran variables aleatorias con distribuciones de probabilidad.

# 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')

Teorema de Bayes

El teorema de Bayes relaciona la creencia previa sobre un parámetro, la verosimilitud de los datos dado ese parámetro y la creencia posterior después de observar los datos:

P(θ|data) = P(data|θ) × P(θ) / P(data)

El denominador P(data) es una constante de normalización: hace que la posterior sea una distribución de probabilidad propia.

# 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')

Distribuciones previas

La prior codifica su creencia sobre un parámetro antes de observar los datos. Las distribuciones previas pueden ser no informativas (planas, expresan un conocimiento mínimo) o informativas (muy concentradas, expresan conocimiento experto del dominio). Distribuciones previas habituales: Beta(1,1) = uniforme, Normal(0, 10) = débilmente informativa.

# 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)

Funciones de verosimilitud

La verosimilitud P(data|θ) mide la probabilidad de los datos observados para un valor dado del parámetro. En los lanzamientos de una moneda, la verosimilitud es binomial. Para datos continuos, suele ser gaussiana. Evaluamos la verosimilitud en muchos valores de θ para encontrar cuál explica mejor los datos.

# 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 = previa × verosimilitud

La posterior es proporcional al producto de la previa y la verosimilitud. En el modelo Beta-Binomial, esto se puede resolver analíticamente: si la previa es Beta(α, β) y observa h caras en n lanzamientos, la posterior es 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)

Distribuciones previas conjugadas

Una distribución previa conjugada es aquella cuya posterior pertenece a la misma familia que la previa. Esto hace que la inferencia sea tratable analíticamente. Pares conjugados habituales: Beta-Binomial (proporciones), Normal-Normal (medias con varianza conocida) y Gamma-Poisson (tasas).

# 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')

Intervalos de credibilidad

Un intervalo de credibilidad (IC) es el equivalente bayesiano de un intervalo de confianza: un IC del 95 % significa que existe una probabilidad posterior del 95 % de que θ se encuentre en el intervalo. Esta es la interpretación intuitiva que la mayoría de las personas atribuye incorrectamente a los intervalos de confianza frecuentistas.

# 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')

Actualización bayesiana: aprendizaje secuencial

La actualización bayesiana es secuencial: la posterior de hoy se convierte en la previa de mañana. Esto hace que la inferencia bayesiana sea naturalmente incremental: no es necesario volver a ajustar el modelo desde cero cuando llegan nuevos datos; basta con actualizar la posterior existente.

# 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')
}

Estimación MAP

La estimación de Maximum A Posteriori (MAP) es la moda de la distribución posterior. Para una posterior Beta(α, β), MAP = (α−1)/(α+β−2). MAP equilibra la influencia de la previa con la de la verosimilitud y acerca las estimaciones a la previa cuando las muestras son pequeñas.

# 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')

Cuándo utilizar métodos bayesianos

Los métodos bayesianos son especialmente útiles cuando: (1) dispone de conocimiento previo informativo, (2) los tamaños de muestra son pequeños, (3) necesita cuantificar completamente la incertidumbre, (4) desea hacer afirmaciones probabilísticas sobre los parámetros o (5) realiza un análisis secuencial en el que las distribuciones previas se transfieren de experimentos anteriores.

# 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')

Inferencia bayesiana en la práctica

En los modelos conjugados sencillos, la inferencia es analítica, como se ha mostrado anteriormente. En modelos complejos (jerárquicos o no conjugados), utilizamos muestreo de Markov Chain Monte Carlo (MCMC) mediante Stan (RStan), JAGS o BUGS para aproximar numéricamente la posterior.

# 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)

Comprobación rápida

Observa 7 caras en 10 lanzamientos de una moneda. Su distribución previa es Beta(2, 2). ¿Cuál es la distribución posterior correcta?

Resumen: pensamiento bayesiano

Ideas clave:

  • Teorema de Bayes: P(θ|data) ∝ P(data|θ) × P(θ)
  • La previa codifica la creencia antes de los datos; la verosimilitud codifica el respaldo de los datos; la posterior combina ambas
  • Las distribuciones previas conjugadas producen posteriores analíticas (Beta-Binomial, Normal-Normal, Gamma-Poisson)
  • Actualización Beta-Binomial: Beta(α, β) + (h caras, t cruces) → Beta(α+h, β+t)
  • Los intervalos de credibilidad tienen una interpretación probabilística natural que los IC no tienen
  • La actualización bayesiana es secuencial: la posterior de hoy es la previa de mañana
  • Para modelos complejos, use muestreo MCMC (Stan, JAGS) para aproximar las posteriores
# 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')

Preguntas frecuentes

¿La lección «Introducción al pensamiento bayesiano» es gratis?

Sí — el texto completo de «Introducción al pensamiento bayesiano» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de R Academy, actualiza a CoddyKit PRO. El curso de R Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Introducción al pensamiento bayesiano»?

Comprenda la distribución previa, la verosimilitud y la distribución posterior en el marco bayesiano. Practicas R Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar R Academy?

No se requiere experiencia previa. R Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «Introducción al pensamiento bayesiano»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de R Academy?

Sí. Cada lección de R Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Introducción al pensamiento bayesiano
  2. Escritura de modelos de Stan en R
  3. Muestreo MCMC y diagnósticos
  4. Comprobaciones predictivas posteriores
← Volver a R Academy