Introduction to survival analysis

Vi vil her se på metoder til at analysere outcomes, som angiver tid til en hændelse, også kaldet levetider. Metoderne vi bruger til at analysere sådanne data, overlevelsesdata, kalder vi overlevelsesanalyse (survival analysis). 

Her vil I blive introduceret til hvad der karakteriserer overlevelsesdata, deskriptiv statistik og hvordan man sammenligner to grupper ikke-parametrisk. Jeg tager udgangspunkt i et randomiseret studie (behandling vs- placebo) for en gruppe patienter med leukæmi. 

Du får seks små korte forelæsningsvideoer (samlet tid 21 minutter) inddelt i seks mindre kapitler her på siden. Undervejs får du instruktioner i, hvordan du indlæser data og laver analyserne i R, og der er også et par praktiske småopgaver og quizzer. Samlet R program finder du her. Undervejs kommer et par videoer med softwaregennemgang (samlet tid ca 20-30 min). Du skal forvente at bruge cirka 1.5 time på denne side. 

Inden vi tager fat på selve eksemplet forklarer jeg først hvad overlevelsesdata er for en type data:

1. Survival outcomes

Når vi har har levetider som outcome, organiserer vi data ud fra et fælles tidspunkt (tid 0), som for eksempel kunne være diagnosedato. Hvordan viser jeg i den næste video:

2. Survival data 

Nu vi har styr på hvad der karakteriserer overlevelsesdata, kan vi tage fat på eksemplet - tid til recidiv (/remissionstid) for leukæmipatienter: 

3. An example of survival data

Indlæs nu selv data i dit program. Du finder data her i filen med navn remission.txt. I R kan du indlæse direkte fra nettet med

r <- read.csv("http://staff.pubhealth.ku.dk/~sr/BasicStatistics/datasets/remission.txt", sep="") 

Tag et kig på datafilen. Datafilen indeholder følgende variable:

  • weeks - tid (antal uger) til recidiv eller censurering
  • recidiv - 0/1, kode 1 angiver recidiv
  • female - 0/1, kode 1 er kvinde
  • treatment - 0/1, kode 0 er placebo, kode 1 er behandling=6MP
  • WBC - White Blood Count målt ved diagnose

Vi vil her fokusere på at sammenligne de to behandlingsgrupper, og udelader køn og WBC i denne omgang. 

Bestem nu gennemsnittet af tid til recidiv/censurering i hver behandlingsgruppe (dvs af variablen weeks). Her finder du et gennemsnit på 8.7 uger i placebogruppen og 17.1 uger i behandlingsgruppen.  

  • Der er ikke nogen censuringer i placebogruppen, og derfor kan vi godt bestemme gennemsnitlig tid til recidiv (=gennemsnitlig tid i remission).
  • Der er censureringer i behandlingsgruppen, hvilket betyder, at det beregnede gennemsnittet bliver forkert. Men i hvilken retning er gennemsnittet forkert - bliver det for lavt eller for højt? Prøv dit svar af her
  • En anden mulighed kunne være at betragte censureringerne som missing data, og simpelthen slette dem, inden man beregner gennemsnittet. Bliver gennemsnittet for lavt eller højt? Prøv dit svar af her.

Studiet her er noget usædvanligt, fordi vi kun har censureringer i den ene gruppe. Normalt vil vil have censureringer i alle grupper. Når der er censureringer kan vi ikke benytte standardmetoder for kvantitative data (beregning af gennemsnit, som netop illustreret). Survival data håndteres og beskrives derfor på en anden måde - nemlig via overlevelseskurven (engelsk: survival curve). Hvordan overlevelseskurven ser ud for data uden censureringer (placebogruppen) viser jeg i videoen nedenfor:

4. The Survival Curve (no censoring)

Lav nu selv kurven i dit program, se her hvordan:

The R code used in the video:

library(survival)
Surv( r$weeks, r$recidiv )
sf1 <- survfit( Surv(weeks,recidiv) ~ 1, data=subset(r,treatment==0))
plot( sf1 )
summary( sf1 )

I videoen bestemmer jeg tidspunktet for, hvornår 30% af patienterne har fået recidiv (ved 4 uger). Benyt samme metode til at bestemme den mediane remissionstid (=median tid til recidiv, dvs det tidspunkt, hvor 50% af patienterne har fået recidiv). Får du samme resultat, hvis du helt simpelt beregner medianen af de observerede tider i placebogruppen (dvs medianen af weeks-variablen i placebogruppen)? Angiv dit svar her.

Vi kan også bestemme overlevelseskurven i behandlingsgruppen, hvor nogle af patienterne er censureret. Her håndterer vi de censurerede observationer på en særlig måde:

5. The Kaplan-Meier Estimator

Bemærk at vi med fremgangsmåden beskrevet i videoen lader de censurerede patienter indgå i beregningerne (dvs nævneren) frem til tidspunktet for censurering. På den måde udnytter vi de censurerede observationer optimalt - de bidrager til beregningerne, så længe deres status er kendt og de er under risiko for at få recidiv. Dette karakteriserer metoder for overlevelsesanalyse. 

Lav nu selv overlevelseskurven for behandlingsgruppen i R: Helt samme syntaks som ovenfor men erstat treatment==0 med treatment==1 i survfit()-linjen

Aflæs medianen og angiv dit svar her.

Vil vil gerne have CI på her. Hvordan CI'erne er defineret, og hvilken metode vi skal bruge til at beregne dem fremgår af denne video:

Få nu R til at beregne overlevelsessandsynlighederne i behandlingsgruppen incl CI baseret på log-log-metoden (den kaldes også undertiden cloglog (complementary log log)):

Når vi benytter survfit() specificerer vi, at konfidensintervallerne skal beregnes på log-log skala ved at tilføje argument conf.type:

sf2 <- survfit( Surv(weeks,recidiv) ~ 1,  data=subset(r,treatment==1), conf.type='log-log')
plot( sf2 )
summary( sf2 )

Lidt pænere plot med konfidensgrænser kan man få frem i R ved at benytte pakken prodlim (her beregnes dog konfidensintervaller på sandsynlighedsskala, ikke på log eller log-log som vi helst vil):

install.packages("prodlim") # Denne linje køres kun én gang, slet den efter brug
library(prodlim) pl1 <- prodlim( Hist(weeks,recidiv) ~ 1, data=subset(r,treatment==1)) plot( pl1 )

(Bemærk at man her skal skrive Hist i stedet for Surv når man definerer sit survival outcome). En tutorial i survivalanalyse i prodlim-pakken finder du her - den bliver du glad for! De af jer som bruger ggplot2 vil også kunne få nogle ret pæne kurver frem.

Nu vi således har fået de punktvise konfidensintervaller på kurven vil vi da også gerne aflæse medianen incl CI. Konfidensgrænserne for medianen findes ved at aflæse for hvilket x konfidenskurverne krydser 0.5 (præcis som for medianen, bare på konfidensgrænserne). Angiv dit resultat her

NB: Man kan dog også få programmet til at regne median og CI ud: Har du gemt dit survfit-objekt i f.eks. sf2, skal du bare se indholdet af sf2 (dvs tast bare sf2 i konsolvinduet).

6. The Log-Rank Test

Vi mangler nu at få programmet til at tegne de to kurver oveni hinanden og beregne p-værdien for log-rank testet. Vi skal nu kigge på hele materialet og have treatment-variablen som forklarende variabel. Hertil benyttes funktionen survdiff():

survdiff( Surv(weeks,recidiv) ~ treatment, data=r )
Selve kurverne fås frem ved at benytte survfit() med treatment som forklarende variabel (bemærk at vi nu får CI'er frem i begge grupper på en gang med summary()):
sf3 <- survfit( Surv(weeks,recidiv) ~ treatment, data=r, conf.type='log-log')
plot( sf3 )
summary(sf3)

Vi kan tvinge CI på med conf.int=T i plot - men det bliver frygteligt grimt. Benyt i så fald i stedet prodlim pakken (find link til tutorial ovenfor).

Du har nu lært:

  • Hvad der karakteriserer overlevelsesdata (censureringer)
  • Hvordan vi definerer og læser overlevelseskurver (Kaplan-Meier), både med og uden censureringer
  • Hvilken metode vi bedst benytter til at beregne konfidensintervaller (log-log skala)
  • Hvordan overlevelseskurverne kan benyttes til at bestemme median tid til event (=recidiv) inl CI - og at vi med censureringer ikke kan bestemme en gennemsnitlig levetid. 
  • At overlevelseskurverne kan sammenlignes med et log-rank test.