Skip to content
Statistical RethinkingStatistical Rethinking

9.2 Modelos lineales generalizados

Los modelos lineales generalizados (GLM) extienden el modelo lineal a resultados no gaussianos añadiendo una función de enlace. La función de enlace transforma el predictor lineal a la escala natural del resultado.

9.2.1 El marco GLM

Un GLM tiene tres componentes:

  1. Verosimilitud: La distribución del resultado de la familia exponencial (gaussiana, binomial, Poisson, etc.).
  2. Predictor lineal: ηi=α+βxi\eta_i = \alpha + \beta x_i (igual que antes).
  3. Función de enlace: g(μi)=ηig(\mu_i) = \eta_i, donde μi=E[yi]\mu_i = E[y_i].

g(E[yi])=α+βxig(\mathbb{E}[y_i]) = \alpha + \beta x_i

La función de enlace gg mapea de la escala natural del parámetro a la recta real:

| Resultado | Verosimilitud | Enlace | Nombre | | ----------------- | ------------- | ------------- | ------------------- | | Continuo | Gaussiana | Identidad | Regresión lineal | | Binario | Binomial | Logit | Regresión logística | | Conteo | Poisson | Log | Regresión Poisson | | Continuo positivo | Gamma | Log o inverso | Regresión Gamma |

# Demonstrate different GLM link functions
set.seed(42)
n <- 200
x <- runif(n, 0, 10)

# 1. Gaussian (identity link)

y_gauss <- 2 + 1.5 * x + rnorm(n, sd = 2)
m_gauss <- lm(y_gauss ~ x)

# 2. Binomial (logit link)

p_true <- 1 / (1 + exp(-(0 + 0.5 * x)))
y_bin <- rbinom(n, 1, p_true)
m_logistic <- glm(y_bin ~ x, family = binomial)

# 3. Poisson (log link)

lambda_true <- exp(0.2 + 0.15 * x)
y_pois <- rpois(n, lambda_true)
m_pois <- glm(y_pois ~ x, family = poisson)

cat("Gaussian (identity link):\n")
cat(" Intercept:", round(coef(m_gauss)[1], 3), " Slope:", round(coef(m_gauss)[2], 3), "\n")

cat("\nBinomial (logit link):\n")
cat(" Intercept:", round(coef(m_logistic)[1], 3), " Slope:", round(coef(m_logistic)[2], 3), "\n")
cat(" (on logit scale; use plogis() for probabilities)\n")

cat("\nPoisson (log link):\n")
cat(" Intercept:", round(coef(m_pois)[1], 3), " Slope:", round(coef(m_pois)[2], 3), "\n")
cat(" (on log scale; use exp() for counts)\n")
Click Run to execute this code in your browser with WebR

9.2.2 El enlace logit (regresión logística)

Para resultados binarios, el enlace logit mapea probabilidades a la recta real:

logit(pi)=log⁡pi1−pi=α+βxi\text{logit}(p_i) = \log\frac{p_i}{1 - p_i} = \alpha + \beta x_i

La inversa es la función logística:

pi=logistic(α+βxi)=11+e−(α+βxi)p_i = \text{logistic}(\alpha + \beta x_i) = \frac{1}{1 + e^{-(\alpha + \beta x_i)}}

# Demonstrate logistic regression
set.seed(42)
n <- 200
x <- runif(n, 0, 10)

# True relationship

p_true <- 1 / (1 + exp(-(-2 + 0.5 * x)))
y <- rbinom(n, 1, p_true)

# Fit logistic regression

m <- glm(y ~ x, family = binomial)

cat("Logistic regression:\n")
cat(" Intercept:", round(coef(m)[1], 3), "\n")
cat(" Slope:", round(coef(m)[2], 3), "\n")

# Convert to probability scale

cat("\nPredicted probabilities at x = 0, 5, 10:\n")
for (x_val in c(0, 5, 10)) {
logit_p <- coef(m)[1] + coef(m)[2] * x_val
p_val <- 1 / (1 + exp(-logit_p))
cat(sprintf(" x = %2d: p = %.3f\n", x_val, p_val))
}

# Plot

x_seq <- seq(0, 10, length.out = 200)
logit_pred <- coef(m)[1] + coef(m)[2] * x_seq
p_pred <- 1 / (1 + exp(-logit_pred))

plot(x, y, pch = 16, col = "steelblue",
main = "Logistic regression: binary outcome",
xlab = "x", ylab = "p(y = 1)")
lines(x_seq, p_pred, lwd = 2, col = "firebrick")
abline(h = 0.5, lty = 2, col = "gray50")
Click Run to execute this code in your browser with WebR

9.2.3 El enlace log (regresión Poisson)

Para resultados de conteo, el enlace log asegura que el conteo esperado siempre sea positivo:

log⁡(λi)=α+βxi\log(\lambda_i) = \alpha + \beta x_i

λi=eα+βxi\lambda_i = e^{\alpha + \beta x_i}

# Demonstrate Poisson regression
set.seed(42)
n <- 200
x <- runif(n, 0, 10)

# True relationship: lambda = exp(0.5 + 0.2 * x)

lambda_true <- exp(0.5 + 0.2 * x)
y <- rpois(n, lambda_true)

# Fit Poisson regression

m <- glm(y ~ x, family = poisson)

cat("Poisson regression:\n")
cat(" Intercept:", round(coef(m)[1], 3), "\n")
cat(" Slope:", round(coef(m)[2], 3), "\n")

# Convert to count scale

cat("\nPredicted counts at x = 0, 5, 10:\n")
for (x_val in c(0, 5, 10)) {
log_lambda <- coef(m)[1] + coef(m)[2] * x_val
cat(sprintf(" x = %2d: lambda = %.3f\n", x_val, exp(log_lambda)))
}

# Plot

x_seq <- seq(0, 10, length.out = 200)
log_pred <- coef(m)[1] + coef(m)[2] * x_seq
lambda_pred <- exp(log_pred)

plot(x, y, pch = 16, col = "steelblue",
main = "Poisson regression: count outcome",
xlab = "x", ylab = "y (count)")
lines(x_seq, lambda_pred, lwd = 2, col = "firebrick")
Click Run to execute this code in your browser with WebR
Rethinking

La función de enlace es el puente. El modelo lineal vive en la recta real — puede producir cualquier valor de −∞-\infty a +∞+\infty. Pero los resultados viven en escalas diferentes: las probabilidades están en [0,1][0, 1], los conteos están en [0,∞)[0, \infty). La función de enlace une estas escalas. Transforma el predictor lineal a la escala natural del resultado. Esto no es un truco — es la consecuencia natural de elegir la verosimilitud de entropía máxima y luego conectarla al modelo lineal. La función de enlace es lo que hace que los GLM sean generales.

Resumen de la Sección 9.2

  • Los GLM extienden los modelos lineales con una función de enlace: g(E[yi])=α+βxig(E[y_i]) = \alpha + \beta x_i.
  • Enlace logit para resultados binarios: log⁡(p/(1−p))=α+βx\log(p/(1-p)) = \alpha + \beta x.
  • Enlace log para resultados de conteo: log⁡(λ)=α+βx\log(\lambda) = \alpha + \beta x.
  • Enlace identidad para resultados continuos: μ=α+βx\mu = \alpha + \beta x (regresión lineal ordinaria).
  • La función de enlace une el predictor lineal con la escala natural del resultado.