Tutorial
C-index en modelos de Cox
Este tutorial muestra cómo calcular e interpretar el C-index en R para evaluar
la capacidad discriminativa de un modelo de Cox. El flujo incluye depuración de la base,
verificación de supuestos, obtención del predictor lineal y cálculo de la concordancia
con datos censurados usando la base lung.
Descripción
El C-index resume si el modelo ordena correctamente el riesgo entre pares de pacientes:
cuando uno tiene mayor riesgo predicho, debería presentar el evento antes.
En supervivencia no basta con ajustar coxph(). También hay que comprobar
que el score generado discrimina bien, especialmente cuando existen observaciones censuradas.
Requisitos previos
- R con los paquetes survival, Hmisc y dplyr.
- Comprensión básica del objeto Surv() y del ajuste con coxph().
- Variables de tiempo, evento y covariables sin valores perdidos en el subconjunto analizado.
- Interpretación de censura y de medidas de discriminación.
Pasos clave
- Seleccionar variables relevantes y eliminar filas incompletas.
- Recodificar el evento para usar 1 como fallecimiento y 0 como censura.
- Ajustar el modelo de Cox y revisar riesgos proporcionales con cox.zph().
- Obtener el predictor lineal con predict(..., type = "lp").
- Calcular rcorr.cens() invirtiendo el signo del score.
- Interpretar el C-index: 0.5 azar, 0.6-0.7 modesto, 0.7-0.8 bueno, > 0.8 muy bueno.
Código de ejemplo
Ejemplo compacto con la base lung para ajustar el modelo y calcular el C-index.
library(survival)
library(Hmisc)
library(dplyr)
lung_clean <- lung %>%
select(time, status, age, sex, wt.loss) %>%
filter(complete.cases(.)) %>%
mutate(status = if_else(status == 2, 1, 0))
cox_ph <- coxph(
Surv(time, status) ~ age + sex + wt.loss,
data = lung_clean
)
cox.zph(cox_ph)
pred <- predict(cox_ph, type = "lp")
c_index <- rcorr.cens(
-pred,
Surv(lung_clean$time, lung_clean$status)
)
round(c_index, 2)
Nota metodológica
El signo negativo en rcorr.cens(-pred, ...) es importante porque el predictor lineal
de Cox representa mayor riesgo cuando toma valores altos, mientras que el tiempo de supervivencia
se interpreta en la dirección opuesta. En este ejemplo, un C-index cercano a 0.61 sugiere
una discriminación modesta: el modelo ordena mejor que el azar, pero todavía lejos de una
capacidad predictiva fuerte. El C-index evalúa discriminación, no calibración.