Caso con datos reales
Un modelo del ingreso, construido paso a paso
De la regresión simple a la múltiple sobre datos de la EPH: qué gana cada variable, por qué conviene el logaritmo y qué pasa al agregar ruido puro.
La pregunta
¿Qué explica el ingreso de la ocupación principal?
14.129 ocupados de 18 años o más de la EPH del primer trimestre de 2026, que declararon a la vez ingreso positivo y horas trabajadas.
Modelo 1: una sola variable
. Cada hora semanal adicional se asocia a $15.610 más de ingreso mensual, y las horas explican el 6 % de la variabilidad.
Modelo 2: cinco variables
Agregando edad, sexo y nivel educativo —estas dos últimas como variables dummy—:
| Término | EE | |||
|---|---|---|---|---|
| Constante | −233.134 | 43.234 | −5,39 | |
| Horas semanales | 14.557 | 506 | 28,77 | |
| Edad (años) | 10.076 | 636 | 15,85 | |
| Mujer | −269.859 | 16.647 | −16,21 | |
| Secundario | 249.541 | 24.907 | 10,02 | |
| Superior | 726.490 | 25.832 | 28,12 |
, más del doble que el modelo simple.
Cómo se leen. Cada coeficiente es el efecto de esa variable manteniendo las demás constantes:
- Una hora semanal más: +$14.557, a igual edad, sexo y educación.
- Un año más de edad: +$10.076.
- Ser mujer: −$269.859, comparando personas con las mismas horas, edad y educación.
- Nivel superior contra primario: +$726.490.
Los residuos no se portan bien
| Diagnóstico | Modelo en pesos |
|---|---|
| Asimetría de los residuos | 12,33 |
| Breusch-Pagan |
Los residuos son muy asimétricos y su dispersión crece con el valor predicho: dos supuestos violados a la vez.
Modelo 3: el logaritmo cambia todo
La misma especificación sobre :
| Término | Efecto | |
|---|---|---|
| Horas | 0,0213 | +2,2 % por hora semanal |
| Edad | 0,0081 | +0,8 % por año |
| Mujer | −0,2939 | −25,5 % |
| Secundario | 0,2987 | +34,8 % |
| Superior | 0,7766 | +117,4 % |
contra 0,146, y la asimetría de los residuos cae de 12,33 a −0,54.
Qué pasa al agregar ruido puro
Se agregan al modelo 2 tres variables generadas al azar, sin ninguna relación con el ingreso:
| Modelo | ajustado | AIC | BIC | ||
|---|---|---|---|---|---|
| Solo horas | 1 | 0,06158 | 0,06151 | 430.126 | 430.141 |
| + edad | 2 | 0,07209 | 0,07196 | 429.969 | 429.992 |
| + sexo | 3 | 0,07963 | 0,07943 | 429.856 | 429.886 |
| + educación | 5 | 0,14631 | 0,14601 | 428.797 | 428.842 |
| + 3 variables de ruido | 8 | 0,14649 | 0,14601 | 428.800 | 428.868 |
Es la demostración empírica de por qué el crudo no sirve para comparar modelos con distinta cantidad de variables.
Validación fuera de la muestra
Entrenando con el 70 % de los casos y evaluando en el 30 % restante:
| Entrenamiento (9.890 casos) | 0,139 |
| Prueba (4.239 casos) | 0,173 |
No hay sobreajuste: el modelo funciona igual o mejor con datos que no vio. Es lo esperable con 14.000 casos y solo cinco predictores.
Un modelo para una variable binaria
Cambiando la pregunta a ¿quién tiene empleo registrado?, sobre 13.864 asalariados, con regresión logística:
| Término | Odds ratio | IC 95 % del OR | |
|---|---|---|---|
| Edad | 0,0460 | 1,047 | 1,044 – 1,051 |
| Mujer | −0,4812 | 0,618 | 0,573 – 0,667 |
| Secundario | 0,9280 | 2,530 | 2,244 – 2,852 |
| Superior | 1,9954 | 7,355 | 6,470 – 8,363 |
- Cada año de edad multiplica la chance de estar registrado por 1,047.
- Ser mujer la multiplica por 0,618: una reducción del 38 %.
- Tener nivel superior la multiplica por 7,4 respecto del primario.
El pseudo de McFadden es 0,104, que para datos individuales es un valor razonable.
Lo que el modelo no dice
Ninguno de estos coeficientes prueba causalidad. La brecha de $269.859 por sexo es una asociación ajustada por horas, edad y educación: no ajusta por ocupación, sector, antigüedad ni informalidad, y no puede distinguir discriminación salarial de segregación ocupacional.
Reproducirlo
# R
m1 <- lm(ingreso ~ horas, data = d)
m2 <- lm(ingreso ~ horas + edad + mujer + secundario + superior, data = d)
m3 <- lm(log(ingreso) ~ horas + edad + mujer + secundario + superior, data = d)
summary(m2); AIC(m2); BIC(m2)
plot(m2) # los cuatro diagnósticos
lmtest::bptest(m2) # Breusch-Pagan
car::vif(m2) # multicolinealidad
ml <- glm(registrado ~ edad + mujer + secundario + superior,
data = a, family = binomial)
exp(cbind(OR = coef(ml), confint(ml)))
# Python
import statsmodels.formula.api as smf
m2 = smf.ols("ingreso ~ horas + edad + mujer + secundario + superior",
data=d).fit()
m2.summary()
ml = smf.logit("registrado ~ edad + mujer + secundario + superior",
data=a).fit()
El script completo es datos/eph/preparar-regresion-m13.py, con semilla 2026.