Material elaborado por:
Nelcy Rodriguez Malagón
Bioestadística, M.P.H
Profesora Titular
Departamento de Epidemiología Clínica y Bioestadística
Facultad de Medicina - Pontificia Universidad Javeriana
Kevin Maldonado-Cañón
Médico Epidemiólogo, MD. MSc.
Estudiante - Doctorado en Epidemiología Clínica
Departamento de Epidemiología Clínica y Bioestadística
Facultad de Medicina - Pontificia Universidad Javeriana
Con bastante frecuencia en investigación clínica, una pregunta de interés por responder es cómo una serie de factores puede estar asociada con la ocurrencia de un evento o resultado. Por ejemplo: ¿Qué condiciones pueden estar asociadas a la ocurrencia de un infarto agudo de miocardio? o ¿Cuáles pueden estar asociadas con la presentación de una pancreatitis aguda? También puede ocurrir que la pregunta de interés sea cuáles de esos factores pueden predecir la ocurrencia de alguna de estas patologías.
Para encontrar una respuesta a cualquiera de estos dos problemas, el modelamiento estadístico, específicamente el modelo de regresión logística, constituye una muy buena herramienta de análisis al considerar como variable de desenlace un evento de interés cualitativo cuya observación en cada individuo produce un dato dicótomo.
El escenario estadístico es claro que:
La regresión logística se basa en la función logística, definida como:
\(f(z) = \frac{1}{1 + e^{-z}}\)
donde:
La función logística siempre produce valores entre 0 y 1, es decir, valores compatibles con una probabilidad.
En epidemiología, una probabilidad representa:
\(P(D=1)\)
es decir, el riesgo de desarrollar el evento de interés (\(D\)).
La gráfica de la función logística tiene forma de S alargada, como se puede ver a continuación:
Cuando aumentamos z:
Si interpretamos z como una combinación de una o más variables independientes entonces:
Este comportamiento es muy compatible con muchos fenómenos biológicos. Por eso la forma en S resulta conceptualmente útil.
En un modelo de regresión, necesitamos expresar \(z\) como función de una o más variables explicativas:
\(z = \alpha + \beta_1 X_1 + \beta_2 X_2 + \dots + \beta_k X_k\)
Aquí:
En esencia, entonces, \(z\) es un
índice que combina las \(Xs\).
De esta manera, podemos sustituir este \(z\) en la función logística:
Este, finalmente, es el modelo logístico.
Los parámetros representan:
Si partimos del modelo logístico:
\(P(X) = \frac{1}{1 + e^{-(\alpha + \sum \beta_i X_i)}}\)
Podemos demostrar algebraicamente que:
\(\frac{P(X)}{1-P(X)} = e^{\alpha + \sum \beta_i X_i}\)
Y si ahora tomamos logaritmo natural:
\(\ln \left( \frac{P(X)}{1-P(X)} \right) = \alpha + \sum \beta_i X_i\)
Tenemos que:
\(\text{logit}[P(X)] = \alpha + \sum \beta_i X_i\)
La regresión logística no modela la probabilidad directamente. Modela el logaritmo del odds.
Por eso muchas veces vemos el modelo escrito como:
\(\text{logit}(P) = \alpha + \beta_1 X_1 + \beta_2 X_2 + ...\)
que es la forma lineal de expresar el modelo.
Al hacer uso del modelo de regresión logística, se deben cumplir los siguientes supuestos:
Una de las ventajas al usar el modelo de regresión logística, es que, a diferencia de un modelo de regresión lineal simple o múltiple, no se requiere cumplir con el supuesto de normalidad de las variables independientes ni del desenlace. De otro lado, una diferencia sustancial es que en un modelo de regresión lineal sea simple o múltiple, la variable o el evento de interés debe ser numérica sea de tipo discreto o continuo en tanto que, en un modelo de regresión logística, la variable de desenlace o interés es cualitativa y puede ser dicótoma o no. Tanto en el caso en que se estudie la asociación, como en el que se explore la predicción de un evento especialmente dicótomo, el modelo de regresión logística debe cumplir con los siguientes supuestos:
Ajustar un modelo de regresión logística significa usar los datos observados para estimar los parámetros desconocidos \(\alpha\) y \(\beta_i\).
Una vez estimados \(\alpha\) y los \(\beta_i\), podemos:
Para efecto de estimación de los parámetros desconocidos \(\alpha\) y \(\beta_i\), se hace uso del método de máxima verosimilitud.
Lo explicaremos con un ejemplo corto:
Supongamos que tenemos una muestra.
Para cada individuo \(i\):
El modelo nos da una probabilidad estimada:
\(P_i = P(D_i=1 \mid X_i)\)
Ahora pensemos:
Si el individuo desarrolló la enfermedad (D=1), la probabilidad de observar ese resultado es \(P_i\).
Si no la desarrolló (D=0), la probabilidad de observar ese resultado es 1 - \(P_i\).
Podemos escribir esto como:
\(P_i^{D_i}(1 - P_i)^{1-D_i}\)
Asumiendo independencia entre individuos (supuesto clave), la probabilidad conjunta de observar todo el conjunto de datos es:
\(L(\alpha,\beta) = \prod_{i=1}^{n}P_i^{D_i}(1-P_i)^{1-D_i}\)
Esta es la función de verosimilitud.
Pero cuidado. Esta función no expresa la probabilidad de los parámetros, sino la probabilidad de los datos dado un conjunto de parámetros.
El método de máxima verosimilitud busca los valores de:
\(\alpha, \beta_1, \dots, \beta_k\)
que maximizan esa función de verosimilitud.
En otras palabras, encuentra los parámetros que hacen que los datos observados sean lo más “probables” bajo el modelo.
Estos procesos no se hacen manualmente. En cambio, los softwares o paquetes estadísticos usan algoritmos iterativos para tomar el logaritmo de la verosimilitud (log-likelihood), derivar ecuaciones y resolverlas.
En regresión lineal:
Pero en la regresión logística:
Bajo condiciones regulares los estimadores:
Si todos los \(X_i = 0\):
\(\text{logit}(P) = \alpha\)
Entonces:
\(\alpha = \text{log odds cuando todos los X = 0}\)
Dado que no existe un individuo con todos los X = cero (ej: edad = 0).
Es mejor interpretar α como:
Es decir, el odds que resultaría en un modelo sin predictores.
Tomemos el modelo:
\(\text{logit}(P) = \alpha + \beta_i X\)
Entonces:
\(\beta_i\) = Cambio en el log odds
cuando X (variable independiente) toma un valor dado,
manteniendo el resto de variables constantes.
Sabemos que:
\(\text{log odds} = \alpha + \sum \beta_i X_i\)
Si \(β\) representa un cambio en log odds, entonces al exponenciar:
\(e^{\beta_L}\)
obtenemos el cambio multiplicativo en el odds.
En otras palabras:
En un modelo de regresión logística, las pruebas de hipótesis sobre los coeficientes pueden formularse tanto en términos del parámetro β (en escala logit) como en términos del Odds Ratio (OR), que es su transformación exponencial. Conceptualmente, estamos evaluando si existe evidencia estadística de un efecto entre una variable independiente \(X_i\) y el evento de interés.
Para cada coeficiente \(\beta_i\), se plantean:
Dado que:
\(OR_i = e^{\beta_i}\)
Las hipótesis equivalentes se formulan así:
Estas hipótesis se pondrían a prueba utilizando las estadísticas de Wald o el test de razón de verosimilitud.
Evalúa si el estimador \(\hat\beta_i\) está “suficientemente lejos” de 0 en relación con su error estándar.
\(Z = \frac{\hat{\beta}_i}{SE(\hat{\beta}_i)}\)
Bajo \(H_0\), este estadístico sigue aproximadamente una distribución normal estándar.
Suele elevarse al cuadrado:
\(W = \left(\frac{\hat{\beta}_i}{SE(\hat{\beta}_i)}\right)^2\)
que sigue una distribución chi-cuadrado con 1 grado de libertad.
Compara dos modelos:
Evalúa si agregar la variable mejora significativamente el ajuste.
\(LR = -2 \left[ \log L(\text{modelo reducido}) - \log L(\text{modelo completo}) \right]\)
Equivalente a la diferencia de deviances.
Bajo \(H_0\), sigue aproximadamente una chi-cuadrado con grados de libertad igual al número de parámetros añadidos.
En la primera parte de este módulo, ajustaremos un modelo de asociación entre uno o más factores de exposición (variables independientes) y un desenlace.
Para este ejemplo práctico, usaremos la base de datos
icu descrita en el libro “Applied Logistic
Regression” (Hosmer Jr, D. W., Lemeshow, S., &
Sturdivant, R. X. (2013). Applied logistic regression. John Wiley &
Sons). La base la encontrarán en la librería de R
aplore3 (como se explicará a continuación).
Esta base de datos corresponde a información de una muestra de 200 individuos de un estudio cuyo objetivo era evaluar la sobrevida de los pacientes ingresados en la Unidad de Cuidado Intensivo y estudiar los factores de riesgo asociados a la mortalidad. Los datos se recolectaron en el Baystate Medical Center, en Springfield (Massachusetts).
En la siguiente tabla, se presentan las variables medidas en este estudio:
| Variable | Definición | Detalles / Códigos |
|---|---|---|
| id | Código de identificación | Número ID único del paciente |
| sta | Estado vital al egreso hospitalario | 1: Vivo · 2: Fallecido |
| age | Edad | Años cumplidos |
| gender | Sexo | 1: Masculino · 2: Femenino |
| race | Raza | 1: Blanca · 2: Negra · 3: Otra |
| ser | Servicio al ingreso a UCI | 1: Médico · 2: Quirúrgico |
| can | Cáncer como parte del problema actual | 1: No · 2: Sí |
| crn | Antecedente de insuficiencia renal crónica | 1: No · 2: Sí |
| inf | Infección probable al ingreso a UCI | 1: No · 2: Sí |
| cpr | RCP previa al ingreso a UCI | 1: No · 2: Sí |
| sys | Presión arterial sistólica al ingreso a UCI | mm Hg |
| hra | Frecuencia cardíaca al ingreso a UCI | Latidos por minuto |
| pre | Ingreso previo a UCI en los últimos 6 meses | 1: No · 2: Sí |
| type | Tipo de ingreso | 1: Electivo · 2: Urgencia |
| fra | Fractura (hueso largo, múltiple, cuello, área única o cadera) | 1: No · 2: Sí |
| po2 | PO₂ en gases arteriales iniciales | 1: > 60 · 2: ≤ 60 |
| ph | pH en gases arteriales iniciales | 1: ≥ 7.25 · 2: < 7.25 |
| pco | PCO₂ en gases arteriales iniciales | 1: ≤ 45 · 2: > 45 |
| bic | Bicarbonato en gases arteriales iniciales | 1: ≥ 18 · 2: < 18 |
| cre | Creatinina en gases arteriales iniciales | 1: ≤ 2.0 · 2: > 2.0 |
| loc | Nivel de conciencia al ingreso a UCI | 1: Sin coma ni estupor profundo · 2: Estupor profundo · 3: Coma |
Como primer paso, cargaremos los datos. La base está contenida en la
librería aplore3. Para cargarla, únicamente debemos
instalarla y llamarla a nuestro ambiente, asignándola al objeto
base_icu, con el siguiente código:
install.packages("aplore3")
base_icu <- aplore3::icu
Además, haremos un corto resumen de nuestra base de datos para llevarnos una idea de las variables con las que estaremos trabajando:
?aplore3::icu
summary(base_icu)
## id sta age gender race
## Min. : 4.0 Lived:160 Min. :16.00 Male :124 White:175
## 1st Qu.:210.2 Died : 40 1st Qu.:46.75 Female: 76 Black: 15
## Median :412.5 Median :63.00 Other: 10
## Mean :444.8 Mean :57.55
## 3rd Qu.:671.8 3rd Qu.:72.00
## Max. :929.0 Max. :92.00
## ser can crn inf cpr sys
## Medical : 93 No :180 No :181 No :116 No :187 Min. : 36.0
## Surgical:107 Yes: 20 Yes: 19 Yes: 84 Yes: 13 1st Qu.:110.0
## Median :130.0
## Mean :132.3
## 3rd Qu.:150.0
## Max. :256.0
## hra pre type fra po2 ph
## Min. : 39.00 No :170 Elective : 53 No :185 > 60 :184 >= 7.25:187
## 1st Qu.: 80.00 Yes: 30 Emergency:147 Yes: 15 <= 60: 16 < 7.25 : 13
## Median : 96.00
## Mean : 98.92
## 3rd Qu.:118.25
## Max. :192.00
## pco bic cre loc
## <= 45:180 >= 18:185 <= 2.0:190 Nothing:185
## > 45 : 20 < 18 : 15 > 2.0 : 10 Stupor : 5
## Coma : 10
##
##
##
Encontramos que nuestra base de datos reune la información de 21 variables demográficas y clínicas registradas al momento del ingreso para cada uno de los 200 pacientes. El desenlace principal es el estado vital al alta hospitalaria (vivió o murió), con una mortalidad del 20%. La muestra tiene una edad promedio de 57.5 años, predominan los hombres y la mayoría de los ingresos fueron de emergencia. Además de antecedentes como cáncer, insuficiencia renal crónica o infección probable, la base incluye variables fisiológicas objetivas como presión arterial sistólica, frecuencia cardíaca, parámetros de gases arteriales y nivel de conciencia.
Una vez comprendida la estructura general de la base y definido que nuestro desenlace es dicótomo (estado vital: vivió/murió), el siguiente paso consiste en formular claramente nuestra pregunta de investigación o el problema de modelamiento.
Nuestra pregunta de investigación será:
En este caso buscamos evaluar cuál es la relación entre una variable,
considerada un factor de exposición (Variable ser: Servicio
al ingreso a UCI), y una variable de desenlace cuya característica
específica es que está medida en una escala cualitativa de tipo nominal,
multinomial u ordinal (Variable sta: Estado vital al egreso
hospitalario).
# Asignamos "Surgical" como nuestra categoría de referencia
base_icu$ser <- relevel(base_icu$ser, ref = "Surgical")
Adicionalmente, se tendrán en cuenta algunas variables que no son del interés primario, pero que pueden afectar la relación que se busca estudiar entre el factor de exposición y el desenlace. Estas variables constituyen las que llamaremos covariables o potenciales factores de confusión, y siguen teniendo el carácter de variables independientes.
Para el efecto de la especificación del modelo, tanto la variable de exposición como las covariables se denotarán como \(X_i\) y las denominaremos como variables independientes.
Antes de ajustar el modelo, es fundamental realizar un análisis exploratorio que nos permita evaluar el cumplimiento de un par de condiciones - o supuestos - necesarias:
sta, es de tipo cualitativo y dicótomo, con dos posibles
valores: vivo (Lived) o muerto (Died).install.packages("arsenal")
install.packages("dplyr")
base_icu %>%
dplyr::select(sta) %>%
arsenal::tableby( ~ ., data = ., digits = 1, test = TRUE) %>%
summary()
| Overall (N=200) | |
|---|---|
| sta | |
| Lived | 160 (80.0%) |
| Died | 40 (20.0%) |
Cuando vamos a ajustar un modelo de regresión logística en R, debemos
definir una variable desenlace (en este caso sta) y
verificar sus categorías. Por defecto, R estimará la probabilidad de
pertenecer a la segunda categoría que tengamos al aplicar la función
levels (en este caso, morir (Died)).
levels(base_icu$sta)
[1] “Lived” “Died”
Con relación al supuesto de muestra suficiente y aunque este es un punto central en el caso de modelos de predicción, si se supone un número de eventos por variable en el modelo de 10, una frecuencia esperada del evento de 20% y 4 variables en el modelo, el tamaño de muestra de 200, resultaría suficiente para explorar la asociación de interés.
Es importante evaluar si existen correlaciones altas entre variables independientes, ya que la colinealidad puede inflar los errores estándar, volver inestables los coeficientes y dificultar la interpretación del modelo. Una forma inicial y sencilla de explorar este problema es mediante la matriz de correlación, particularmente para variables continuas.
En nuestra base ICU, las variables continuas son:
age (edad)sys (presión sistólica)hra (frecuencia cardíaca)install.packages("corrplot")
# Seleccionamos las variables continuas
vars_cont <- base_icu[, c("age", "sys", "hra")]
# Calculamos la matriz de correlación de Pearson
cor_matrix <- cor(vars_cont, use = "complete.obs")
corrplot::corrplot(cor_matrix, method = "number", bg = "lightgrey", tl.col = "black")
La matriz de correlación muestra coeficientes entre -1 y 1:
En nuestro ejemplo, todos los valores están por debajo de 0.7 por lo que podemos afirmar que no tenemos colinealidad entre nuestras variables independientes continuas.
Una vez realizado el análisis exploratorio y definida la codificación del desenlace, el siguiente paso es especificar formalmente el modelo logístico. En regresión logística no modelamos directamente la probabilidad de morir, sino el logaritmo de las odds (logit) de ese evento. Es decir, planteamos un modelo de la forma:
\(\log\left(\frac{p}{1-p}\right) = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \dots + \beta_k X_k\)
donde \(p\) es la probabilidad de morir y \(X_1, X_2, \dots, X_k\) son las variables independientes seleccionadas (por ejemplo: servicio al ingreso a UCI, edad, presión sistólica, presencia de infección, tipo de admisión, etc.).
En esta etapa debemos tomar algunas decisiones importantes:
Podemos comenzar con un modelo completo basado en criterio clínico (incluyendo la variable de exposición de interés y todos los posibles confusores desde el punto de vista clínico, siempre y cuando el tamaño de muestra lo permita) o con un modelo más parsimonioso.
Variables como edad, presión sistólica o frecuencia cardíaca deben evaluarse respecto al supuesto de linealidad en el logit. Si no cumplen este supuesto, podrían transformarse o categorizarse.
Las variables binarias pueden incluirse directamente (0/1), mientras que variables con más de dos categorías requieren variables indicadoras (dummies), definiendo una categoría de referencia.
Para efectos de este ejemplo, comenzaremos con un modelo univariado que incluya únicamente nuestra exposición:
ser)El modelo se ajusta con el siguiente código:
modelo <- glm(
sta ~ ser,
data = base_icu,
family = binomial
)
glm(): Es la función en R para ajustar modelos
lineales generalizados.
sta ~ ser: especifica la fórmula del modelo:
– sta → variable dependiente
– Lo que está a la derecha del símbolo ~ serán las
variables independientes
family = binomial: indica que:
– La distribución del error es binomial
– Se utiliza la función de enlace logit (por defecto)
Esto convierte el modelo en una regresión logística.
Para ver los resultados del modelo ajustado, utilizaremos la función
summary:
summary(modelo)
##
## Call:
## glm(formula = sta ~ ser, family = binomial, data = base_icu)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.8935 0.2867 -6.605 3.97e-11 ***
## serMedical 0.9469 0.3682 2.572 0.0101 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 200.16 on 199 degrees of freedom
## Residual deviance: 193.24 on 198 degrees of freedom
## AIC: 197.24
##
## Number of Fisher Scoring iterations: 4
A priori, con la columna Pr(>|z|) podemos indentificar qué variables muestran una asociación estadísticamente significativa con nuestro desenlace. En este caso, sería:
serMedical (Servicio al ingreso a UCI: Médico)
La columna Estimate nos da los coeficientes en escala logarítmica (log-odds), por lo que para interpretarlos clínicamente debemos exponenciarlos (lo haremos a continuación)
Podemos exponenciar los coeficientes del modelo en R de forma manual
o utilizando la función tbl_regression del paquete
gtsummary:
install.packages("gtsummary")
## Forma manual de exponenciar los coeficientes del modelo
exp(coef(modelo))
## (Intercept) serMedical
## 0.1505376 2.5778252
## Uso la función tbl_regression para exponenciar los coeficientes del modelo
gtsummary::bold_p(gtsummary::tbl_regression(modelo, exponentiate = TRUE, pvalue_fun = ~ gtsummary::style_pvalue(.x, digits = 2)))
| Characteristic | OR | 95% CI | p-value |
|---|---|---|---|
| ser | |||
| Surgical | — | — | |
| Medical | 2.58 | 1.27, 5.43 | 0.010 |
| Abbreviations: CI = Confidence Interval, OR = Odds Ratio | |||
Los pacientes del servicio médico tienen 2.58 veces el odds (OR crudo) del evento comparados con los pacientes del servicio quirúrgico.
El intervalo de confianza nos dice: Con 95% de confianza, el verdadero OR poblacional está entre 1.27 y 5.43.
Puntos clave:
El intervalo es relativamente amplio → posible imprecisión (tal vez tamaño muestral moderado).
El Riesgo Relativo (RR), también llamado Relative Risk o Risk Ratio, se define como:
\(RR = \frac{Riesgo\ en\ expuestos}{Riesgo\ en\ no\ expuestos}\)
En términos probabilísticos:
\(RR = \frac{P(Y=1|X=1)}{P(Y=1|X=0)}\)
Es decir:
El RR compara directamente probabilidades (riesgos).
En nuestro ejemplo, calculamos el RR a través de una tabla de 2x2:
base_icu %>%
dplyr::select(sta, ser) %>%
arsenal::tableby(sta ~ ., data = ., digits = 1, test = FALSE, cat.stats="countrowpct") %>%
summary()
| Lived (N=160) | Died (N=40) | Total (N=200) | |
|---|---|---|---|
| ser | |||
| Surgical | 93 (86.9%) | 14 (13.1%) | 107 (100.0%) |
| Medical | 67 (72.0%) | 26 (28.0%) | 93 (100.0%) |
tabla_2x2 <- addmargins(table(base_icu$ser, base_icu$sta))
# Riesgo en Medical
riesgo_med <- tabla_2x2["Medical","Died"] / sum(tabla_2x2["Medical",])
# Riesgo en Surgical
riesgo_surg <- tabla_2x2["Surgical","Died"] / sum(tabla_2x2["Surgical",])
# RR real
RR_real <- riesgo_med / riesgo_surg
round(RR_real, 2)
## [1] 2.14
Interpretación:
¿Y entonces el OR?
El OR compara odds, no probabilidades.
Recordemos:
\(odds = \frac{P}{1-P}\)
Entonces el OR es:
\(OR = \frac{odds\ en\ expuestos}{odds\ en\ no\ expuestos}\)
Es decir:
\(OR = \frac{\frac{P_1}{1-P_1}}{\frac{P_0}{1-P_0}}\)
Donde:
¿Por qué la regresión logística estima OR y no RR?
Porque el modelo logístico modela:
\(\log \left( \frac{P}{1-P} \right)\)
Es decir, modela el log odds.
Cuando exponenciamos un coeficiente \(β\):
\(e^{\beta}\)
obtenemos un odds ratio ajustado.
El modelo nunca modela directamente:
\(\log(P)\)
por eso no produce RR directamente.
Cuando la incidencia del desenlace (evento de interés) es baja (menos del 10% o 5%), entonces:
Matemáticamente:
Si la probabilidad del evento es pequeña, entonces a + b ≈ b y c + d ≈ d. Por lo tanto:
\[RR = \frac{a / (a+b)}{c / (c+d)} \approx \frac{a / b}{c / d} = OR\]\[RR = \frac{a / (a+b)}{c / (c+d)} \approx \frac{a / b}{c / d} = OR\]
Si el desenlace que estás estudiando es poco frecuente, puedes usar el OR como una buena estimación del RR. Sin embargo, si el evento es común (incidencia alta), el OR tenderá a sobrestimar el RR.
Volviendo a nuestro ejemplo…
Con nuestro ejemplo, tenemos
En este caso, OR es aproximadamente 20% mayor que el RR. Esto ocurre porque nuestro desenlace no es raro (tenemos 20% de muertes). No podríamos interpretar el OR como un riesgo.
Recordemos:
\(odds = \frac{P}{1-P}\)
Cuando P aumenta: - El denominador \((1−P)\) disminuye - El odds crece más rápido que la probabilidad
Por eso el OR tiende a “inflarse” respecto al RR.
Lecturas complementarias: