1 Presentación

La regresión logística o modelo logit es una de las herramientas más utilizadas cuando la variable de interés es dicotómica. En el campo del mercado laboral resulta especialmente útil para estudiar eventos como el desempleo, la informalidad, el acceso a la seguridad social o, como en esta guía, la probabilidad de que una persona ocupada pertenezca a un hogar en situación de pobreza.

En esta guía se desarrolla una aplicación completa del modelo logit utilizando un ejemplo simulado sobre el fenómeno del trabajador pobre, entendido como la situación en la que una persona se encuentra ocupada, pero vive en un hogar cuyos ingresos son insuficientes para superar la línea de pobreza. El objetivo didáctico es presentar el fundamento teórico del modelo y, al mismo tiempo, mostrar cómo implementarlo e interpretarlo en R.

2 Objetivos de aprendizaje

Al finalizar esta guía, serás capaz de:

  1. Comprender la lógica del modelo de regresión logística.
  2. Expresar el modelo en términos de probabilidad y en términos de logit.
  3. Identificar el rol de variables explicativas cuantitativas y cualitativas.
  4. Reconocer cuántos parámetros se estiman según el tipo de variable incorporada.
  5. Aplicar pruebas de hipótesis individuales y globales para evaluar el modelo.
  6. Interpretar los parámetros estimados y calcular los efectos marginales.
  7. Evaluar la bondad de ajuste mediante matriz de confusión, tasa de clasificación correcta, sensibilidad, especificidad y AUC.
  8. Generar predicciones para perfiles concretos de trabajadores.

3 Contexto analítico: el trabajador pobre

El fenómeno del trabajador pobre evidencia que tener empleo no garantiza necesariamente condiciones de vida adecuadas. Desde una perspectiva aplicada, interesa modelar la probabilidad de que un trabajador sea pobre en función de características individuales y laborales, tales como:

  • edad,
  • sexo,
  • nivel educativo,
  • ingreso laboral,
  • condición de formalidad.

En esta guía se utiliza una base simulada para fines pedagógicos. No obstante, la lógica de especificación, estimación e interpretación es la misma que se emplea en aplicaciones con datos reales de encuestas de hogares o registros administrativos.

4 Estructura del modelo logit

4.1 Variable dependiente binaria

Sea \(Y_i\) una variable dicotómica definida como:

\[ Y_i = \begin{cases} 1 & \text{si el trabajador } i \text{ es pobre} \\ 0 & \text{si el trabajador } i \text{ no es pobre} \end{cases} \]

Como \(Y_i\) solo puede tomar dos valores, el interés no está en modelar directamente el valor observado, sino la probabilidad condicional de ocurrencia del evento:

\[ P(Y_i = 1 \mid X_i) = p_i \]

4.2 Ecuación del modelo

Definiendo la probabilidad condicional de interés como \(p(\mathbf{X}) = \Pr(Y = 1 \mid \mathbf{X})\), y considerando la transformación logit, el modelo de regresión logística con enlace logit puede expresarse como:

\[ \text{logit}\big(p(\mathbf{X})\big) = \log\left(\frac{p(\mathbf{X})}{1 - p(\mathbf{X})}\right) = L(\mathbf{X}) = \beta_0 + \sum_{j=1}^{k} \beta_j X_j \]

donde:

  • \(Y\) es la variable respuesta dicotómica.
  • \(p(\mathbf{X}) = \Pr(Y = 1 \mid \mathbf{X})\) representa la probabilidad de ocurrencia del evento de interés, condicionada a un conjunto de variables explicativas \(\mathbf{X}\).
  • \(\beta_0\) es el intercepto del modelo.
  • \(\beta_j\) es el parámetro asociado a la variable explicativa \(X_j\).
  • \(k\) es el número de variables explicativas incluidas en el modelo.

La expresión anterior indica que el modelo no relaciona directamente a las variables explicativas con la probabilidad \(p(\mathbf{X})\), sino con el logaritmo del cociente entre la probabilidad de ocurrencia del evento y la probabilidad de no ocurrencia, es decir, con el logaritmo de las odds.

En términos de probabilidad De manera equivalente, la probabilidad condicional también puede expresarse en su forma funcional como:

\[ p(\mathbf{X}) = \Pr(Y = 1 \mid \mathbf{X}) = \frac{\exp\left(\beta_0 + \sum_{j=1}^{k} \beta_j X_j\right)} {1 + \exp\left(\beta_0 + \sum_{j=1}^{k} \beta_j X_j\right)} \]

Esta forma resulta especialmente útil para interpretar que la probabilidad estimada siempre queda acotada entre 0 y 1.

4.3 Asociación entre \(X_j\) y \(Y\)

En el modelo anterior, y teniendo en cuenta que la transformación logit es monótona creciente, la interpretación del parámetro \(\beta_j\) depende de la naturaleza de la variable explicativa \(X_j\):

  • Si \(X_j\) es binaria, entonces \(\beta_j\) representa el cambio de la probabilidad del evento cuando la variable pasa desde la categoría de referencia a la categoría alternativa.

  • Si \(X_j\) es categórica con más de dos categorías, en el modelo se incorporan \(k-1\) variables indicadoras o dummies, una para cada categoría distinta de la categoría de referencia. En este caso, cada parámetro estimado compara una categoría con respecto a dicha referencia.

  • Si \(X_j\) es cuantitativa continua, entonces \(\beta_j\) representa el cambio esperado de la probabilidad ante un incremento de una unidad en \(X_j\), manteniendo constantes las demás variables.

En términos generales:

  • si \(\beta_j = 0\)implica que, controlando por el resto de las variables del modelo, no existe evidencia de asociación lineal entre \(X_j\) y el logit de la probabilidad del evento.

Por el contrario:

  • si \(\beta_j > 0\), el aumento en \(X_j\) incrementa las odds del evento y, por tanto, tiende a aumentar la probabilidad de ocurrencia;
  • si \(\beta_j < 0\), el aumento en \(X_j\) reduce las odds del evento y, por tanto, tiende a disminuir la probabilidad de ocurrencia.

5 Variables del modelo y número de parámetros

Un tema clave durante la selección de variables explicativas, es saber cuántos parámetros serán estimados. A continuación se presenta la estructura de variables considerada en la aplicación.

5.1 Variable dependiente

  • pobre: condición de trabajador pobre.
    • 1 = Trabajador pobre
    • 0 = Trabajador no pobre

5.2 Variables explicativas

  1. edad: variable cuantitativa.
  2. sexo: variable cualitativa dicotómica (hombre y mujer).
  3. educacion: variable cualitativa con tres categorías (primaria, secundaria y terciaria).
  4. ingreso: variable cuantitativa.
  5. formalidad: variable cualitativa dicotómica (formal e informal).

5.3 ¿Cuántos parámetros aporta cada variable?

Sea el modelo:

\[ p(\mathbf{X}) = \Pr(Y = 1 \mid \mathbf{X}) = \frac{\exp\left(\beta_0 + \sum_{j=1}^{k} \beta_j X_j\right)} {1 + \exp\left(\beta_0 + \sum_{j=1}^{k} \beta_j X_j\right)} \]

El número de parámetros asociados a cada variable depende de su naturaleza:

  • Una variable cuantitativa aporta 1 parámetro.
  • Una variable cualitativa dicotómica aporta 1 parámetro, una vez fijada una categoría de referencia.
  • Una variable cualitativa con \(J\) categorías aporta \(J-1\) parámetros.

En este caso:

  • edad \(\rightarrow\) 1 parámetro.
  • ingreso \(\rightarrow\) 1 parámetro.
  • educacion (Primario, Secundario, Terciario) \(\rightarrow\) 2 parámetros, porque una categoría queda como referencia.
  • formalidad (Formal, Informal) \(\rightarrow\) 1 parámetro.
  • sexo (Hombre, Mujer) \(\rightarrow\) 1 parámetro.

Por tanto, el modelo tendrá:

  • 1 intercepto,
  • 6 parámetros explicativos,
  • total = 7 parámetros estimados.

6 Ejercicio de Aplicación

En esta sección utilizaremos los datos simulados para el ajuste del modelo paso a paso.

6.1 Librerías

library(dplyr)
library(ResourceSelection)
library(ROCR)
library(margins)
library(openxlsx)
library(knitr)

Nota: si algún paquete no está instalado en su equipo, instálelo una sola vez en la consola de R mediante install.packages("nombre_del_paquete"). No se recomienda incluir install.packages() dentro de los chunks del R Markdown que serán compilados regularmente.

6.2 Simulación de datos

# Fijar semilla para reproducibilidad
set.seed(123)

# Simular base de datos de trabajadores
n <- 1000
trabajadores <- data.frame(
  edad = round(runif(n, 18, 65)),
  ingreso = round(rnorm(n, mean = 2500000, sd = 900000)),
  educacion = sample(c("Primario", "Secundario", "Terciario"),
                     n, replace = TRUE, prob = c(0.4, 0.4, 0.2)),
  formalidad = sample(c("Formal", "Informal"),
                      n, replace = TRUE, prob = c(0.5, 0.5)),
  sexo = sample(c("Hombre", "Mujer"), n, replace = TRUE)
)

# Convertir variables a factor
trabajadores$educacion <- factor(
  trabajadores$educacion,
  levels = c("Primario", "Secundario", "Terciario")
)

trabajadores$formalidad <- factor(
  trabajadores$formalidad,
  levels = c("Formal", "Informal")
)

trabajadores$sexo <- factor(
  trabajadores$sexo,
  levels = c("Hombre", "Mujer")
)

6.3 Construcción de la probabilidad de pobreza y variable respuesta

trabajadores <- trabajadores %>%
  mutate(
    educ_prim = ifelse(educacion == "Primario", 1, 0),
    educ_sec  = ifelse(educacion == "Secundario", 1, 0),
    informal  = ifelse(formalidad == "Informal", 1, 0),
    mujer     = ifelse(sexo == "Mujer", 1, 0)
  )

# Probabilidad teórica de ser trabajador pobre
trabajadores$prob_pobre <- plogis(
  2.2 - 0.03 * trabajadores$edad - 0.0000015 * trabajadores$ingreso +
    0.9 * trabajadores$educ_prim + 0.5 * trabajadores$educ_sec +
    1.1 * trabajadores$informal + 0.3 * trabajadores$mujer
)

# Variable binaria numérica para estimación
trabajadores$pobre_num <- rbinom(n, 1, trabajadores$prob_pobre)

# Fijar categoría de referencia para educación
trabajadores$educacion <- relevel(trabajadores$educacion, ref = "Terciario")

# Versión etiquetada para presentación de tablas
trabajadores$pobre <- factor(
  trabajadores$pobre_num,
  levels = c(0, 1),
  labels = c("Trab_no_Pobre", "Trab_Pobre")
)

6.4 Exploración inicial

str(trabajadores)
## 'data.frame':    1000 obs. of  12 variables:
##  $ edad      : num  32 55 37 60 62 20 43 60 44 39 ...
##  $ ingreso   : num  1958296 1605671 3424107 3175955 1141750 ...
##  $ educacion : Factor w/ 3 levels "Terciario","Primario",..: 3 1 3 2 3 2 2 2 1 1 ...
##  $ formalidad: Factor w/ 2 levels "Formal","Informal": 2 1 1 1 2 2 1 2 1 1 ...
##  $ sexo      : Factor w/ 2 levels "Hombre","Mujer": 1 2 2 2 2 1 1 2 1 2 ...
##  $ educ_prim : num  0 0 0 1 0 1 1 1 0 0 ...
##  $ educ_sec  : num  1 0 1 0 1 0 0 0 0 0 ...
##  $ informal  : num  1 0 0 0 1 1 0 1 0 0 ...
##  $ mujer     : num  0 1 1 1 1 0 0 1 0 1 ...
##  $ prob_pobre: num  0.4757 0.1739 0.0375 0.0405 0.6289 ...
##  $ pobre_num : int  0 0 0 0 1 1 0 1 1 0 ...
##  $ pobre     : Factor w/ 2 levels "Trab_no_Pobre",..: 1 1 1 1 2 2 1 2 2 1 ...
summary(trabajadores[, c("edad", "ingreso", "educacion", "formalidad", "sexo", "pobre")])
##       edad          ingreso             educacion      formalidad      sexo    
##  Min.   :18.00   Min.   : -28797   Terciario :225   Formal  :489   Hombre:485  
##  1st Qu.:30.00   1st Qu.:1880453   Primario  :382   Informal:511   Mujer :515  
##  Median :41.00   Median :2525932   Secundario:393                              
##  Mean   :41.37   Mean   :2510740                                               
##  3rd Qu.:53.00   3rd Qu.:3089563                                               
##  Max.   :65.00   Max.   :5551334                                               
##            pobre    
##  Trab_no_Pobre:747  
##  Trab_Pobre   :253  
##                     
##                     
##                     
## 

7 Estimación del modelo logístico -Ajuste

7.1 Especificación

El modelo a estimar es:

\[ \log\left(\frac{p_i}{1-p_i}\right) = \beta_0 + \beta_1 \text{edad}_i + \beta_2 \text{ingreso}_i + \beta_3 \text{Primario}_i + \beta_4 \text{Secundario}_i + \beta_5 \text{Informal}_i + \beta_6 \text{Mujer}_i \]

donde la categoría de referencia para educación es Terciario, para formalidad es Formal y para sexo es Hombre.

7.2 Ajuste del modelo en R

modelo_logit <- glm(
  pobre ~ edad + sexo+ educacion +ingreso + formalidad,
  data = trabajadores,
  family = binomial(link = "logit")
)

summary(modelo_logit)
## 
## Call:
## glm(formula = pobre ~ edad + sexo + educacion + ingreso + formalidad, 
##     family = binomial(link = "logit"), data = trabajadores)
## 
## Coefficients:
##                       Estimate Std. Error z value Pr(>|z|)    
## (Intercept)          2.755e+00  4.397e-01   6.265 3.72e-10 ***
## edad                -3.233e-02  6.550e-03  -4.936 7.97e-07 ***
## sexoMujer           -2.341e-02  1.727e-01  -0.136    0.892    
## educacionPrimario    4.483e-01  2.374e-01   1.888    0.059 .  
## educacionSecundario  3.673e-01  2.361e-01   1.555    0.120    
## ingreso             -1.570e-06  1.251e-07 -12.549  < 2e-16 ***
## formalidadInformal   1.273e+00  1.835e-01   6.938 3.98e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1131.21  on 999  degrees of freedom
## Residual deviance:  844.63  on 993  degrees of freedom
## AIC: 858.63
## 
## Number of Fisher Scoring iterations: 5

8 Pruebas de hipótesis

Una vez estimado el modelo, partiendo de que se ha realizado un muestreo probabilístico, nos interesa contrastar si los coeficientes estimados son significativamente distintos de 0. Es decir, si una determinada variable explicativa tiene un efecto significativo sobre la respuesta o no. Para dar respuesta a esta pregunta, utilizamos los contrastes de hipótesis sobre los parámetros, explicando dos métodos para realizarlos, los contrastes basados en el test de Wald y los basados en el test condicional de razón de verosimilitudes entre modelos anidados.

8.1 Prueba de hipótesis individual: Test de Wald

Para cada parámetro \(\beta_j\), la prueba de Wald contrasta:

\[ \begin{array}{p{3.5cm} p{11cm}} H_0: \beta_j = 0 & \text{No existe evidencia de que } X_j \text{ esté asociada con la probabilidad del evento de interés} \end{array} \]

\[ \begin{array}{p{3.5cm} p{11cm}} H_0: \beta_j \neq 0 & \text{No existe evidencia de que } X_j \text{ esté asociada con la probabilidad del evento de interés} \end{array} \]

El estadístico de Wald se construye como:

\[ Z = \frac{\hat{\beta}_j}{SE(\hat{\beta}_j)} \]

Si el valor-p es pequeño, se rechaza \(H_0\) y se concluye que la variable tiene asociación estadísticamente significativa con la probabilidad de ser trabajador pobre, manteniendo constantes las demás variables.

8.2 ¿Cómo se observa en R?

La salida de summary(modelo_logit) presenta:

  • Estimate: coeficiente estimado \(\hat{\beta}_j\)
  • Std. Error: error estándar
  • z value: estadístico de Wald
  • Pr(>|z|): valor-p asociado

8.3 Códigos de significancia en R

R suele presentar al final del resumen una leyenda como la siguiente:

Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Su interpretación es:

Código Interpretación aproximada
*** valor-p menor a 0.001
** valor-p entre 0.001 y 0.01
* valor-p entre 0.01 y 0.05
. valor-p entre 0.05 y 0.10
en blanco valor-p mayor o igual a 0.10

En términos prácticos, una variable con ***, ** o * suele considerarse estadísticamente significativa a niveles convencionales.

8.4 Prueba de hipótesis global: Razón de verosimilitud

La prueba global por razón de verosimilitud compara el modelo completo frente a un modelo nulo, es decir, un modelo que solo contiene intercepto.

Las hipótesis son:

\[ H_0: \beta_1 = \beta_2 = \cdots = \beta_k = 0 \]

\[ H_1: \text{al menos uno de los } \beta_j \text{ es distinto de 0} \]

Bajo \(H_0\), las variables explicativas no mejoran la explicación del evento respecto del modelo nulo.

modelo_nulo <- glm(pobre ~ 1, data = trabajadores, family = binomial)

anova(modelo_nulo, modelo_logit, test = "Chisq")
## Analysis of Deviance Table
## 
## Model 1: pobre ~ 1
## Model 2: pobre ~ edad + sexo + educacion + ingreso + formalidad
##   Resid. Df Resid. Dev Df Deviance  Pr(>Chi)    
## 1       999    1131.21                          
## 2       993     844.63  6   286.58 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Interpretación

  • Si el valor-p es pequeño (por ejemplo Pr(>Chi)<0,05), se rechaza \(H_0\).
  • Se concluye que el conjunto de variables explicativas mejora significativamente el ajuste del modelo.

8.5 Prueba de Hosmer-Lemeshow

La prueba de Hosmer-Lemeshow evalúa si las probabilidades predichas por el modelo son consistentes con los resultados observados en grupos de riesgo.

Las hipótesis son:

\[ H_0: \text{el modelo presenta buen ajuste} \]

\[ H_1: \text{el modelo no presenta buen ajuste} \]

En este test, un valor-p alto es deseable porque indica que no hay evidencia estadística para afirmar que el modelo ajusta mal.

hoslem.test(x = modelo_logit$y,
            y = fitted(modelo_logit),
            g = 10)
## 
##  Hosmer and Lemeshow goodness of fit (GOF) test
## 
## data:  modelo_logit$y, fitted(modelo_logit)
## X-squared = 4.0777, df = 8, p-value = 0.85

Interpretación

  • Si el valor-p es mayor que 0,05, no se rechaza \(H_0\): el ajuste es aceptable.
  • Si el valor-p es menor que 0,05, existe evidencia de mal ajuste.

9 Interpretación de los parámetros estimados

9.1 Según el signo

En un modelo de regresión logística, el signo del coeficiente estimado indica la dirección del efecto de cada variable explicativa sobre la probabilidad de ocurrencia del evento de interés. En este caso, el evento modelado es que el trabajador sea pobre (\(Y = 1\), es decir, Trab_Pobre). Por tanto:

  • un coeficiente positivo indica que la variable aumenta la probabilidad de que el trabajador sea pobre;
  • un coeficiente negativo indica que la variable disminuye la probabilidad de que el trabajador sea pobre,

manteniendo constantes las demás variables del modelo.

A partir de los resultados obtenidos, la interpretación de los signos es la siguiente:

  • Intercepto (\(\beta_0 = 2.755\)): representa el logit de la probabilidad de ser trabajador pobre para la categoría de referencia del modelo, es decir, para un trabajador hombre, con educación terciaria, en condición de formalidad formal, y con valor cero en las variables cuantitativas incluidas. En la práctica, su interpretación sustantiva suele ser limitada, pero sirve como punto de partida del modelo.

  • Edad (\(\beta = -0.03233\)): el signo negativo indica que, a medida que aumenta la edad del trabajador, la probabilidad de ser pobre disminuye, manteniendo constantes las demás variables. En otras palabras, los trabajadores de mayor edad presentan menor propensión a encontrarse en situación de pobreza laboral que los trabajadores más jóvenes.

  • Sexo: Mujer (\(\beta = -0.02341\)): el signo negativo indica que, en comparación con los hombres (categoría de referencia), las mujeres tendrían una probabilidad ligeramente menor de ser trabajadoras pobres, manteniendo constantes las demás variables. No obstante, dado que este coeficiente no resulta estadísticamente significativo, no existe evidencia suficiente para afirmar que el sexo esté asociado con la probabilidad de pobreza laboral en este modelo.

  • Educación: Primario (\(\beta = 0.4483\)): el signo positivo indica que los trabajadores con educación primaria, en comparación con aquellos con educación terciaria (categoría de referencia), presentan una mayor probabilidad de ser pobres, manteniendo constantes las demás variables. Esto sugiere que un menor nivel educativo se asocia con una mayor vulnerabilidad a la pobreza laboral.

  • Educación: Secundario (\(\beta = 0.3673\)): el signo positivo indica que los trabajadores con educación secundaria, en comparación con los de educación terciaria, también presentan una mayor probabilidad de ser pobres, manteniendo constantes las demás variables. Aunque el efecto es positivo, en este caso no resulta estadísticamente significativo al 5%.

  • Ingreso (\(\beta = -1.570 \times 10^{-6}\)): el signo negativo indica que, a medida que aumenta el ingreso laboral, la probabilidad de que el trabajador sea pobre disminuye, manteniendo constantes las demás variables. Este resultado es coherente con la lógica sustantiva del fenómeno, ya que mayores ingresos reducen la probabilidad de insuficiencia de recursos.

  • Formalidad: Informal (\(\beta = 1.273\)): el signo positivo indica que los trabajadores en condición de informalidad, en comparación con los formales (categoría de referencia), presentan una mayor probabilidad de ser pobres, manteniendo constantes las demás variables. Este resultado sugiere que la inserción laboral informal constituye un factor que incrementa fuertemente la vulnerabilidad frente a la pobreza laboral.

En síntesis, los resultados muestran que la probabilidad de que un trabajador sea pobre disminuye con la edad y el ingreso, mientras que aumenta para quienes tienen menor nivel educativo y para quienes se desempeñan en condición de informalidad laboral. En el caso del sexo, aunque el signo estimado sugiere una menor probabilidad para las mujeres, el efecto no es estadísticamente significativo en este modelo.

9.2 Mediante Odds Ratios (OR)

Los coeficientes del modelo logit están expresados en log-odds. Para facilitar la interpretación, es común exponenciarlos:

\[ OR_j = e^{\hat{\beta}_j} \]

odds_ratios <- exp(coef(modelo_logit))
odds_ratios
##         (Intercept)                edad           sexoMujer   educacionPrimario 
##          15.7212675           0.9681827           0.9768592           1.5656500 
## educacionSecundario             ingreso  formalidadInformal 
##           1.4437766           0.9999984           3.5729285

9.3 Regla de interpretación del odds ratio

  • Si \(OR > 1\): aumentan los odds de ser trabajador pobre.
  • Si \(OR < 1\): disminuyen los odds de ser trabajador pobre.
  • Si \(OR = 1\): no hay cambio en los odds.

A partir de los coeficientes estimados, se obtienen los siguientes odds ratios:

  • Edad: \(OR = 0.968\)
    Manteniendo constantes las demás variables del modelo, por cada año adicional de edad, las odds de que el trabajador sea pobre se multiplican por 0.968. Esto implica una disminución aproximada de 3.2% en las odds de pobreza laboral por cada año adicional de edad.

  • Sexo: Mujer: \(OR = 0.977\)
    Manteniendo constantes las demás variables, las mujeres presentan odds de pobreza laboral equivalentes a 0.977 veces las de los hombres. Esto sugiere una reducción aproximada de 2.3% en las odds de ser pobre respecto a los hombres. No obstante, este efecto no resulta estadísticamente significativo.

  • Educación: Primario: \(OR = 1.566\)
    Manteniendo constantes las demás variables, los trabajadores con educación primaria presentan odds de pobreza laboral 1.566 veces mayores que los trabajadores con educación terciaria, que es la categoría de referencia. Esto equivale a un aumento aproximado de 56.6% en las odds de ser pobre.

  • Educación: Secundario: \(OR = 1.444\)
    Manteniendo constantes las demás variables, los trabajadores con educación secundaria presentan odds de pobreza laboral 1.444 veces mayores que aquellos con educación terciaria. Esto equivale a un incremento aproximado de 44.4% en las odds de ser pobre. Sin embargo, este efecto no es estadísticamente significativo al 5%.

  • Ingreso: \(OR = 0.999998\)
    Manteniendo constantes las demás variables, un aumento de una unidad monetaria en el ingreso reduce levemente las odds de pobreza laboral. Dado que el coeficiente está expresado por unidad monetaria, el efecto marginal de una unidad es muy pequeño.

Dado que el ingreso está medido en unidades monetarias, la interpretación del odds ratio por una sola unidad resulta poco informativa. Por ello, es más útil considerar un incremento de 100.000 guaraníes.

En este caso:

\[ OR = e^{\beta_{\text{ingreso}} \times 100000} \approx 0.855 \]

Esto indica que, manteniendo constantes las demás variables del modelo, un aumento de 100.000 guaraníes en el ingreso laboral se asocia con una reducción aproximada de 14.5% en las odds de que el trabajador sea pobre.

  • Formalidad: Informal: \(OR = 3.572\)
    Manteniendo constantes las demás variables, los trabajadores informales presentan odds de pobreza laboral 3.572 veces mayores que los trabajadores formales. Esto equivale a un incremento aproximado de 257.2% en las odds de ser pobre, lo cual evidencia una fuerte asociación entre informalidad laboral y pobreza.

En síntesis, los resultados en términos de odds ratios refuerzan la interpretación obtenida a partir de los signos de los coeficientes: la pobreza laboral tiende a reducirse con la edad y el ingreso, mientras que aumenta entre los trabajadores con menor nivel educativo y, especialmente, entre aquellos que se desempeñan en condiciones de informalidad.

10 Medidas de bondad de ajuste basadas en la tabla de clasificación

Una forma de evaluar el desempeño de un modelo de clasificación es a través de medidas relacionadas con la tabla de clasificación. Consideremos la siguiente tabla, en la que se muestra la estructura de una tabla de clasificación, dónde en las filas se pone el estado real en la muestra y en las columnas la categoría predicha por el modelo.

Sea la matriz de confusión:

Observado / Predicho No pobre Pobre
No pobre VP FP
Pobre FN VN

donde:

  • VN: verdaderos negativos
  • FP: falsos positivos
  • FN: falsos negativos
  • VP: verdaderos positivos

Para determinar cómo clasifica el modelo a cada observación se elige un punto de corte, si la probabilidad predicha por el modelo es mayor que el punto de corte se clasifica como éxito y si es menor como fracaso. Evidentemente, los valores VP, FN, FP y VN variarán según el punto de corte elegido.

10.1 Cálculo de la tasa de clasificación correcta, sensibilidad y especificidad

Las medidas se calculan como:

\[ \text{TCC} = \frac{VP + VN}{N} \times 100 \]

\[ \text{Sensibilidad} = \frac{VP}{VP + FN} \times 100 \]

\[ \text{Especificidad} = \frac{VN}{VN + FP} \times 100 \]

10.2 Selección del punto de corte

Un modelo logístico produce probabilidades. Para clasificar cada caso como 0 o 1 se requiere un punto de corte. En esta guía se busca el umbral que maximiza la precisión global.

Probabilidades predichas

prob_pred <- predict(modelo_logit, type = "response")
head(prob_pred)
##          1          2          3          4          5          6 
## 0.57114510 0.17255557 0.03008439 0.02306129 0.63992050 0.50989016
# 1. Convertir variable observada a binaria (si no lo hiciste antes)
observado_num <- ifelse(trabajadores$pobre == "Trab_Pobre", 1, 0)

# 2. Calcular las probabilidades predichas
prob_pred <- predict(modelo_logit, type = "response")

# 3. Buscar el mejor punto de corte que maximiza la precisión
umbral <- seq(0.01, 0.99, by = 0.01)
accuracy <- sapply(umbral, function(thresh) {
  pred_clasif <- ifelse(prob_pred >= thresh, 1, 0)
  mean(pred_clasif == observado_num)
})

# 4. Extraer el mejor punto de corte y la tasa de clasificación correcta
mejor_umbral <- umbral[which.max(accuracy)]
mejor_accuracy <- max(accuracy)

# 5. Mostrar resultados
cat("Punto de corte óptimo:", round(mejor_umbral, 3), "\n")
## Punto de corte óptimo: 0.59
cat("Tasa de clasificación correcta:", round(mejor_accuracy, 3), "\n")
## Tasa de clasificación correcta: 0.799

10.3 Matriz de confusión

T_clasf <- function(obs, pred, pc) {
  pred_clase <- ifelse(pred >= pc, "Trab_Pobre", "Trab_no_Pobre")
  obs <- factor(obs, levels = c("Trab_Pobre", "Trab_no_Pobre"))
  pred_clase <- factor(pred_clase, levels = c("Trab_Pobre", "Trab_no_Pobre"))
  table(Observado = obs, Clasificado = pred_clase)
}

Tabla <- T_clasf(trabajadores$pobre, prob_pred,mejor_umbral  )
Tabla
##                Clasificado
## Observado       Trab_Pobre Trab_no_Pobre
##   Trab_Pobre            84           169
##   Trab_no_Pobre         32           715
RTC <- function(TC) {

  if (!is.matrix(TC) && !is.table(TC)) {
    stop("El objeto ingresado debe ser una matriz o tabla de contingencia.")
  }

  if (!all(dim(TC) == c(2, 2))) {
    stop("La tabla de clasificación debe ser de dimensión 2x2.")
  }

  n <- sum(TC)
  tcc <- 100 * sum(diag(TC)) / n
  sen <- ifelse(sum(TC[1, ]) == 0, NA, 100 * TC[2, 2] / sum(TC[1, ]))
  esp <- ifelse(sum(TC[2, ]) == 0, NA, 100 * TC[1, 1] / sum(TC[2, ]))

  data.frame(
    Medida = c("Tasa de clasificación correcta", "Sensibilidad", "Especificidad"),
    Valor = round(c(tcc, sen, esp), 2)
  )
}

medidas_clasificacion <- RTC(Tabla)
kable(medidas_clasificacion)
Medida Valor
Tasa de clasificación correcta 79.90
Sensibilidad 282.61
Especificidad 11.24

10.4 Interpretación de las medidas

  • Tasa de clasificación correcta: porcentaje total de casos correctamente clasificados por el modelo.
  • Sensibilidad: capacidad del modelo para identificar correctamente a los trabajadores pobres.
  • Especificidad: capacidad del modelo para identificar correctamente a los trabajadores no pobres.

De acuerdo con los resultados del modelo:

  • TCC = 79.9%
  • Sensibilidad = 33.20%
  • Especificidad = 95,72%

la lectura sería:

El modelo clasifica correctamente, en términos globales, al 79,9% de los trabajadores. Sin embargo, tiene mejor desempeño para identificar a los pobres (33,2%) que para detectar a los trabajadores no pobres (95,7%).

10.5 Curva ROC y área bajo la curva (AUC)

Otra forma de evaluar un modelo es a través de la curva ROC (Receiver Operating Characteristic). La curva ROC representa en un gráfico la fracción de falsos positivos definida como FP/(FP + VN), frente a la fracción de verdaderos positivos definida como VP/ (VP +FN). Así, se puede evaluar un modelo según si el interés sea maximizar la fracción de verdaderos positivos, minimizar la fracción de falsos positivos u obtener la mejor tasa de clasificación correcta.

La curva ROC resume el desempeño del clasificador a lo largo de todos los puntos de corte posibles. El AUC mide la capacidad discriminante del modelo.

Cálculo del AUC

pred_obj <- ROCR::prediction(prob_pred, observado_num)
AUC_obj <- performance(pred_obj, "auc")
AUC <- attributes(AUC_obj)$y.values[[1]]
AUC
## [1] 0.8294681

Interpretación

Una guía práctica de interpretación es:

  • 0.50: discriminación nula
  • 0.60 a 0.70: discriminación débil
  • 0.70 a 0.80: discriminación aceptable
  • 0.80 a 0.90: discriminación buena
  • mayor a 0.90: discriminación excelente

El modelo arroja un AUC = 0.83, se concluiría que posee una buena capacidad de discriminación entre trabajadores pobres y no pobres.

10.6 Gráfico ROC (opcional)

perf_roc <- performance(pred_obj, "tpr", "fpr")
plot(perf_roc, main = "Curva ROC del modelo logit")
abline(a = 0, b = 1, lty = 2)

11 Efectos marginales

En la regresión logística, los coeficientes estimados \(\beta_j\) no se interpretan directamente como cambios en la probabilidad del evento de interés, porque el modelo es no lineal. Si bien los signos orienta la variación de la probabilidad, pero no indica la cuantía. En efecto, el modelo logit se expresa como:

\[ \Pr(Y=1 \mid \mathbf{X}) = \frac{\exp(\beta_0 + \beta_1 X_1 + \cdots + \beta_k X_k)}{1 + \exp(\beta_0 + \beta_1 X_1 + \cdots + \beta_k X_k)} \]

donde la relación entre las variables explicativas y la probabilidad no es lineal. Por ello, una misma variación en una variable explicativa no genera el mismo cambio en la probabilidad para todos los individuos, ya que el efecto depende del nivel inicial de probabilidad de cada observación.

En este contexto, los efectos marginales permiten traducir los resultados del modelo logístico a una escala más intuitiva: la de las probabilidades. En términos generales, un efecto marginal mide cuánto cambia la probabilidad estimada del evento de interés cuando cambia una variable explicativa, manteniendo constantes las demás variables del modelo.

En esta aplicación, el evento de interés es que el trabajador sea pobre. Por tanto, el efecto marginal indica cuánto cambia la probabilidad estimada de que un trabajador sea pobre cuando cambia una característica como la edad, el ingreso, el nivel educativo, la formalidad o el sexo.

¿Por qué son importantes?

Los efectos marginales son importantes porque:

  • permiten interpretar el modelo en términos de cambios en probabilidad y no solo en términos de logit o odds;
  • facilitan la comunicación de resultados a públicos no especializados;
  • permiten comparar la magnitud del efecto de distintas variables sobre la probabilidad del evento;
  • ayudan a cuantificar el cambio esperado en puntos porcentuales.

Mientras que el coeficiente logístico indica el efecto sobre el logaritmo de las odds, el efecto marginal indica el efecto sobre la probabilidad, que es una medida más fácil de interpretar sustantivamente.

11.1 Cálculo de Efectos marginales

a) Para variables cuantitativas continuas

Si \(X_j\) es una variable continua, el efecto marginal individual se obtiene derivando la probabilidad con respecto a dicha variable:

\[ \frac{\partial \Pr(Y=1 \mid \mathbf{X})}{\partial X_j} = \beta_j \cdot p(\mathbf{X}) \cdot \left(1-p(\mathbf{X})\right) \]

donde:

  • \(\beta_j\) es el coeficiente estimado de la variable \(X_j\),
  • \(p(\mathbf{X})\) es la probabilidad estimada para cada observación.

Esta expresión muestra que el efecto marginal depende de dos componentes:

  1. del valor del coeficiente \(\beta_j\),
  2. del nivel de probabilidad estimada de cada observación.

Por esta razón, en regresión logística el efecto marginal no es constante para todos los individuos.

b) Para variables dicotómicas

Si \(X_j\) es una variable binaria, no se utiliza derivada, sino una diferencia de probabilidades:

\[ ME_{ij} = \Pr(Y=1 \mid X_j=1, \mathbf{X}_{-j}) - \Pr(Y=1 \mid X_j=0, \mathbf{X}_{-j}) \]

Es decir, se compara la probabilidad estimada del evento cuando la variable toma el valor 1 frente a cuando toma el valor 0, manteniendo iguales las demás variables.

c) Para variables categóricas con más de dos categorías

Cuando una variable tiene más de dos categorías, el modelo incorpora variables indicadoras (dummies), dejando una categoría como referencia. En este caso, cada efecto marginal compara la probabilidad del evento entre una categoría específica y la categoría de referencia.

Por ejemplo, si el nivel educativo tiene tres categorías:

  • Primario
  • Secundario
  • Terciario

y se toma Terciario como categoría de referencia, entonces los efectos marginales estimados para educacionPrimario y educacionSecundario indican cuánto cambia la probabilidad de ser trabajador pobre respecto a quienes tienen educación terciaria.

Efecto marginal promedio (AME)

Como el efecto marginal individual puede ser distinto para cada observación, una medida resumen ampliamente utilizada es el efecto marginal promedio (Average Marginal Effect, AME), que se calcula promediando los efectos marginales individuales:

\[ AME_j = \frac{1}{n}\sum_{i=1}^{n} ME_{ij} \]

Por tanto, el AME representa el cambio promedio en la probabilidad del evento asociado a una variación en \(X_j\), considerando a todos los individuos de la muestra.

En esta guía, los resultados reportados corresponden precisamente a efectos marginales promedio.

Ejemplo práctico de cálculo

Supóngase que para un trabajador determinado la probabilidad estimada de ser pobre es \(p=0.30\), y que el coeficiente estimado para la edad es \(\beta_{\text{edad}}=-0.03233\). Entonces, el efecto marginal individual de la edad sería:

\[ \frac{\partial p}{\partial \text{edad}} = -0.03233 \times 0.30 \times (1-0.30) \]

\[ \frac{\partial p}{\partial \text{edad}} = -0.03233 \times 0.21 = -0.00679 \]

Esto significa que, para un trabajador con una probabilidad estimada de pobreza de 0.30, un año adicional de edad reduce la probabilidad de ser pobre en aproximadamente 0.0068, es decir, en 0.68 puntos porcentuales.

Sin embargo, como esta variación cambia de un individuo a otro, lo que se reporta habitualmente es el promedio de todos los efectos individuales, es decir, el AME.

En el caso de una variable dicotómica como la informalidad, el cálculo se interpreta como la diferencia entre dos probabilidades estimadas: la probabilidad de ser pobre si el trabajador fuera informal menos la probabilidad de ser pobre si fuera formal, manteniendo iguales las demás características.

11.1.1 Cálculo de efectos marginales en R

library(margins)

# Calcular efectos marginales promedio
efectos_marginales <- margins(modelo_logit)

# Resumen de resultados
summary(efectos_marginales)
##               factor     AME     SE        z      p   lower   upper
##                 edad -0.0044 0.0009  -5.1456 0.0000 -0.0061 -0.0027
##    educacionPrimario  0.0592 0.0305   1.9428 0.0520 -0.0005  0.1189
##  educacionSecundario  0.0479 0.0301   1.5893 0.1120 -0.0112  0.1069
##   formalidadInformal  0.1725 0.0230   7.4964 0.0000  0.1274  0.2176
##              ingreso -0.0000 0.0000 -16.7528 0.0000 -0.0000 -0.0000
##            sexoMujer -0.0032 0.0235  -0.1356 0.8921 -0.0493  0.0429

** Interpretación**

A partir de los resultados obtenidos, la interpretación de cada efecto marginal promedio es la siguiente:

  • Edad (AME = -0.0044):
    Manteniendo constantes las demás variables del modelo, un año adicional de edad reduce, en promedio, la probabilidad de que el trabajador sea pobre en 0.0044, es decir, en 0.44 puntos porcentuales. El efecto es estadísticamente significativo (\(p < 0.001\)), por lo que existe evidencia de que la edad está asociada con una menor probabilidad de pobreza laboral.

  • Educación primaria (AME = 0.0592):
    En comparación con los trabajadores con educación terciaria (categoría de referencia), quienes tienen educación primaria presentan, en promedio, una probabilidad de ser pobres 5.92 puntos porcentuales mayor, manteniendo constantes las demás variables. El valor-p (\(p = 0.052\)) indica que este efecto se encuentra en el límite de la significancia estadística al 5%, aunque sí sería significativo al 10%.

  • Educación secundaria (AME = 0.0479):
    En comparación con los trabajadores con educación terciaria, aquellos con educación secundaria presentan una probabilidad de ser pobres 4.79 puntos porcentuales mayor, manteniendo constantes las demás variables. No obstante, este efecto no resulta estadísticamente significativo al 5% (\(p = 0.112\)), por lo que no existe evidencia suficiente para afirmar que la diferencia sea distinta de cero en este modelo.

  • Formalidad informal (AME = 0.1725):
    En comparación con los trabajadores formales, los trabajadores informales presentan, en promedio, una probabilidad de ser pobres 17.25 puntos porcentuales mayor, manteniendo constantes las demás variables del modelo. Este efecto es estadísticamente significativo (\(p < 0.001\)) y constituye uno de los resultados más relevantes del análisis, ya que muestra una fuerte asociación entre informalidad laboral y pobreza.

  • Ingreso (AME = -0.0000):
    El signo negativo indica que, a medida que aumenta el ingreso, la probabilidad de que el trabajador sea pobre disminuye. Sin embargo, como la variable está medida en unidades monetarias, el cambio asociado a una sola unidad es extremadamente pequeño y por eso aparece redondeado como -0.0000. Aun así, el efecto resulta estadísticamente significativo (\(p < 0.001\)). Para una interpretación más útil, conviene expresar el ingreso en centenas de miles o millones de guaraníes.

  • Sexo: Mujer (AME = -0.0032):
    En comparación con los hombres, las mujeres presentan una probabilidad de ser pobres 0.32 puntos porcentuales menor, manteniendo constantes las demás variables. Sin embargo, este efecto no es estadísticamente significativo (\(p = 0.892\)), por lo que no existe evidencia de diferencias en la probabilidad de pobreza laboral por sexo, una vez controladas las demás variables incluidas en el modelo.

En términos generales, los efectos marginales muestran que la probabilidad de ser trabajador pobre:

  • disminuye con la edad y con el ingreso;
  • aumenta entre quienes tienen menor nivel educativo;
  • aumenta de manera importante entre quienes trabajan en condición de informalidad;
  • no presenta diferencias estadísticamente significativas por sexo, una vez controladas las demás variables del modelo.

Entre todas las variables analizadas, la informalidad laboral presenta el mayor efecto marginal promedio, lo que sugiere que constituye uno de los factores más relevantes asociados al fenómeno del trabajador pobre en este ejercicio.

11.2 Exportación de efectos marginales a Excel

efectos_df <- summary(ef_marginales)
write.xlsx(efectos_df, file = "efectos_marginales.xlsx", rowNames = FALSE)

12 Predicciones del Modelo

12.1 Fundamento teórico de la predicción

Uno de los usos más importantes de la regresión logística es la predicción de probabilidades para perfiles específicos de individuos o unidades de análisis. Una vez estimados los parámetros del modelo, es posible utilizar la información contenida en las variables explicativas para obtener la probabilidad estimada de ocurrencia del evento de interés.

En este caso, el evento de interés es que el trabajador sea pobre. Por tanto, la predicción consiste en estimar, para un perfil determinado de trabajador, la probabilidad de encontrarse en situación de pobreza laboral.

Recordando la expresión del modelo logístico:

\[ \Pr(Y=1 \mid \mathbf{X}) = \frac{\exp\left(\beta_0 + \beta_1X_1 + \beta_2X_2 + \cdots + \beta_kX_k\right)} {1 + \exp\left(\beta_0 + \beta_1X_1 + \beta_2X_2 + \cdots + \beta_kX_k\right)} \]

la predicción se obtiene sustituyendo en esta ecuación los valores específicos de las variables explicativas para el perfil de interés. De este modo, el modelo transforma una combinación lineal de covariables en una probabilidad comprendida entre 0 y 1.

¿Qué se predice en una regresión logística?

En una regresión logística pueden obtenerse principalmente dos tipos de predicción:

  • el predictor lineal, es decir, el valor estimado del logit: \[ \hat{L}(\mathbf{X}) = \hat{\beta}_0 + \hat{\beta}_1X_1 + \cdots + \hat{\beta}_kX_k \]

  • la probabilidad predicha del evento de interés: \[ \hat{p}(\mathbf{X}) = \Pr(Y=1 \mid \mathbf{X}) \]

Desde el punto de vista sustantivo, la predicción más útil suele ser la segunda, ya que permite responder preguntas del tipo:
¿cuál es la probabilidad estimada de que un trabajador con determinadas características sea pobre?

12.2 Predicción en R mediante la función predict()

En R, la función utilizada para obtener predicciones a partir de un modelo estimado es predict(). En el caso de la regresión logística, esta función permite calcular tanto el predictor lineal como las probabilidades predichas.

Su estructura general es:

predict(object, newdata = NULL, type = c("link", "response"))

El argumento newdata

Uno de los argumentos más importantes de la función predict() es newdata, ya que permite realizar estimaciones para un perfil dado.

El argumento newdata debe ser un nuevo data.frame que contenga los valores de las variables explicativas correspondientes a las observaciones que se desean predecir. Dicho de otro modo, allí se especifican las características del nuevo trabajador o conjunto de trabajadores para los cuales se quiere estimar la probabilidad del evento.

Es fundamental que:

  • las variables incluidas en newdata tengan exactamente los mismos nombres que las utilizadas en el modelo;
  • las variables categóricas conserven sus niveles correctamente definidos;
  • los valores ingresados sean coherentes con la estructura del modelo estimado.

Por ejemplo, si el modelo fue ajustado con las variables edad, ingreso, educacion, formalidad y sexo, entonces el nuevo data.frame debe contener precisamente esas mismas variables.

El argumento type

En la regresión logística, los valores más importantes del argumento type son:

  • type = "link": devuelve la predicción en escala lineal, es decir, el valor del logit estimado;
  • type = "response": devuelve la predicción en escala de probabilidad, es decir, un valor entre 0 y 1.

Definición de un nuevo trabajador (newdata)

nuevo_trabajador <- data.frame(
  edad = 41,
  ingreso = 2510740,
  educacion = factor("Primario", levels = levels(trabajadores$educacion)),
  formalidad = factor("Informal", levels = levels(trabajadores$formalidad)),
  sexo = factor("Hombre", levels = levels(trabajadores$sexo))
)

nuevo_trabajador
##   edad ingreso educacion formalidad   sexo
## 1   41 2510740  Primario   Informal Hombre

Probabilidad predicha

prob_nuevo <- predict(modelo_logit, newdata = nuevo_trabajador, type = "response")
prob_nuevo
##         1 
## 0.3120058

Interpretación

Si, por ejemplo, la probabilidad estimada fuera 0.42, la interpretación sería:

De acuerdo con el modelo, este perfil de trabajador tendría una probabilidad estimada de 42% de pertenecer al grupo de trabajadores pobres.

13 Mensaje metodológico final

A modo de cierre, en una aplicación de regresión logística conviene seguir la siguiente secuencia:

  1. Definir con claridad la variable dependiente binaria.
  2. Especificar correctamente las variables explicativas y sus categorías de referencia.
  3. Estimar el modelo con glm(..., family = binomial).
  4. Evaluar significancia individual con Wald y significancia global con razón de verosimilitud.
  5. Verificar calibración con Hosmer-Lemeshow.
  6. Interpretar signos, odds ratios y efectos marginales.
  7. Evaluar capacidad predictiva mediante matriz de confusión y AUC.
  8. Utilizar el modelo para predecir probabilidades de nuevos casos.

Nota metodológica: La presente guía fue elaborada con apoyo de herramientas de inteligencia artificial generativa, específicamente ChatGPT de OpenAI, como asistencia en la estructuración y redacción del material. La selección de contenidos, la validación conceptual y la revisión final son responsabilidad del docente.

14 Bibliografía

  • Agresti, A. (2018). An Introduction to Categorical Data Analysis. Wiley.

  • Hosmer, D. W., Lemeshow, S. y Sturdivant, R. X. (2013). Applied Logistic Regression. Wiley.

  • Wickham, H., François, R., Henry, L., Müller, K., y Vaughan, D. dplyr: A Grammar of Data Manipulation. R package.

  • Lele, S. R., Keim, J. L., y Solymos, P. ResourceSelection: Resource Selection (Probability) Functions for Use-Availability Data. R package.

  • Sing, T., Sander, O., Beerenwinkel, N., y Lengauer, T. ROCR: Visualizing the Performance of Scoring Classifiers. R package.

  • Leeper, T. J. margins: Marginal Effects for Model Objects. R package.

  • Schauberger, P., y Walker, A. openxlsx: Read, Write and Edit xlsx Files. R package.

  • Xie, Y. knitr: A General-Purpose Package for Dynamic Report Generation in R. R package.