Alcance

Este documento muestra un ejemplo práctico de regresión logística con R. No se dan detalles teóricos del modelo. Se agradecen sugerencias, erratas y comentarios a emilio.lcano (at) uclm.es.

Lo prometido es deuda: gracias a mis compañeros de la UCLM Víctor Casero y Sergio Pozuelo, y al lector Francisco que advirtieron errata en la fórmula para calcular probabilidades y me enviaron un mensaje.

Datos

El conjunto de datos a utilizar proviene de la plataforma de concursos de análisis de datos kaggle. Se trata de la base de datos Human Resources Analytics del usuario Ludovic Benistant. Para este ejemplo ilustrativo se han seleccionado aleatoriamente 100 registros después de limpiar y tratar la base de datos. Cada registro se corresponde con un empleado para las siguientes variables (los nombres son bastante autoexplicativos):

## 'data.frame':    100 obs. of  10 variables:
##  $ nivel_satisfaccion      : num  0.22 0.89 0.63 0.8 0.42 0.77 0.51 0.15 0.98 0.19 ...
##  $ ultima_evaluacion       : num  0.98 0.65 0.76 0.96 0.48 0.82 0.5 0.75 0.99 1 ...
##  $ numero_proyectos        : int  4 5 4 3 2 4 5 3 3 4 ...
##  $ promedio_horas_mensuales: int  185 195 245 161 155 217 176 259 235 192 ...
##  $ antiguedad              : int  3 6 3 3 3 5 5 8 3 4 ...
##  $ accidente               : Factor w/ 2 levels "No","Sí": 1 1 1 1 1 1 1 2 1 1 ...
##  $ abandona                : Factor w/ 2 levels "No","Sí": 1 2 1 1 2 2 1 1 1 2 ...
##  $ promocionado            : Factor w/ 2 levels "No","Sí": 1 1 1 1 1 1 1 1 1 1 ...
##  $ departamento            : Factor w/ 5 levels "IT","other","sales",..: 4 4 2 5 2 2 4 2 3 2 ...
##  $ salario                 : Factor w/ 3 levels "high","low","medium": 2 2 2 2 3 3 3 1 2 2 ...

Modelo

El modelo logit es un modelo de regresión típico, \(Y=f(\mathbf{X}+\varepsilon)\), en el que la variable respuesta (variable aleatoria \(Y\)) es dicotómica o binaria (toma dos valores: 0 y 1), habitualmente sobre si el individuo tiene una característica (1) o no (0), y las variables predictivas (vector aleatorio \(\mathbf{X}\)) son continuas. El modelo logit es un caso particular de los llamados modelos lineales generalizados (GLMs, Generalized Linear Model). Para los detalles del modelo véase Faraway (2016)

Ejemplo

En este conjunto de datos tenemos tres variables sobre las que podemos estimar un modelo logit: accidente, abandonay promocionado. Un estudio de interés puede ser intentar explicar/predecir si un empleado abandonará o no la empresa en función de las puntuaciones en las variables nivel_satisfaccion y ultima_evaluacion. Para facilitar la explicación vamos a seleccionar solo las variables del modelo:

datos.modelo <- subset(datos, select = c(abandona, nivel_satisfaccion, ultima_evaluacion))
head(datos.modelo)
##   abandona nivel_satisfaccion ultima_evaluacion
## 1       No               0.22              0.98
## 2       Sí               0.89              0.65
## 3       No               0.63              0.76
## 4       No               0.80              0.96
## 5       Sí               0.42              0.48
## 6       Sí               0.77              0.82

Nótese que si la variable dicotómica no fuera de tipo factor, tendríamos que convertirla, por ejemplo:

datos.modelo$abandona <- factor(datos.modelo$abandona)

Además, debemos asegurarnos de que la variable respuesta factor solo toma dos valores1. Descriptivamente, podemos hacer un resumen de cada categoría:

table(datos.modelo$abandona)
## 
## No Sí 
## 72 28
summary(datos.modelo$nivel_satisfaccion)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.0900  0.3800  0.5700  0.5543  0.7725  0.9900
summary(datos.modelo$ultima_evaluacion)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.3800  0.5700  0.7000  0.7105  0.8550  1.0000

O gráficamente:

library(ggplot2)
ggplot(datos.modelo, aes(x = nivel_satisfaccion, y = ultima_evaluacion, color = abandona)) + geom_point()

En R, los GLMs se ajustan con la función glm. La principal diferencia con la función lm para ajustar modelos lineales es que le tenemos que proporcionar la familia de la distribución. En nuestro caso, como es una variable dicotómica, la familia es la binomial:

modelo.logit <- glm(abandona ~ ultima_evaluacion + nivel_satisfaccion, 
                    data = datos.modelo, family = "binomial")
summary(modelo.logit)
## 
## Call:
## glm(formula = abandona ~ ultima_evaluacion + nivel_satisfaccion, 
##     family = "binomial", data = datos.modelo)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -1.1732  -0.8015  -0.6574   1.1561   1.9557  
## 
## Coefficients:
##                    Estimate Std. Error z value Pr(>|z|)  
## (Intercept)         -0.0291     1.0456  -0.028   0.9778  
## ultima_evaluacion    0.3097     1.2863   0.241   0.8097  
## nivel_satisfaccion  -2.1626     0.9167  -2.359   0.0183 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 118.59  on 99  degrees of freedom
## Residual deviance: 112.64  on 97  degrees of freedom
## AIC: 118.64
## 
## Number of Fisher Scoring iterations: 4

La interpretación de los p-valores es similar a la del modelo lineal. Podemos ver que la variable ultima_evaluacion no es significativa en el modelo (p-valor mucho mayor de 0.05), mientras que la variable nivel_satisfaccion es moderadamente significativa (p-valor entre 0.01 y 0.05)2.

En cuanto a los coeficientes, la interpretación cambia. El modelo GLM no ajusta la variable respuesta sino una función de enlace. En el caso del modelo logit esta función es:

\[\eta=\log \left(\frac{p}{1-p} \right),\]

siendo \(p\) la probabilidad de que el individuo tome el valor “1” en la variable dicotómica. Al cociente \(\frac{p}{1-p}\) se le conoce como odds ratio. Por tanto, los coeficientes del modelo logit se interpretan como el logaritmo del odds ratio. Si nos fijamos en el coeficiente de la variable nivel_satisfaccion (-2.163), nos está indicando que el logaritmo del odds ratio de abandonar la empresa disminuye 2.163 unidades por cada unidad que aumenta la puntuación en el nivel de satisfacción.

Una forma de faciliar la interpretación de los coeficientes es exponenciando:

exp(coefficients(modelo.logit))
##        (Intercept)  ultima_evaluacion nivel_satisfaccion 
##          0.9713175          1.3630515          0.1150215

Que se corresponde con este modelo:

\[\mathit{odds}=e^{\beta_0} \cdot e^{\beta_1 x_1} \cdot e^{\beta_2 x_2}\]

Lo que nos viene a decir que aumentar en la última evaluación un punto aumenta un 36%3 las posibilidades de abandonar la empresa, mientras que aumentar un punto en el nivel de satisfacción las reduce casi un 90%4.

Por último, una interpretación probabilística sería estimar la probabilidad \(p\) de que un individuo abandone la empresa:

\[p=\frac{e^\eta}{1+e^\eta}\]

Así, podemos predecir la función \(\eta\) para un individuo que tenga, por ejemplo, una evaluación de 0.75 y un nivel de satisfacción de 0.6:

log.odds <- predict(modelo.logit, data.frame(nivel_satisfaccion = 0.6,
                                 ultima_evaluacion = 0.75))
log.odds
##         1 
## -1.094389

La probabilidad de abandonar la empresa sería:

exp(log.odds)/(1+exp(log.odds))
##         1 
## 0.2507927

Enlaces

Algunos ejemplos más:

Referencias

Faraway, Julian J. 2016. Extending the Linear Model with R. CRC Press.


  1. No hace falta que sean 0 y 1, R tomará como 0 el primer nivel del factor, y 1 el segundo nivel del factor

  2. para no hacer más largo este ejemplo no reduciremos el modelo, pero habría que quitar las variables no significativas antes de seguir

  3. Recordemos que no es significativo, pero se comenta a efectos ilustrativos.

  4. En cada modelo hay que interpretar según la escala de las variables, en este caso parecen porcentajes por lo que habría interpretar en términos de puntos porcentuales, por ejemplo.