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.
Al finalizar esta guía, serás capaz de:
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:
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.
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 \]
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:
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.
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:
Por el contrario:
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.
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:
En este caso:
Por tanto, el modelo tendrá:
En esta sección utilizaremos los datos simulados para el ajuste del modelo paso a paso.
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 incluirinstall.packages()dentro de los chunks del R Markdown que serán compilados regularmente.
# 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")
)
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")
)
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
##
##
##
##
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.
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
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.
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.
La salida de summary(modelo_logit) presenta:
Estimate: coeficiente estimado \(\hat{\beta}_j\)Std. Error: error estándarz value: estadístico de WaldPr(>|z|): valor-p asociadoR 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.
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
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
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:
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.
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
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.
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.
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:
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.
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 \]
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
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 |
De acuerdo con los resultados del modelo:
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%).
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:
El modelo arroja un AUC = 0.83, se concluiría que posee una buena capacidad de discriminación entre trabajadores pobres y no pobres.
perf_roc <- performance(pred_obj, "tpr", "fpr")
plot(perf_roc, main = "Curva ROC del modelo logit")
abline(a = 0, b = 1, lty = 2)
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:
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.
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:
Esta expresión muestra que el efecto marginal depende de dos componentes:
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:
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.
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:
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.
efectos_df <- summary(ef_marginales)
write.xlsx(efectos_df, file = "efectos_marginales.xlsx", rowNames = FALSE)
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?
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:
newdata tengan exactamente
los mismos nombres que las utilizadas en el modelo;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.
A modo de cierre, en una aplicación de regresión logística conviene seguir la siguiente secuencia:
glm(..., family = binomial).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.
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.