Menu

Regresión logística en R: glm() con family = binomial

Modela resultados sí/no con glm(family = binomial): interpreta el summary, convierte los coeficientes en log-odds a odds ratios con exp() y obtén probabilidades predichas de la forma correcta.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

Cuando el resultado es sí/no

La regresión lineal predice un número. Pero muchas de las preguntas que vale la pena modelar son binarias: ¿el cliente se da de baja?, ¿el paciente se recupera?, ¿el correo recibe un clic? Ajustar una recta a un resultado 0/1 falla de inmediato: la recta predice alegremente probabilidades de −0.3 o 1.4, que no tienen sentido.

La regresión logística lo resuelve modelando la probabilidad del resultado mediante la transformación log-odds (logit): log(p / (1 − p)) = intercept + slope × x. La escala de log-odds recorre toda la recta numérica, así que una ecuación lineal encaja allí de forma natural - y al volver a la escala original, cada predicción queda comprimida en (0, 1) siguiendo la conocida curva en forma de S. El precio del truco: los coeficientes viven en la escala de log-odds, y todo el arte de leer una regresión logística consiste en traducirlos a algo que los humanos entiendan.

Ajuste: glm() con family = binomial

glm() (modelo lineal generalizado) es el hermano mayor de lm(); family = binomial selecciona la regresión logística. En mtcars, am registra el tipo de transmisión (1 = manual, 0 = automática): ¿los coches de bajo consumo tienden a ser manuales?

Dos cosas antes de leer la salida. Primero, family = binomial no es opcional: si lo omites, glm() ajusta en silencio mínimos cuadrados ordinarios. Segundo, la respuesta debe ser binaria: 0/1, lógica, o un factor de dos niveles (R modela la probabilidad del segundo nivel).

Ahora el summary, bloque por bloque:

  • Coefficients - el Estimate de mpg es aproximadamente 0.31, y es una pendiente en log-odds: cada mpg adicional suma 0.31 a las log-odds de ser manual. Positivo significa "aumenta la probabilidad", negativo significa "la reduce" - más allá del signo, la intuición de nadie funciona en esta escala, y por eso existe la siguiente sección.
  • z value y Pr(>|z|) - la misma lógica que los t-tests de la regresión (Estimate ÷ Std. Error, y luego un p-valor para "¿podría ser cero?"), solo que usando una aproximación normal - de ahí la z en lugar de la t. Aquí p ≈ 0.011: es poco probable que la asociación entre mpg y el tipo de transmisión sea ruido.
  • Null deviance vs Residual deviance - la deviance es la medida de mal ajuste del mundo glm (menor = mejor). La null deviance (43.2 con 31 df) corresponde al modelo con solo intercepto; la residual deviance (29.7 con 30 df) es la del tuyo. La caída de unos 13.6 por los df de un solo predictor es el análogo en glm de "subió el R-cuadrado".
  • AIC - una puntuación de comparación de modelos que equilibra ajuste y complejidad; gana el menor. Por sí solo no dice nada; es útil entre modelos candidatos sobre los mismos datos.

De log-odds a odds ratios: exp(coef())

Exponenciar traslada los coeficientes de la escala aditiva de log-odds a la escala multiplicativa de odds:

exp(0.307) ≈ 1.36, y esta es la frase honesta que conviene memorizar: "cada mpg adicional multiplica las odds de tener transmisión manual por aproximadamente 1.36." Un odds ratio por encima de 1 aumenta las odds, por debajo de 1 las reduce, y exactamente 1 es ausencia de efecto - por eso el veredicto del intervalo de confianza para odds ratios es "¿el intervalo excluye el 1?" (no el cero; el cero era la frontera en la escala de log-odds).

Cuidado con el lenguaje: las odds no son probabilidades. Odds = p / (1 − p), así que una probabilidad de 0.75 son unas odds de 3. Multiplicar las odds por 1.36 no es lo mismo que multiplicar la probabilidad por 1.36 - y cuando el resultado es frecuente, la diferencia es grande. Un odds ratio de 2 para un resultado raro se comporta como "aproximadamente el doble de riesgo"; para un resultado que ocurre el 50% de las veces, rotundamente no. Nunca comuniques un odds ratio con redacción de risk ratio ("1.36 veces más probable") a menos que el resultado sea raro.

Probabilidades predichas: la trampa de type = "response"

El bug de regresión logística más común que existe:

La primera llamada devuelve el valor por defecto type = "link": predicciones en la escala de log-odds, valores negativos incluidos. La segunda devuelve probabilidades de verdad. Si tus "probabilidades" alguna vez salen negativas o mayores que 1, esta es la razón. Ejecuta el bloque: un coche de 15 mpg no tiene prácticamente ninguna probabilidad de ser manual, uno de 30 mpg es muy probablemente manual, y la curva en S se dobla por el medio.

Clasificación: umbral y tabla de confusión

Las probabilidades se convierten en clases predichas eligiendo un punto de corte - 0.5 es la opción por defecto - y el marcador honesto es una tabla de predicho vs real:

Las celdas de la diagonal son aciertos; las dos celdas fuera de la diagonal son los dos errores distintos (predecir manual para un automático, y al revés). La exactitud global por sí sola puede favorecer mucho a un mal modelo: si el 95% de los clientes no se da de baja, "predecir que nadie se da de baja" puntúa 95% sin detectar ni una sola baja - así que mira siempre ambos tipos de error. Y 0.5 es una convención, no una ley: cuando los dos errores tienen costes distintos, mueve el umbral en consecuencia.

Una advertencia de honestidad: esta tabla evalúa el modelo sobre los mismos datos con los que se ajustó, lo cual lo favorece. La evaluación real reserva datos que el modelo nunca vio.

Varios predictores

Exactamente como en lm(): añade términos con +, y cada interpretación gana la coletilla "manteniendo constantes los demás":

Cada coeficiente exponenciado es ahora el multiplicador de las odds para un incremento de una unidad en ese predictor entre coches iguales en los demás predictores. La maquinaria escala, pero también lo hacen las advertencias de la regresión lineal: los predictores correlacionados se reorganizan mutuamente los coeficientes.

Precauciones

  • Separación completa. Si un predictor divide el resultado a la perfección (todo coche por encima de cierto mpg es manual, todo el que está por debajo es automático), el coeficiente de máxima verosimilitud quiere ser infinito. R avisa - glm.fit: fitted probabilities numerically 0 or 1 occurred - y reporta coeficientes enormes con errores estándar absurdos. No publiques esos números; simplifica el modelo, consigue más datos, o usa un método penalizado (los paquetes brglm2 o logistf).
  • Suficientes eventos. La restricción que manda es el recuento del resultado más raro, no el total de filas. Una vieja regla general pide del orden de 10-15 eventos por predictor; los ejemplos con 32 coches sirven para enseñar la mecánica, no como plantilla de tamaños muestrales publicables.
  • Los odds ratios no son risk ratios cuando el resultado es frecuente - ya se cubrió arriba, y se repite porque los revisores lo detectarán aunque tú no.

Lo que te llevas

  • Resultado binario → glm(y ~ x, data = df, family = binomial); nunca olvides el family.
  • Los coeficientes crudos son log-odds; exp(coef(fit)) da odds ratios, y el valor nulo de sus intervalos es 1.
  • La frase patrón: "cada incremento de una unidad en x multiplica las odds del resultado por exp(b)."
  • predict(..., type = "response") para probabilidades - el valor por defecto devuelve log-odds, la confusión número uno.
  • Clasifica con un umbral y evalúa con una tabla de confusión; la exactitud por sí sola puede mentir.
  • Vigila los avisos de separación, cuenta tus eventos y no disfraces odds ratios de risk ratios.

A continuación: la maquinaria detrás de cada intervalo que has visto hasta ahora - intervalos de confianza con t.test(), confint() y prop.test().

Preguntas frecuentes

¿Cómo se hace una regresión logística en R?

Con glm() y family = binomial: fit <- glm(am ~ mpg, data = mtcars, family = binomial), y luego summary(fit). La variable de respuesta debe ser binaria: 0/1, TRUE/FALSE o un factor de dos niveles. Si olvidas family = binomial, R ajusta en silencio una regresión lineal ordinaria.

¿Cómo se interpretan los coeficientes de glm en R?

Los coeficientes crudos están en escala de log-odds, en la que nadie piensa. Exponénciados - exp(coef(fit)) - se convierten en odds ratios: un valor de 1.36 para un predictor significa que cada incremento de una unidad multiplica las odds del resultado por aproximadamente 1.36. Valores por encima de 1 aumentan las odds, por debajo de 1 las reducen, y exactamente 1 significa que no hay efecto.

¿Cómo se obtienen probabilidades predichas de glm en R?

Usa predict(fit, newdata, type = "response"). Este es el error número uno: el valor por defecto type = "link" devuelve log-odds, no probabilidades - así que si tus "probabilidades" salen negativas o mayores que 1, olvidaste type = "response".

¿Cuál es la diferencia entre odds y probabilidad?

La probabilidad es éxitos sobre el total de intentos; las odds son éxitos sobre fracasos. Una probabilidad de 0.75 equivale a unas odds de 3 (tres éxitos por cada fracaso). Los odds ratios de la regresión logística multiplican odds, no probabilidades - y cuando el resultado es frecuente, un odds ratio puede ser mucho mayor que el risk ratio correspondiente, así que no presentes uno como si fuera el otro.

Coddy programming languages illustration

Aprende a programar con Coddy

COMENZAR