# introduccion-a-la-estadistica-bayesiana-con-pymc
Introducción a la estadística bayesiana con PyMC
Volver a la portada del cursoEjemplos de Modelado Bayesiano
Sección 2 · Modelado Bayesiano
Ejemplos de modelado bayesiano
Construir un modelo bayesiano es tomar tres decisiones: qué distribución genera los datos, qué parámetros la controlan y qué sabes de esos parámetros antes de mirar los datos. El notebook de esta lección practica esas decisiones con dos modelos pequeños que se pueden verificar a mano, y termina con una revisión de priors mediante simulación. Esta página describe cada ejemplo y adelanta el código clave.
El patrón general
Todo modelo del notebook sigue la misma estructura generativa: se eligen priors para los parámetros y una verosimilitud acorde con el tipo de dato.
$$\theta \sim p(\theta), \qquad y_i \mid \theta \sim p(y \mid \theta), \qquad p(\theta \mid y) \propto p(\theta) \prod_{i=1}^{n} p(y_i \mid \theta)$$La verosimilitud se escoge según el soporte de los datos: Bernoulli o Binomial para éxitos y fracasos, Poisson para conteos, Normal para medidas continuas sin cotas fuertes. Los priors respetan el soporte del parámetro: una probabilidad vive en $[0, 1]$ y una desviación estándar debe ser positiva.
Ejemplo 1: tasa de conversión Beta-Binomial
Una página recibe $n$ visitas y registra $k$ compras. El parámetro es la tasa $p$, con prior $\text{Beta}(\alpha, \beta)$ y verosimilitud $\text{Binomial}(n, p)$. Como la Beta es conjugada de la Binomial, el posterior exacto es $\text{Beta}(\alpha + k,\ \beta + n - k)$. El notebook resuelve el modelo tres veces: con la fórmula cerrada, con una aproximación por rejilla y con PyMC, y comprueba que las tres coinciden. Esa comparación es la mejor forma de confiar en el muestreador antes de usarlo en modelos sin solución cerrada.
Ejemplo 2: media Normal con sigma desconocida
Con tiempos de respuesta de un servicio, el modelo es $y_i \sim \text{Normal}(\mu, \sigma)$ con dos parámetros desconocidos. Aquí ya no hay un posterior conjugado sencillo para ambos, así que el notebook usa una rejilla bidimensional sobre $(\mu, \sigma)$ y después el mismo modelo en PyMC:
import numpy as np
from scipy import stats
rng = np.random.default_rng(42)
y = rng.normal(250, 40, size=30) # tiempos simulados en ms
mu_g, sd_g = np.meshgrid(np.linspace(150, 350, 300), np.linspace(5, 100, 300))
log_prior = stats.norm.logpdf(mu_g, 250, 100) + stats.halfnorm.logpdf(sd_g, scale=50)
log_lik = stats.norm.logpdf(y[:, None, None], mu_g, sd_g).sum(axis=0)
log_post = log_prior + log_lik
post = np.exp(log_post - log_post.max())
post /= post.sum()
print((mu_g * post).sum(), (sd_g * post).sum()) # medias posteriores
Trabajar en escala logarítmica es una buena práctica: con 30 datos el producto de densidades ya ronda $10^{-64}$, y con unos cientos de datos llega a cero por subdesbordamiento numérico; la suma de log-densidades se mantiene estable. La versión en PyMC declara lo mismo con menos líneas y aproxima el posterior con muestras:
import pymc as pm
with pm.Model() as modelo:
mu = pm.Normal("mu", mu=250, sigma=100)
sigma = pm.HalfNormal("sigma", sigma=50)
pm.Normal("y", mu=mu, sigma=sigma, observed=y)
prior = pm.sample_prior_predictive(draws=500, random_seed=42)
idata = pm.sample(nuts_sampler="nutpie", chains=2, cores=1,
random_seed=42, progressbar=False)
Elección de priors
El notebook compara tres familias de priors sobre el mismo modelo:
- Informativos: codifican conocimiento previo real, por ejemplo $\text{Beta}(20, 380)$ si históricamente la conversión ronda 5%. Útiles con pocos datos, pero deben justificarse.
- Débilmente informativos: descartan valores absurdos sin imponer una respuesta, como $\text{Normal}(250, 100)$ para una media en milisegundos o $\text{HalfNormal}(50)$ para $\sigma$. Son el punto de partida recomendado en la mayoría de los casos.
- Planos o muy vagos: $\text{Beta}(1, 1)$ o una Normal con varianza enorme. Parecen neutrales, pero en escalas amplias asignan mucha probabilidad a valores imposibles y dificultan el muestreo.
Prior predictive check
Antes de ajustar, conviene simular datos solo desde los priors y preguntarse si lucen plausibles. pm.sample_prior_predictive genera esas simulaciones y las guarda en los grupos prior y prior_predictive del objeto de resultados. Si el modelo de tiempos de respuesta produce valores negativos frecuentes o de varios minutos, los priors están mal calibrados aunque el ajuste final "funcione". El notebook grafica esas simulaciones contra el rango razonable de los datos.
Trampas comunes
- Verosimilitud que no respeta el soporte: una Normal para conteos pequeños o proporciones asigna probabilidad a valores negativos o mayores que uno.
- Prior Normal para una desviación estándar: permite valores negativos; usa HalfNormal, Exponential o similares.
- Omitir el prior predictive check: los errores de escala en los priors pasan desapercibidos hasta que el muestreo falla.
- Multiplicar densidades en lugar de sumar log-densidades en la rejilla, lo que produce subdesbordamiento.
- Elegir priors después de ver el posterior para obtener el resultado deseado.
Cierre
Un modelo simple que puedes resolver de dos maneras es la mejor prueba de que entiendes lo que hace PyMC. Ejecuta el notebook, cambia el prior del ejemplo 1 de débil a informativo y mide cuánto se mueve la media posterior con 20 visitas frente a 2000.