Práctica 7: Análisis de Supervivencia

Author

Aritz Adin

Published

11/12/2024

Ejercicio 1

En pruebas con anticonceptivos, un criterio evidente de aceptación de dicho anticonceptivo es la prevención de embarazos. Sin embargo, los anticonceptivos modernos muestran tasas de fallo muy bajas, y por tanto las alteraciones en ocurrencia de hemorragias, como amenorrea (una ausencia prolongada de hemorragia), hemorragias irregulares o prolongadas, son importantes a la hora de evaluar un método anticonceptivo.

Para promocionar la investigación en este tema la OMS (WHO) ha proporcionado datos de ensayos clínicos realizadas con distintos tipos de anticonceptivos. Una parte de este conjunto de datos tiene que ver con el tiempo que transcurre desde que una mujer comienza a usar un método particular hasta que suspende su uso.

Los datos que presentamos a continuación corresponden al número de semanas que transcurren desde el comienzo de uso de un dispositivo intrauterino particular (DIU) llamado Multiload 250, hasta que se suspende su uso por problemas de hemorragias. Los datos corresponden a 18 mujeres entre 18 y 35 años que habían experimentado dos embarazos previos.

En este ejemplo el tiempo de origen en que se comienza el estudio es a partir del primer día de uso del DIU y el tiempo final es la suspensión debido a problemas hemorrágicos.

Algunas mujeres suspendieron el uso del DIU porque deseaban quedarse embarazadas mientras que otras simplemente se perdió su seguimiento. Por ello aparecen algunos datos censurados.

Un objetivo de este análisis es resumir la distribución de los tiempos de suspensión del uso del dispositivo intrauterino.

Datos: Tiempo en semanas hasta la suspensión de uso del DIU

10, 13+, 18+, 19, 23+, 30, 36, 38+, 54+ 56+, 59, 75, 93, 97, 104+, 107, 107+, 107+

Responde a las siguientes preguntas:

1.1. Introduce los datos manualmente en R o lee el fichero dispositivo.txt.

diu <- read.table("dispositivo.txt", header=T)
print(diu)
   time status
1    10      1
2    13      0
3    18      0
4    19      1
5    23      0
6    30      1
7    36      1
8    38      0
9    54      0
10   56      0
11   59      1
12   75      1
13   93      1
14   97      1
15  104      0
16  107      1
17  107      0
18  107      0

1.2. Estima la función de supervivencia \(S(t)\) por Kaplan-Meier. Calcula los errores estándar y proporciona un I.C. al 95% para \(S(t)\).

library(survival)

## Intervalo de confianza "curva +- error estandar" ##
diu.surv1 <- survfit(Surv(time,status)~1, diu, conf.type="plain")
summary(diu.surv1)
Call: survfit(formula = Surv(time, status) ~ 1, data = diu, conf.type = "plain")

 time n.risk n.event survival std.err lower 95% CI upper 95% CI
   10     18       1    0.944  0.0540       0.8386        1.000
   19     15       1    0.881  0.0790       0.7267        1.000
   30     13       1    0.814  0.0978       0.6220        1.000
   36     12       1    0.746  0.1107       0.5290        0.963
   59      8       1    0.653  0.1303       0.3972        0.908
   75      7       1    0.559  0.1412       0.2827        0.836
   93      6       1    0.466  0.1452       0.1816        0.751
   97      5       1    0.373  0.1430       0.0927        0.653
  107      3       1    0.249  0.1392       0.0000        0.522
## Intervalo de confianza con la transformación clog-log ##
diu.surv2 <- survfit(Surv(time,status)~1, diu, conf.type="log-log")
summary(diu.surv2)
Call: survfit(formula = Surv(time, status) ~ 1, data = diu, conf.type = "log-log")

 time n.risk n.event survival std.err lower 95% CI upper 95% CI
   10     18       1    0.944  0.0540       0.6664        0.992
   19     15       1    0.881  0.0790       0.6019        0.969
   30     13       1    0.814  0.0978       0.5241        0.936
   36     12       1    0.746  0.1107       0.4536        0.897
   59      8       1    0.653  0.1303       0.3438        0.843
   75      7       1    0.559  0.1412       0.2564        0.780
   93      6       1    0.466  0.1452       0.1830        0.710
   97      5       1    0.373  0.1430       0.1209        0.631
  107      3       1    0.249  0.1392       0.0468        0.531
## Intervalo de confianza aplicando logaritmos (por defecto) ##
diu.surv3 <- survfit(Surv(time,status)~1, diu)
summary(diu.surv3)
Call: survfit(formula = Surv(time, status) ~ 1, data = diu)

 time n.risk n.event survival std.err lower 95% CI upper 95% CI
   10     18       1    0.944  0.0540       0.8443        1.000
   19     15       1    0.881  0.0790       0.7395        1.000
   30     13       1    0.814  0.0978       0.6429        1.000
   36     12       1    0.746  0.1107       0.5577        0.998
   59      8       1    0.653  0.1303       0.4413        0.965
   75      7       1    0.559  0.1412       0.3411        0.917
   93      6       1    0.466  0.1452       0.2532        0.858
   97      5       1    0.373  0.1430       0.1759        0.791
  107      3       1    0.249  0.1392       0.0829        0.745

1.3. Dibuja la función de supervivencia estimada con su correspondiente intervalo de confianza.

plot(diu.surv1, col="red", main="Función supervivencia por Kaplan-Meier", xlab="Tiempo (semanas)")
lines(diu.surv2, col="blue")
lines(diu.surv3, col="black")
legend("bottomleft", c("Surv1","Surv2","Surv3"), col=c("red","blue","black"), lty=2, bty="n")

1.4. ¿Cuál es la probabilidad de que el tiempo de uso del dispositivo supere las 19 semanas? Proporciona los correspondientes intervalos de confianza al 95% e interpreta su significado.

aux <- summary(diu.surv3)[c("time","n.risk","n.event","surv","std.err","lower","upper")]
aux <- as.data.frame(aux)
aux[aux$time=="19",]
  time n.risk n.event      surv    std.err     lower upper
2   19     15       1 0.8814815 0.07898919 0.7394986     1

INTERPRETACIÓN: La probabilidad de que el tiempo de uso del dispositivo supere las 19 semanas es de 0.8815 con un intervalo de confianza al 95% de \([0.7395, 1]\).

1.5. ¿A partir de qué semana la supervivencia es menor al 80%?

summary(diu.surv3)
Call: survfit(formula = Surv(time, status) ~ 1, data = diu)

 time n.risk n.event survival std.err lower 95% CI upper 95% CI
   10     18       1    0.944  0.0540       0.8443        1.000
   19     15       1    0.881  0.0790       0.7395        1.000
   30     13       1    0.814  0.0978       0.6429        1.000
   36     12       1    0.746  0.1107       0.5577        0.998
   59      8       1    0.653  0.1303       0.4413        0.965
   75      7       1    0.559  0.1412       0.3411        0.917
   93      6       1    0.466  0.1452       0.2532        0.858
   97      5       1    0.373  0.1430       0.1759        0.791
  107      3       1    0.249  0.1392       0.0829        0.745

A partir de la semana 36 la supervivencia es menor al 80%. Sin embargo, mirando el intervalo de confianza vemos que no contiene al 0.8 a partir de la semana 97.

Ejercicio 2

El fichero colon.txt contiene los resultados de un experimento en 929 pacientes con cáncer de colon en estado B/C que se les suministra quimioterapia adyuvante. Algunas de las variables que recoge el fichero son

  • time: tiempo de supervivencia en días
  • status: variable que mide el fallo (1) o la censura (0)
  • rx: tratamiento. “Obs”, “Lev” (Levamisole), “Lev+5FU” (Levamisole +5-FU)
  • sex: male (1) o female (0)
  • age: edad en años
  • differ: diferenciación del tumor (1=bien, 2=moderadamente, 3=mal)
  • extent: extensión local (1=submucosa, 2=músculo, 3=serosa, 4=estructuras contiguas)
colon <- read.table("colon.txt", header=T, stringsAsFactors=T)
str(colon)
'data.frame':   929 obs. of  8 variables:
 $ id    : int  1 2 3 4 5 6 7 8 9 10 ...
 $ time  : int  1521 3087 963 293 659 1767 420 3192 3173 3308 ...
 $ status: int  1 0 1 1 1 1 1 0 0 0 ...
 $ rx    : Factor w/ 3 levels "Lev","Lev+5FU",..: 2 2 3 2 3 2 1 3 1 2 ...
 $ sex   : int  1 1 0 0 1 0 1 1 1 0 ...
 $ age   : int  43 63 71 66 69 57 77 54 46 68 ...
 $ differ: int  2 2 2 2 2 2 2 2 2 2 ...
 $ extent: int  3 3 2 3 3 3 3 3 3 3 ...

1.1. Estima curvas de supervivencia por el método de Kaplan y Meier para los distintos grupos del tratamiento. ¿Crees que existen diferencias entre las curvas?

colon.surv <- survfit(Surv(time, status) ~ rx, data=colon)

plot(colon.surv, col=c(1,2,3), lwd=2, main="Curvas de supervivencia KM")
legend("bottomleft", levels(colon$rx), col=c(1,2,3), lwd=2, bty="n")

La curva de supervivencia correspondiente al tratamiento “Lev+5FU” está consistentemente por encima de las otras dos curvas (“Lev” y “Lev+5FU”), por lo que el pronóstico de supervivencia es mejor en este grupo que en el resto. Sin embargo, parece no observarse diferencias entre las curvas de supervivencia de los grupos “Lev” y “Obs”.

1.2. Comprueba si las diferencias observadas en las curvas son o no estadísticamente significativas utilizando el test de Log-Rank y el test de Peto-Peto.

Test Log-Rank

survdiff(Surv(time,status)~rx, colon) 
Call:
survdiff(formula = Surv(time, status) ~ rx, data = colon)

             N Observed Expected (O-E)^2/E (O-E)^2/V
rx=Lev     310      161      146      1.52      2.25
rx=Lev+5FU 304      123      157      7.55     11.62
rx=Obs     315      168      148      2.58      3.85

 Chisq= 11.7  on 2 degrees of freedom, p= 0.003 

Test Peto-Peto

survdiff(Surv(time,status)~rx, rho=1, colon)
Call:
survdiff(formula = Surv(time, status) ~ rx, data = colon, rho = 1)

             N Observed Expected (O-E)^2/E (O-E)^2/V
rx=Lev     310    122.8      111      1.26      2.38
rx=Lev+5FU 304     93.1      118      5.24     10.27
rx=Obs     315    126.0      113      1.50      2.86

 Chisq= 10.3  on 2 degrees of freedom, p= 0.006 

En ambos casos, rechazamos la hipótesis nula de que las curvas de superviviencia KM son iguales para los tres grupos.

1.3. ¿Cuál es la probabilidad que un individuo del grupo “Lev+5FU” viva más de 127 días? Proporciona un intervalo de confianza al 95% para dicha probabilidad.

aux <- summary(colon.surv)[c("strata","time","n.risk","n.event","surv","std.err","lower","upper")]
aux <- as.data.frame(aux)
aux <- aux[aux$strata=="rx=Lev+5FU",]
aux[aux$time=="127",]
        strata time n.risk n.event      surv     std.err     lower     upper
160 rx=Lev+5FU  127    299       1 0.9802632 0.007977621 0.9647513 0.9960244

INTERPRETACIÓN: La probabilidad de que un individuo del grupo “Lev+5FU” viva más de 127 días es de 0.9803 con un intervalo de confianza al 95% de \([0.9648, 0.996]\).

1.4. Estima curvas de supervivencia por el método de Kaplan y Meier según el sexo. ¿Crees que existen diferencias entre las curvas?

colon.surv2 <- survfit(Surv(time, status) ~ sex, data=colon)

survdiff(Surv(time,status)~sex, colon) 
Call:
survdiff(formula = Surv(time, status) ~ sex, data = colon)

        N Observed Expected (O-E)^2/E (O-E)^2/V
sex=0 445      215      217   0.01049    0.0202
sex=1 484      237      235   0.00965    0.0202

 Chisq= 0  on 1 degrees of freedom, p= 0.9 
plot(colon.surv2, col=c(1,2,3), lwd=2, main="Curvas de supervivencia KM")
legend("bottomleft", c("Male","Female"), col=c(1,2,3), lwd=2, bty="n")

1.5. Estima curvas de supervivencia por el método de Kaplan y Meier según si el tumor se diferencia bien, moderadamente o mal. ¿Crees que existen diferencias entre las curvas?

colon.surv3 <- survfit(Surv(time, status) ~ differ, data=colon)

survdiff(Surv(time,status)~differ, colon) 
Call:
survdiff(formula = Surv(time, status) ~ differ, data = colon)

n=906, 23 observations deleted due to missingness.

           N Observed Expected (O-E)^2/E (O-E)^2/V
differ=1  93       42     47.5     0.643     0.721
differ=2 663      311    334.9     1.708     7.108
differ=3 150       88     58.6    14.808    17.105

 Chisq= 17.2  on 2 degrees of freedom, p= 2e-04 
plot(colon.surv3, col=c(1,2,3), lwd=2, main="Curvas de supervivencia KM")
legend("bottomleft", c("Bien","Moderadamente","Mal"), col=c(1,2,3), lwd=2, bty="n")

1.6. Estima curvas de supervivencia por el método de Kaplan y Meier según la extensión del tumor. ¿Crees que existen diferencias entre las curvas?

colon.surv4 <- survfit(Surv(time, status) ~ extent, data=colon)

survdiff(Surv(time,status)~extent, colon) 
Call:
survdiff(formula = Surv(time, status) ~ extent, data = colon)

           N Observed Expected (O-E)^2/E (O-E)^2/V
extent=1  21        4     12.8      6.06      6.25
extent=2 106       36     60.9     10.21     11.82
extent=3 759      383    361.7      1.26      6.29
extent=4  43       29     16.6      9.34      9.71

 Chisq= 26.9  on 3 degrees of freedom, p= 6e-06 
plot(colon.surv4, col=c(1,2,3,4), lwd=2, main="Curvas de supervivencia KM")
legend("bottomleft", c("submucosa","músculo","serosa","estructuras contiguas"), col=c(1,2,3,4), lwd=2, bty="n")

1.7. Estima curvas de supervivencia por el método de Kaplan y Meier a partir de los siguientes valores de la variable edad: grupo 1 [18,45], grupo 2 (45,65] y grupo 3 (65,+]. ¿Crees que existen diferencias entre las curvas?

En primer lugar definimos la nueva variable:

colon$grupo <- cut(colon$age, include.lowest=TRUE, right=TRUE,
                   breaks=c(18,45,65,max(colon$age)),
                   labels=c("grupo 1","grupo 2","grupo 3"))
summary(colon$grupo)
grupo 1 grupo 2 grupo 3 
    124     471     334 

A continuación, estimamos las curvas de supervivencia por el método KM y comprobamos si existen diferencias significativas entre los grupos de edad:

colon.surv5 <- survfit(Surv(time, status) ~ grupo, data=colon)

survdiff(Surv(time,status)~grupo, colon) 
Call:
survdiff(formula = Surv(time, status) ~ grupo, data = colon)

                N Observed Expected (O-E)^2/E (O-E)^2/V
grupo=grupo 1 124       65     57.9     0.874      1.00
grupo=grupo 2 471      209    237.4     3.386      7.14
grupo=grupo 3 334      178    156.8     2.878      4.41

 Chisq= 7.2  on 2 degrees of freedom, p= 0.03 
plot(colon.surv5, col=c(1,2,3), lwd=2, main="Curvas de supervivencia KM")
legend("bottomleft", c("[18,45] años","(45,65] años","(65,+] años"), col=c(1,2,3), lwd=2, bty="n")

Para entregar

Disponemos de 137 pacientes con cancer de pulmón. Los datos se encuentran en el fichero VA de la librería MASS. La variable respuesta es el tiempo de supervivencia en días. El fichero tiene las siguientes variables:

  • stime: tiempo de supervivencia en días
  • status: variable que mide el fallo (1) o la censura (0)
  • treat: tratamiento standard (1) o test (2)
  • cell: cuatro tipos distintos de células (1=squamous, 2=smallcell, 3=adeno, 4=large)
  • Karn: puntuación Karnofsky medido en una escala de 0-100, con valores altos para pacientes que se encuentran relativamente bien
  • diag.time: Tiempo en meses desde el diagnóstico al entrar en la prueba
  • age: edad en años
  • prior: variable lógica que determina si hubo terapia a priori (0=no, 10=yes)
library(MASS)

data("VA")
str(VA)
'data.frame':   137 obs. of  8 variables:
 $ stime    : num  72 411 228 126 118 10 82 110 314 100 ...
 $ status   : num  1 1 1 1 1 1 1 1 1 0 ...
 $ treat    : Factor w/ 2 levels "1","2": 1 1 1 1 1 1 1 1 1 1 ...
 $ age      : num  69 64 38 63 65 49 69 68 43 70 ...
 $ Karn     : num  60 70 60 60 70 20 40 80 50 70 ...
 $ diag.time: num  7 5 3 9 11 5 10 29 18 6 ...
 $ cell     : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
 $ prior    : Factor w/ 2 levels "0","10": 1 2 1 2 2 1 2 1 1 1 ...

Responde a las siguientes preguntas:

1.1. Estima curvas de supervivencia por el método de Kaplan y Meier para los grupos standard y test del tratamiento. ¿Son las curvas significativamente distintas?

1.2. ¿Cuál es la supervivencia en el instante 13 para los distintos grupos? ¿Qué significa?

1.3. Estima curvas de supervivencia por el método de Kaplan y Meier a partir de los siguientes valores de la variable Karnofsky: grupo 1 (0-50] años, grupo 2 (50-70] y grupo 3 (70-100].

1.4. Comprueba si las diferencias observadas en las curvas son o no estadísticamente significativas utilizando el test de Log-Rank y el test de Peto-Peto. \(\alpha=0.05\)

1.5 ¿Cuál es la probabilidad de supervivencia para el grupo 1 (0-50] en el día 24? ¿Y en el grupo 2 (50,70]?. Proporciona un intervalo de confianza al 95% para dichas probabilidades.