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.