Las curvas de Kaplan-Meier muestran la probabilidad de supervivencia a lo largo del tiempo, por lo que son el gráfico más habitual en el análisis de supervivencia y en los ensayos clínicos. La curva desciende cada vez que ocurre un evento (por ejemplo, un fallecimiento), lo que le da su característica forma escalonada, y permite comparar la supervivencia de varios grupos.
En este tutorial vamos a utilizar el conjunto de datos lung del paquete survival, que contiene el tiempo de supervivencia de pacientes con cáncer de pulmón avanzado. Los datos necesitan una columna con el tiempo (time, en días), una columna con el estado (status, donde 1 significa censurado y 2 fallecido) y, opcionalmente, una variable de grupo, como sex, que convertimos en un factor con etiquetas descriptivas.
# install.packages("survival")
library(survival)
df <- lung
df$sex <- factor(df$sex, levels = c(1, 2),
labels = c("Hombre", "Mujer"))
La forma más sencilla de dibujar curvas de Kaplan-Meier con ggplot2 es el paquete ggsurvfit. Primero, estima la curva de supervivencia con survfit2, pasando una fórmula con el tiempo y el estado dentro de Surv, y luego pasa el resultado a ggsurvfit. Usa ~ 1 para estimar una única curva para todos los pacientes.
# install.packages("ggsurvfit")
library(ggsurvfit)
survfit2(Surv(time, status) ~ 1, data = df) |>
ggsurvfit()

Ten en cuenta que survfit2 funciona igual que la función survfit del paquete survival, pero guarda información adicional que ggsurvfit utiliza para etiquetar el gráfico.

Para comparar la supervivencia de varios grupos pasa la variable de grupo a la parte derecha de la fórmula. Se creará una curva para cada grupo, con un color diferente y una leyenda.
survfit2(Surv(time, status) ~ sex, data = df) |>
ggsurvfit()
El paquete ggsurvfit proporciona funciones para añadir elementos al gráfico como si fueran capas de ggplot2. add_confidence_interval añade los intervalos de confianza de cada curva como un área sombreada y add_censor_mark marca las observaciones censuradas, esto es, los pacientes que salieron del estudio sin experimentar el evento.
survfit2(Surv(time, status) ~ sex, data = df) |>
ggsurvfit() +
add_confidence_interval() +
add_censor_mark()

La tabla de pacientes en riesgo, que se muestra debajo del gráfico, indica cuántos pacientes siguen en el estudio en cada momento. Añádela con add_risktable, que además permite elegir los estadísticos a mostrar con risktable_stats.
survfit2(Surv(time, status) ~ sex, data = df) |>
ggsurvfit() +
add_confidence_interval() +
add_censor_mark() +
add_risktable()

add_quantile dibuja las líneas hasta la mediana de supervivencia (el momento en el que la probabilidad de supervivencia es del 50%) y add_pvalue añade el p-valor del test log-rank, que compara la supervivencia de los grupos.
survfit2(Surv(time, status) ~ sex, data = df) |>
ggsurvfit() +
add_confidence_interval() +
add_quantile(y_value = 0.5, linetype = "dotted") +
add_pvalue(location = "annotation", x = 800)


Como la salida de ggsurvfit es un objeto de ggplot2 puedes personalizarla con las funciones habituales. Cambia los colores de las curvas con scale_color_manual y los de los intervalos de confianza con scale_fill_manual, muestra la supervivencia como porcentaje con scales::percent y cambia el tema y los títulos de los ejes.
survfit2(Surv(time, status) ~ sex, data = df) |>
ggsurvfit(linewidth = 1) +
add_confidence_interval() +
add_censor_mark() +
scale_color_manual(values = c("#264653", "#E76F51")) +
scale_fill_manual(values = c("#264653", "#E76F51")) +
scale_y_continuous(labels = scales::percent, limits = c(0, 1)) +
theme_minimal() +
theme(legend.position = "bottom") +
labs(x = "Días", y = "Supervivencia global")
Si prefieres los gráficos de R base también puedes dibujar la salida de la función survfit del paquete survival con la función plot, personalizando los tipos de línea y los colores de cada grupo. Si necesitas mostrar los hazard ratios de un modelo de regresión de Cox puedes utilizar un forest plot.
fit <- survfit(Surv(time, status) ~ sex, data = df)
plot(fit, col = c("#264653", "#E76F51"), lwd = 2,
xlab = "Días", ylab = "Supervivencia global")
legend("topright", legend = levels(df$sex),
col = c("#264653", "#E76F51"), lwd = 2)
Aprende estadística desde lo básico hasta técnicas avanzadas, explicado con claridad
Ir al sitio
También te puede interesar