Apunte 08 — La función glm() y modelos lineales generalizados

Analítica de Personas · Semestre otoño 2026 · Semana 3 · Referencia

1. ¿Qué es un modelo lineal generalizado (GLM)?

La función glm() de R ajusta modelos lineales generalizados (generalized linear models). Son una extensión de la regresión lineal clásica (lm()) que permiten trabajar con variables dependientes que no son continuas ni normales: binarias (Sí/No), conteos, proporciones, etc.

Todo GLM tiene tres componentes:

ComponenteQué esEjemplo (regresión logística)
Componente aleatoriaLa distribución de YBinomial (Y es 0 o 1)
Componente sistemáticaLa combinación lineal de predictoresβ₀ + β₁X₁ + β₂X₂ + ...
Función de enlaceConecta la media de Y con los predictoresLogit: log(p / (1−p))

2. Sintaxis general de glm()

glm(
  formula,          # y ~ x1 + x2 + x3
  data,             # el data frame
  family,           # distribución + enlace (ver sección 3)
  weights,          # pesos opcionales
  subset,           # subconjunto de datos
  na.action         # qué hacer con NAs (default: na.omit)
)

La fórmula en R

FórmulaSignificadoEjemplo
y ~ xUn predictorrotacion_bin ~ satisfaccion_laboral
y ~ x1 + x2Efectos principales aditivosrotacion_bin ~ satisfaccion + edad
y ~ x1 * x2Efectos principales + interacciónEquivale a x1 + x2 + x1:x2
y ~ x1:x2Solo la interacciónSin efectos principales (raro)
y ~ .Todos los predictores del data framerotacion_bin ~ . (peligroso: incluye todo)
y ~ x1 + I(x2^2)Término cuadráticoEfecto no lineal de x2
y ~ 1Modelo nulo (solo intercepto)Referencia para comparar
⚠️ Cuidado con y ~ . Incluye todas las columnas del data frame como predictores. Si tienes variables de identificación (id_empleado, nombre) o la misma variable codificada de dos formas (rotacion y rotacion_bin), el modelo fallará o dará resultados absurdos. Siempre especifica las variables explícitamente.

3. Familias de distribución (el argumento family)

El argumento family define qué tipo de variable dependiente tienes y qué función de enlace usar. Esta es la pieza clave que diferencia los tipos de regresión GLM.

FamilyVariable dependienteEnlace por defectoUso en RRHHEquivale a...
gaussianContinua, normalidentityPredecir ingreso, satisfacción continualm()
binomialBinaria (0/1, Sí/No)logitPredecir rotación, ausentismo, promociónRegresión logística
poissonConteo (enteros ≥ 0)logNúmero de ausencias, cantidad de postulantesRegresión de Poisson
GammaContinua, positiva, sesgadainverseTiempo hasta la contratación, costosRegresión Gamma
quasibinomialProporciones con sobredispersiónlogit% de rotación por unidad (no individual)Logística con sobredispersión
quasipoissonConteos con sobredispersiónlogConteos con varianza > mediaPoisson con sobredispersión

Ejemplos de cada family

# Regresión logística (la más usada en PA para rotación)
glm(rotacion_bin ~ satisfaccion + edad, data = innovaco,
    family = binomial)

# Regresión lineal vía glm (idéntica a lm())
glm(ingreso_mensual ~ antiguedad_anios + nivel_educacion, data = innovaco,
    family = gaussian)

# Regresión de Poisson para conteos
glm(n_ausencias ~ satisfaccion + departamento, data = datos_ausencias,
    family = poisson)

# Regresión Gamma para tiempos (sesgados a la derecha)
glm(tiempo_contratacion ~ canal + cargo, data = datos_recruiting,
    family = Gamma(link = "log"))
📝 En este curso usaremos principalmente family = binomial La regresión logística es la herramienta estrella de people analytics para predecir eventos binarios: rotación (semana 3), promoción, ausentismo, éxito en el período de prueba, etc. El Apunte 10 cubre la regresión logística en profundidad.

4. Funciones de enlace

Cada family tiene un enlace por defecto, pero puedes cambiarlo. El enlace transforma la media de la variable dependiente para que la relación con los predictores sea lineal.

EnlaceFórmulaFamily habitualCuándo elegirlo
identityμ = XβgaussianY es continua sin restricción
logitlog(p/(1−p)) = XβbinomialY es probabilidad (0 a 1)
probitΦ⁻¹(p) = XβbinomialAlternativa al logit (poco usado en RRHH)
loglog(μ) = Xβpoisson, GammaY es positiva (conteos, tiempos)
inverse1/μ = XβGammaDefault Gamma (raro cambiarlo)
# Enlace logit (default para binomial)
glm(y ~ x, family = binomial)               # equivale a:
glm(y ~ x, family = binomial(link = "logit"))

# Enlace probit (alternativa al logit)
glm(y ~ x, family = binomial(link = "probit"))

# Enlace log para Gamma
glm(y ~ x, family = Gamma(link = "log"))

5. Lo que devuelve glm(): el objeto modelo

Cuando guardas el resultado de glm() en un objeto, R almacena mucha información. Los componentes más útiles:

modelo <- glm(rotacion_bin ~ satisfaccion_laboral + edad,
              data = innovaco, family = binomial)

# Resumen completo
summary(modelo)

# Componentes individuales
coef(modelo)           # coeficientes (en log-odds para logística)
confint(modelo)         # intervalos de confianza de los coeficientes
fitted(modelo)          # valores predichos (en la escala del enlace)
residuals(modelo)       # residuos del modelo
modelo$deviance          # deviance del modelo
modelo$null.deviance     # deviance del modelo nulo
modelo$aic               # AIC
modelo$df.residual       # grados de libertad residuales
modelo$family            # familia y enlace usados

Cómo leer summary(glm_model)

# El output de summary() tiene estas secciones:

# 1. Call: la fórmula usada
# 2. Deviance Residuals: distribución de los residuos
# 3. Coefficients:
#      Estimate  = coeficiente (log-odds en logística)
#      Std.Error = error estándar del coeficiente
#      z value   = estadístico Wald (Estimate / Std.Error)
#      Pr(>|z|)  = p-value
#      Signif. codes: ***, **, *, .
# 4. Null deviance: ajuste del modelo sin predictores
# 5. Residual deviance: ajuste del modelo con predictores
# 6. AIC: Akaike Information Criterion
Los coeficientes de summary() están en log-odds (para logística) No son directamente interpretables. Para obtener odds ratios, usa exp(coef(modelo)) o, mejor aún, usa el paquete broom con tidy(modelo, exponentiate = TRUE) (ver Apunte 09).

6. Predicciones con predict()

# Predicciones en la escala del enlace (log-odds para logística)
predict(modelo)
# Ejemplo: -1.23 (esto NO es una probabilidad)

# Predicciones como probabilidades (lo que necesitas)
predict(modelo, type = "response")
# Ejemplo: 0.23 (23% de probabilidad de irse)

# Para datos nuevos
nuevos_datos <- tibble(
  satisfaccion_laboral = c(1, 3, 5),
  edad = c(25, 35, 45)
)
predict(modelo, newdata = nuevos_datos, type = "response")
⚠️ Error más común de la semana Olvidar type = "response". Sin este argumento, predict() devuelve log-odds (valores como −2.3 o 1.7), no probabilidades. Para obtener probabilidades entre 0 y 1, siempre usa type = "response".

7. Comparar modelos: AIC y deviance

AIC (Akaike Information Criterion)

El AIC balancea el ajuste del modelo con su complejidad. Menor AIC = mejor modelo.

AIC = −2 × log-verosimilitud + 2k

donde k es el número de parámetros. Agregar variables mejora el ajuste (baja la log-verosimilitud) pero aumenta la penalización (2k). El AIC encuentra el balance.

# AIC de un modelo
AIC(modelo)
modelo$aic

# Comparar varios modelos
AIC(mod_nulo, mod_1, mod_3, mod_ext)

Reglas prácticas para diferencias de AIC

Diferencia ΔAICInterpretación
0 – 2Modelos equivalentes. Preferir el más simple (parsimonia)
2 – 7Diferencia moderada. El modelo con menor AIC es probablemente mejor
> 10Diferencia fuerte. Claramente uno es mejor

Deviance

La deviance mide cuánto se aleja el modelo del ajuste perfecto. La diferencia entre null deviance y residual deviance indica cuánto mejoran los predictores:

# Diferencia de deviance (análogo a R² en regresión lineal)
1 - modelo$deviance / modelo$null.deviance
# Pseudo-R² de McFadden: valores > 0.2 son considerados buenos

8. glm() vs. lm(): cuándo usar cada uno

lm() — Regresión lineal

Variable dependiente: Continua, normal

Ejemplos: Predecir ingreso mensual, predecir score de engagement

lm(ingreso ~ antiguedad + educacion)

glm() — Modelo lineal generalizado

Variable dependiente: Cualquiera (binaria, conteo, etc.)

Ejemplos: Predecir rotación (Sí/No), número de ausencias

glm(rotacion_bin ~ satisfaccion, family = binomial)

glm(y ~ x, family = gaussian) es idéntico a lm(y ~ x) lm() es un caso particular de glm() con family = gaussian y link = identity. En la práctica, si tu variable dependiente es continua y normal, usa lm() porque es más simple. Usa glm() cuando necesites otra distribución.

9. Variables categóricas como predictores

Cuando incluyes una variable chr o factor en glm(), R automáticamente crea variables dummy (indicadoras). El primer nivel alfabético se convierte en la categoría de referencia.

# Si departamento tiene 6 niveles, R crea 5 dummies
glm(rotacion_bin ~ departamento, data = innovaco, family = binomial)

# El output mostrará:
# departamentoFinanzas         (comparado con la referencia)
# departamentoRRHH             (comparado con la referencia)
# departamentoSoporte Técnico  (comparado con la referencia)
# departamentoVentas           (comparado con la referencia)
# departamento...              etc.

# Para cambiar la categoría de referencia
innovaco <- innovaco |>
  mutate(departamento = relevel(factor(departamento), ref = "Desarrollo"))

10. Resumen rápido

AcciónCódigo
Ajustar modelo logísticoglm(y ~ x1 + x2, data, family = binomial)
Ver resumensummary(modelo)
Coeficientes (log-odds)coef(modelo)
Odds ratiosexp(coef(modelo)) o broom::tidy(modelo, exponentiate = TRUE)
Intervalos de confianzaconfint(modelo)
Probabilidades predichaspredict(modelo, type = "response")
AICAIC(modelo) o modelo$aic
Deviancemodelo$deviance
Pseudo-R²1 - modelo$deviance / modelo$null.deviance