Apunte 11 — Regresión lineal con lm()

Analítica de Personas · Semestre otoño 2026 · Semana 5 · Prof. René Gempp

1. ¿Para qué sirve una regresión lineal en RRHH?

La regresión lineal responde una pregunta del tipo: "¿qué explica la variación de Y, y cuánto aporta cada variable a esa explicación?". En people analytics, las preguntas típicas son:

La regresión lineal exige una variable dependiente continua (salario, puntaje de engagement, horas de capacitación, etc.). Cuando la VD es binaria, usamos regresión logística (Apunte 09). La sintaxis en R es casi idéntica.

2. La sintaxis de lm()

# Estructura general
modelo <- lm(VD ~ VI1 + VI2 + VI3, data = mi_base)

# Ejemplo: salario en función del género
modelo_1 <- lm(log(ingreso_mensual) ~ genero, data = empleados)
Paralelo con glm(): La sintaxis es la misma que aprendiste para la regresión logística en la Clase 3. La única diferencia es que lm() no necesita argumento family: por defecto asume una distribución normal de los residuos. glm(VD ~ VI, family = binomial) ⇒ logística; lm(VD ~ VI) ⇒ lineal.

3. Lectura del summary()

summary(modelo_1)
Call: lm(formula = log(ingreso_mensual) ~ genero, data = empleados) Residuals: Min 1Q Median 3Q Max -1.36912 -0.65089 -0.01258 0.65430 1.71247 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 14.10891 0.02999 470.42 <2e-16 *** generoMujer -0.08628 0.04576 -1.89 0.0596 . --- Residual standard error: 0.7905 on 1198 degrees of freedom Multiple R-squared: 0.00297, Adjusted R-squared: 0.00214 F-statistic: 3.567 on 1 and 1198 DF, p-value: 0.05912

Cómo se lee, línea por línea:

ElementoQué significa
CallEl modelo que ajustaste. Verifica que sea el que querías.
ResidualsResumen de los errores del modelo. Buscamos mediana cercana a 0 y cuartiles aproximadamente simétricos.
(Intercept)Valor predicho de la VD cuando todas las VI categóricas están en su nivel de referencia y las numéricas valen 0.
EstimateEl coeficiente β: cuánto cambia la VD por una unidad de cambio en esa VI.
Std. ErrorCuán precisa es esa estimación. Más pequeño = más preciso.
t valueEstimate / Std. Error. Indica cuántos errores estándar se aleja el coeficiente de cero.
Pr(>|t|)p-value: probabilidad de observar un t así de extremo si la verdadera β fuera cero. Menor a 0.05 ⇒ significativo (Apunte 07).
R-squaredProporción de la varianza de la VD explicada por el modelo. Va de 0 a 1.
Adjusted R²R² penalizado por el número de predictores. Es el que se debe reportar en modelos con varios predictores.
F-statisticTest global del modelo: ¿al menos un predictor es útil? Su p-value debe ser pequeño.

4. Predictores categóricos: dummies automáticas

Cuando una variable es categórica (texto), R crea automáticamente variables dummy y elige una categoría como referencia. Por defecto, R toma la categoría que viene primero alfabéticamente.

# En empleados$genero hay dos niveles: "Hombre" y "Mujer"
# R toma "Hombre" como referencia (por orden alfabético)
# Por eso aparece "generoMujer" en el output, pero NO "generoHombre"
Cambiar la categoría de referencia: Si quieres que el grupo de referencia sea otro, usa fct_relevel():
empleados <- empleados |>
  mutate(genero = fct_relevel(genero, "Mujer"))

Para una variable con k categorías, R crea k − 1 dummies. Por ejemplo, nivel_jerarquico tiene 4 niveles (Operativo, Profesional, Jefatura, Gerencia), por lo que en el output verás 3 coeficientes: nivel_jerarquicoOperativo, nivel_jerarquicoProfesional, nivel_jerarquicoJefatura. La categoría que falta (Gerencia) es la referencia.

5. Predictores múltiples: ceteris paribus

modelo_2 <- lm(
  log(ingreso_mensual) ~ genero + nivel_jerarquico + departamento +
                          antiguedad_anios + edad + nivel_educacion +
                          evaluacion_desempeno,
  data = empleados
)

summary(modelo_2)
Cómo se lee cada coeficiente en un modelo múltiple: "El cambio esperado en la VD por una unidad de cambio en esta VI, manteniendo constantes todas las demás variables del modelo." Esa cláusula ceteris paribus es lo que hace tan poderosa la regresión múltiple: nos permite aislar el efecto de cada variable.

Ejemplo concreto: si en el Modelo 2 el coeficiente de generoMujer vale −0,08, lo leemos así:

"A igualdad de nivel jerárquico, departamento, antigüedad, edad, educación y desempeño, las mujeres ganan en promedio aproximadamente un 8% menos que los hombres en InnovaCo."

6. La transformación logarítmica de la VD

En el ejemplo anterior usamos log(ingreso_mensual) como variable dependiente, no ingreso_mensual directo. Tres razones:

Razón 1: la distribución de salarios es asimétrica

Los salarios típicamente tienen una cola larga a la derecha (pocas personas con sueldos muy altos). Un histograma de ingreso_mensual se ve sesgado; un histograma de log(ingreso_mensual) se aproxima a una normal. Los modelos lineales asumen residuos aproximadamente normales.

Razón 2: el coeficiente se interpreta como porcentaje

Cuando la VD es log(Y), un coeficiente β se interpreta como un cambio porcentual en Y, no como un cambio en pesos. La aproximación es:

Coeficiente βInterpretación aproximadaCálculo exacto
−0.05≈ 5% menos(exp(−0.05) − 1) × 100 = −4.9%
−0.08≈ 8% menos(exp(−0.08) − 1) × 100 = −7.7%
+0.10≈ 10% más(exp(0.10) − 1) × 100 = +10.5%
+0.30≈ 30% más (impreciso)(exp(0.30) − 1) × 100 = +35.0%
Regla práctica: Para coeficientes pequeños (entre −0.15 y +0.15), la aproximación β ≈ % es suficientemente exacta. Para coeficientes mayores, calcula (exp(β) − 1) × 100.

Razón 3: estabiliza la varianza de los residuos

En escala original, los errores del modelo crecen con el salario (alguien que gana 10 millones puede tener residuos de cientos de miles; alguien que gana 600 mil tiene residuos mucho menores). En escala log, esos errores tienden a estabilizarse, cumpliendo mejor el supuesto de homocedasticidad (Apunte 12).

7. Resumen visual: la regresión lineal en R

Quiero...Función
Ajustar el modelolm(VD ~ VI1 + VI2, data = ...)
Ver coeficientes, R², Fsummary(modelo)
Tabla ordenada de coeficientesbroom::tidy(modelo, conf.int = TRUE) (Apunte 13)
R², AIC, BIC en una filabroom::glance(modelo) (Apunte 13)
Residuos y valores ajustadosbroom::augment(modelo) (Apunte 12)
Multicolinealidadcar::vif(modelo) (Apunte 12)
Predicción para nuevos casospredict(modelo, newdata = ...)
Especificar interaccionesVI1 * VI2 (Apunte 13)
Comparar dos modelos anidadosanova(modelo_1, modelo_2)