L’analisi de supervivència es una branca de l’estadística que s’utilitza per estudiar el temps que passa fins que ocorre un esdeveniment. També se’n diu anàlisi de temps a l’esdeveniment.
Les aplicacions clíniques habituals son l’anàlisi del temps fins a la mort, recidiva, ingres hospitalàri o perdua de seguiment d’un pacient.
El concepte de censura
En estudis reals, sovint no coneixem el temps exacte de l’esdeveniment per a tothom, ni tothom comença i acaba un estudi al mateix temps. Per fer calculs amb els seguiments dels que se disposa, existeix el concepte de censura.
📌 Censura per la dreta vol dir que sabem que l’esdeveniment no ha passat fins a cert moment, però no sabem què passa després.
🔍 Causes habituals de censura per la dreta
Un subjecte pot estar censurat per diversos motius:
Pèrdua de seguiment
Retirada voluntària de l’estudi
Final del període d’estudi sense que hagi passat l’esdeveniment
Aquests són casos de censura per la dreta, que és la més habitual. Existeixen censura per l’esquerra o per intervals que no tractarem en aquest curs.
Exemple gràfic: temps fins a esdeveniment o censura
Per il·lustrar la censura i la supervivència, observem la següent figura:
Com interpretar aquest gràfic?
Pregunta: quina proporció de pacients es mantenen lliures de l’esdeveniment al cap de 10 anys?
Pacients 6 i 7: encara no han tingut l’esdeveniment a l’any 10 → lliures d’esdeveniment
Pacients 2, 9 i 10: han tingut l’esdeveniment abans de l’any 10
Pacients 1, 3, 4, 5 i 8: han estat censurats abans de l’any 10 → no sabem si han tingut l’esdeveniment o no
📌 Tot i que no sabem què ha passat amb els censurats, sí sabem que han estat seguits durant un temps determinat sense l’esdeveniment.
Com han de ser les dades?
Per fer una anàlisi de supervivència en R, necessitem un conjunt de dades que inclogui com a mínim:
Variable
Descripció
temps
Temps de seguiment per a cada subjecte (pot estar en dies, mesos, anys…)
event
Indicador de si ha passat l’esdeveniment (1) o si és censurat (0)
📌 Aquestes dues variables s’utilitzen per construir un objecte especial de tipus Surv(), que encapsula tota la informació necessària per als mètodes de supervivència: el temps, l’estat de censura i (més endavant) grups comparatius.
ℹ️ Què és un objecte Surv()?
Un objecte Surv() és un format especial que R utilitza per representar dades de supervivència.
Conté, per a cada cas:
el temps de seguiment
un indicador de si l’esdeveniment ha passat (1) o està censurat (0)
Aquest objecte és imprescindible per poder fer servir funcions com survfit(), coxph() o survdiff() del paquet survival.
Preparació de les dades
Abans de calcular el temps, cal assegurar-se que les dates estiguin en format correcte. A R això pot ser complicat, però hi ha un paquet molt útil per treballar amb dates:
lubridate és un paquet de la família tidyverse que facilita molt la conversió de textos en dates, així com càlculs, extracció d’anys, mesos, etc.
Per exemple, ymd("2020-01-01") crea una data en format “any-mes-dia”.
Exemple amb 5 pacients
library(lubridate)
S'està adjuntant el paquet: 'lubridate'
Els següents objectes estan emmascarats des de 'package:base':
date, intersect, setdiff, union
Ara tenim preparades les dades per a estimar la funció de supervivència.
Continuarem amb la corba de Kaplan-Meier i la seva representació visual.
Estimació de la funció de supervivència (Kaplan-Meier)
Ara que tenim el nostre objecte Surv() creat, podem estimar la funció de supervivència amb la funció survfit().
Estimació global (tots els pacients)
km_total <-survfit(surv_lung ~1, data = lung)summary(km_total)$table
records n.max n.start events rmean se(rmean) median 0.95LCL
228.00000 228.00000 228.00000 165.00000 376.27475 19.70779 310.00000 285.00000
0.95UCL
363.00000
📈 Visualització de la corba de supervivència
Per representar la corba utilitzarem el paquet survminer, que facilita gràfics clars i publicables.
library(survminer)
S'està carregant el paquet requerit: ggplot2
S'està carregant el paquet requerit: ggpubr
S'està adjuntant el paquet: 'survminer'
L'objecte següent està emmascarat per 'package:survival':
myeloma
ggsurvplot(km_total,conf.int =TRUE,xlab ="Dies de seguiment",ylab ="Probabilitat de supervivència",title ="Corba de supervivència (Kaplan-Meier)",surv.median.line ="hv")
La línia de punts mostra la mediana de supervivència estimada.
Comparació per sexe
Podem estimar i visualitzar la supervivència segons el sexe:
km_sexe <-survfit(surv_lung ~ sex, data = lung)ggsurvplot(km_sexe,data = lung,conf.int =TRUE,pval =TRUE,risk.table =TRUE,xlab ="Dies de seguiment",ylab ="Supervivència estimada",title ="Supervivència segons el sexe",legend.labs =c("Home", "Dona"))
Aquest gràfic ens permet observar si hi ha diferències clíniques rellevants i si són estadísticament significatives (valor p del test de log-rank).
⚖️ Comparació de grups: test de log-rank
Un cop hem representat les corbes de supervivència per grups (per exemple, per sexe), volem saber si la diferència observada és estadísticament significativa.
El test de log-rank (o test de Mantel-Haenszel) és la prova estàndard per comparar dues o més corbes de Kaplan-Meier.
Què comprova el test?
Comprova la hipòtesi nul·la que les funcions de supervivència són iguals entre grups. És a dir:
\[
H_0: S_1(t) = S_2(t) \quad \text{per a tot } t
\]
Si el valor p és petit, rebutgem ( H_0 ) → hi ha diferències estadísticament significatives entre grups
Si és gran, no podem afirmar que hi hagi diferències
Aplicació amb survdiff()
logrank <-survdiff(surv_lung ~ sex, data = lung)logrank
Call:
survdiff(formula = surv_lung ~ sex, data = lung)
N Observed Expected (O-E)^2/E (O-E)^2/V
sex=Home 138 112 91.6 4.55 10.3
sex=Dona 90 53 73.4 5.68 10.3
Chisq= 10.3 on 1 degrees of freedom, p= 0.001
La sortida ens dona un estadístic de tipus \(\chi^2\) amb els graus de llibertat i el p-valor associat.
Model de Cox (riscos proporcionals)
El model de Cox ens permet estimar l’efecte de diverses variables (edat, sexe, tractament…) sobre el risc instantani de tenir l’esdeveniment (mort, recidiva, etc.).
És l’equivalent de la regressió logística per a dades de supervivència, però tenint en compte el temps de seguiment.
Què fa el model?
Modelitza el hazard (risc instantani de morir) en funció de predictors: