Analítica de Personas · Semestre otoño 2026 · Semana 3 · Referencia
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:
| Componente | Qué es | Ejemplo (regresión logística) |
|---|---|---|
| Componente aleatoria | La distribución de Y | Binomial (Y es 0 o 1) |
| Componente sistemática | La combinación lineal de predictores | β₀ + β₁X₁ + β₂X₂ + ... |
| Función de enlace | Conecta la media de Y con los predictores | Logit: log(p / (1−p)) |
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)
)
| Fórmula | Significado | Ejemplo |
|---|---|---|
y ~ x | Un predictor | rotacion_bin ~ satisfaccion_laboral |
y ~ x1 + x2 | Efectos principales aditivos | rotacion_bin ~ satisfaccion + edad |
y ~ x1 * x2 | Efectos principales + interacción | Equivale a x1 + x2 + x1:x2 |
y ~ x1:x2 | Solo la interacción | Sin efectos principales (raro) |
y ~ . | Todos los predictores del data frame | rotacion_bin ~ . (peligroso: incluye todo) |
y ~ x1 + I(x2^2) | Término cuadrático | Efecto no lineal de x2 |
y ~ 1 | Modelo nulo (solo intercepto) | Referencia para comparar |
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.
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.
| Family | Variable dependiente | Enlace por defecto | Uso en RRHH | Equivale a... |
|---|---|---|---|---|
gaussian | Continua, normal | identity | Predecir ingreso, satisfacción continua | lm() |
binomial | Binaria (0/1, Sí/No) | logit | Predecir rotación, ausentismo, promoción | Regresión logística |
poisson | Conteo (enteros ≥ 0) | log | Número de ausencias, cantidad de postulantes | Regresión de Poisson |
Gamma | Continua, positiva, sesgada | inverse | Tiempo hasta la contratación, costos | Regresión Gamma |
quasibinomial | Proporciones con sobredispersión | logit | % de rotación por unidad (no individual) | Logística con sobredispersión |
quasipoisson | Conteos con sobredispersión | log | Conteos con varianza > media | Poisson con sobredispersión |
# 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"))
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.
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.
| Enlace | Fórmula | Family habitual | Cuándo elegirlo |
|---|---|---|---|
identity | μ = Xβ | gaussian | Y es continua sin restricción |
logit | log(p/(1−p)) = Xβ | binomial | Y es probabilidad (0 a 1) |
probit | Φ⁻¹(p) = Xβ | binomial | Alternativa al logit (poco usado en RRHH) |
log | log(μ) = Xβ | poisson, Gamma | Y es positiva (conteos, tiempos) |
inverse | 1/μ = Xβ | Gamma | Default 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"))
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
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
exp(coef(modelo)) o, mejor aún, usa el paquete broom con tidy(modelo, exponentiate = TRUE) (ver Apunte 09).
# 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")
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".
El AIC balancea el ajuste del modelo con su complejidad. Menor AIC = mejor modelo.
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)
| Diferencia ΔAIC | Interpretación |
|---|---|
| 0 – 2 | Modelos equivalentes. Preferir el más simple (parsimonia) |
| 2 – 7 | Diferencia moderada. El modelo con menor AIC es probablemente mejor |
| > 10 | Diferencia fuerte. Claramente uno es mejor |
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
Variable dependiente: Continua, normal
Ejemplos: Predecir ingreso mensual, predecir score de engagement
lm(ingreso ~ antiguedad + educacion)
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.
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"))
| Acción | Código |
|---|---|
| Ajustar modelo logístico | glm(y ~ x1 + x2, data, family = binomial) |
| Ver resumen | summary(modelo) |
| Coeficientes (log-odds) | coef(modelo) |
| Odds ratios | exp(coef(modelo)) o broom::tidy(modelo, exponentiate = TRUE) |
| Intervalos de confianza | confint(modelo) |
| Probabilidades predichas | predict(modelo, type = "response") |
| AIC | AIC(modelo) o modelo$aic |
| Deviance | modelo$deviance |
| Pseudo-R² | 1 - modelo$deviance / modelo$null.deviance |