Análisis de Datos de Supervivencia - Apuntes de Clase - Noparam - 2019
Análisis de Datos de Supervivencia - Apuntes de Clase - Noparam - 2019
Análisis de Datos de Supervivencia - Apuntes de Clase - Noparam - 2019
Estimación de funciones y
pruebas no paramétricas
para datos de supervivencia
utilizando R
Año: 2019
Estimación de funciones y pruebas no paramétricas para datos de supervivencia utilizando R 2019
Índice
1. Introducción2
2. Presentación del problema2
3. Aspectos específicos del software R3
4. Procedimientos no paramétricos para datos de supervivencia en R6
5. Estimación de la función de supervivencia6
5.1 Método de Kaplan-Meier6
5.2 Método de Nelson-Aalen11
5.3 Método de Tablas de Vida14
6. Estimación de la función hazard a través del método de Nelson-Aalen19
7. Comparación de curvas de supervivencia estimadas23
7.1 Comparación de dos grupos23
7.2 Test log-rank de tendencia27
7.3 Test estratificado28
8. Referencias bibliográficas30
1
Estimación de funciones y pruebas no paramétricas para datos de supervivencia utilizando R 2019
1. Introducción
El presente material se elabora con el objetivo de exponer las principales herramientas para llevar a
cabo un análisis de supervivencia básico mediante del software libre R1. Es importante mencionar que
por las características propias de dicho software, en forma permanente se incorporan nuevos
paquetes y opciones; en esta oportunidad se muestra una forma de analizar los datos de supervivencia
pero queda propuesto al alumno explorar otros códigos.
En cada uno de los análisis realizados se presentan los códigos utilizados junto con una breve
descripción y la correspondiente salida. Además, con el fin de comparar con lo visto durante el
desarrollo de las clases prácticas, se presentan las sentencias y las salidas obtenidas utilizando SAS. Se
sugiere trabajar con el editor R Studio de manera de que resulte más amigable la programación.
Además, se registró el Estado clínico de los pacientes el cual indica si fueron trasplantados bajo el
estado de urgencia/emergencia o si lo hicieron en forma electiva.
Como variable respuesta se considera el tiempo transcurrido (expresado en años) desde el TP hasta
el fallecimiento del paciente o hasta la finalización del estudio (Tiempo). La variable que indica si el
paciente falleció o si se trata de una observación censurada se denomina evento y presenta los
códigos 0 para las censuras y 1 para los eventos.
1R Core Team (2013). R: A language and environment for statistical computing. R Foundation for Statistical
Computing, Vienna, Austria.URL http://www.R-project.org/.
2
Estimación de funciones y pruebas no paramétricas para datos de supervivencia utilizando R 2019
nombre EPOC.csv. En la sección siguiente se explica cómo se realiza la lectura y visualización de este
tipo de archivos.
En lo referido a la ayuda, el lenguaje R ofrece varios niveles de ayuda y éstas pueden activarse a
través de la línea de comandos o a través del menú Help. A través de la línea de comandos pueden
utilizarse las instrucciones:
Un aspecto que debe considerarse cuando se trabaja en R es que el lenguaje diferencia entre las
mayúsculas y las minúsculas, por lo que cada comando u objeto debe ser escrito de manera exacta.
Si se desea incluir un comentario dentro de un código de R, el mismo debe iniciarse con el símbolo
numeral (#). Todo lo que aparece en la línea de comando a la derecha de dicho símbolo es tomado
como un comentario y, por lo tanto, no interfiere en la programación.
En R se pueden leer datos que se encuentren guardados bajo diversos formatos. Por ejemplo, los
datos pueden estar almacenados en una hoja de cálculo Excel, en un archivo de datos de SPSS, en un
archivo de texto, en un archivo donde los datos se encuentran delimitados por espacios o por comas,
entre otros.
3
Estimación de funciones y pruebas no paramétricas para datos de supervivencia utilizando R 2019
Los datos de la aplicación se encuentran guardados en un archivo con extensión csv, del inglés
commaseparatedvalues, (EPOC.cvs). Para su lectura y visualización debe ejecutarse el siguiente código.
# Código 3.1
setwd("…:/…/carpeta_de_trabajo")
# establece el directorio de trabajo, donde estarán
# guardados los archivos a utilizar.
Base_EPOC<-read.csv('EPOC.csv')
# lee un conjunto de datos a partir de un
# archivo delimitado por comas y lo guarda en un
# objeto de R bajo el nombre asignado por el
# usuario, en este caso Base_EPOC, guardado en la
# carpeta de trabajo correspondiente.
4
Estimación de funciones y pruebas no paramétricas para datos de supervivencia utilizando R 2019
Salida 3.1
Se muestran los primeros 15 valores.
Utilizando el comando library() se obtiene la lista de los paquetes que ya están instalados. Si
no está disponible el paquete que se pretende utilizar, la instalación del mismo puede hacerse de dos
maneras: mediante el menú, siguiendo las instrucciones que se encuentran en: Packages Install, o
bien mediante códigos utilizando el comando:
Una vez que el paquete está instalado, debe cargarse para poder utilizar sus funciones y datos. Al
igual que la instalación, la carga puede realizarse desde el menú o mediante el comando:
library(nombre_del_paquete)
5
Estimación de funciones y pruebas no paramétricas para datos de supervivencia utilizando R 2019
Las rutinas en la librería survival trabajan con objetos construidos usando la función Surv, la
cual crea un objeto que combina la información del tiempo en el que se producen los eventos o el
tiempo de censura junto con la información referida al estado de cada observación (evento o censura).
Para el ejemplo bajo estudio, ejecutando el código 4.1 se obtiene la salida 4.1 donde se muestra el
contenido de dicho objeto.
# Código 4.1
library(survival)
6
Estimación de funciones y pruebas no paramétricas para datos de supervivencia utilizando R 2019
se indica con ( ) el j-ésimo tiempo ordenado con . De esta forma se tiene que:
( ) ( ) ( ).
El estimador de la función de supervivencia ^( )se obtiene luego de definir los intervalos de manera
que cada uno comience en un tiempo observado y termine en el momento anterior al próximo tiempo
de evento ordenado, de forma que contenga un único tiempo de evento. Así, se tiene:
^( ) ∏ y ( ) ( )
# Código 5.1
KM.surv<-survfit(Surv(tiempo,evento==1)~1, type="kaplan-meier",
conf.int=.95, conf.type='log-log', error="greenwood")
# crea y asigna al objeto KM.surv, la
# función de supervivencia utilizando el método
# de Kaplan-Meier con sus respectivos intervalos de
# confianza del 95%.
# La opción conf.type permite indicar la forma
# de cálculo de los intervalos de confianza. En
# este caso se elige log(-log(survival)).
# La opción error permite especificar la forma de
# cálculo del error estándar de la estimación.
# En este caso tanto “type” como “error” pueden
# omitirse ya que son las que utiliza por defecto.
7
Estimación de funciones y pruebas no paramétricas para datos de supervivencia utilizando R 2019
Salida 5.1
Se muestran los primeros 10 registros.
Para obtener el gráfico de la función de supervivencia se utiliza el comando plot, aplicado al objeto
de R que contiene la función estimada, tal como se muestra en el Código 5.2. Notar que por defecto el
gráfico incluye los intervalos de confianza junto con la curva de supervivencia estimada.
# Código 5.2
plot(KM.surv,
main="Función de supervivencia estimada por Kaplan-Meier",
xlab="Tiempo (años)",
ylab="Probabilidad de supervivencia estimada",
lty=1, lwd=2, cex=1, cex.lab=0.8, mark=1, col="blue")
# En primer lugar se indica el objeto que
# contiene la función estimada (KM.surv en
# este caso).
# El título del gráfico se indica con main y
# los nombres de los ejes con xlab e ylab.
# lty: indica el tipo de línea de la curva (en
# este caso línea sólida)
# lwd: indica el ancho de la línea.
# cex: indica el tamaño de los puntos
# indicadores de censura.
# cex.lab: indica el tamaño de los nombres de
# los ejes.
# mark: indica la forma de los puntos
# indicadores de censura (en este caso círculos
# sin relleno.
# col: indica el color de la curva
axis(1, seq(0,12,1))
axis(2, seq(0,1,.1)) # en la sentencia axis se identifica con el 1
# al eje de las abscisas y con 2 al de las
# ordenadas. Luego, con seq() se define el
# mínimo, máximo y la escala del eje en cuestión.
8
Estimación de funciones y pruebas no paramétricas para datos de supervivencia utilizando R 2019
Salida 5.2
Si se desea obtener información sobre los cuartiles, una forma es hacerlo a través de la utilización de
la función quantileaplicada al objeto que contiene la función de supervivencia estimada.
# Código 5.3
quantile(KM.surv,
quantiles=c(0.25, 0.5, 0.75),
conf.int=.95) # en la opción quantiles se indican separados
# por comas los cuantiles para los cuales se
# quiere conocer la estimación.
# Al igual que en la función survfit, en la
# opción conf.int se especifica el
# coeficiente de confianza.
Salida 5.3
9
Estimación de funciones y pruebas no paramétricas para datos de supervivencia utilizando R 2019
Recordar:
En el software SAS la estimación de la función de supervivencia se obtiene mediante el
procedimiento lifetest. También forman parte de la salida los cuartiles y el gráfico de la función
estimada (si se utiliza la opción plots=survival).
10
Estimación de funciones y pruebas no paramétricas para datos de supervivencia utilizando R 2019
~( ) ∏ ( ) y ( ) ( )
# Código 5.4
11
Estimación de funciones y pruebas no paramétricas para datos de supervivencia utilizando R 2019
Salida 5.4
Se muestran los primeros 11 registros.
Una vez estimada la función de supervivencia, puede graficarse de la misma forma que se procedió
con el estimador de Kaplan-Meier.
# Código 5.5
plot(NAalen.surv,
main="Función de supervivencia estimada por Nelson-Aalen",
xlab="Tiempo (años)",
ylab="Probabilidad de supervivencia estimada",
lty=1, lwd=2, cex=1, cex.lab=0.8,mark=1,col="blue")
axis(1, seq(0,12,1))
axis(2, seq(0,1,.1))
Salida 5.5
12
Estimación de funciones y pruebas no paramétricas para datos de supervivencia utilizando R 2019
Recordar:
En el software SAS se puede obtener este estimador a través de la macro nelaalen (la cual debe
leerse indicando el directorio donde está guardada y luego ejecutarse).
%include"C:\Nelaalen.sas";
%nelaalen(data=EPOC, time=tiempo, cens=evento);
13
Estimación de funciones y pruebas no paramétricas para datos de supervivencia utilizando R 2019
Si los datos con los que se cuenta se presentan agrupados por intervalos, tal como se muestran en la
Tabla 1, es necesario aplicar el Método de Tablas de vida para su análisis. A fin de ejemplificar este
método se creó un archivo con los datos agrupados: “EPOC_agrup.txt”. En el código 5.6 se muestra
cómo acceder a los datos en este caso.
Nº de
Intervalo Nº de Nº de
individuos
de tiempo eventos censuras
en riesgo
[0,2) 84 6 38
[2,4) 40 11 4
[4,6) 25 5 6
[6,8) 14 3 4
[8,10) 7 3 2
[10,12) 2 0 1
[12,14) 1 1 0
# Código 5.6
EPOC_agrup<-read.table('EPOC_agrup.txt',header=T)
# lee un conjunto de datos a partir de un archivo de
# texto y lo asigna al objeto de R denominado
# EPOC_agrup.
# La opción header=T indica que la primera fila
# contiene los nombres de las variables.
14
Estimación de funciones y pruebas no paramétricas para datos de supervivencia utilizando R 2019
Salida5.6
La función de supervivencia estimada por medio del método de Tablas de Vida, puede obtenerse
mediante la función lifetab, perteneciente al paquete KMsurv. En el caso de la aplicación, el
código correspondiente es el siguiente:
#Código 5.7
library(KMsurv)
15
Estimación de funciones y pruebas no paramétricas para datos de supervivencia utilizando R 2019
Salida 5.7
nsubsnlostnriskneventsurv
0-2 84 6 81.0 38 1.0000000
2-4 40 11 34.5 4 0.5308642
4-6 25 5 22.5 6 0.4693147
6-8 14 3 12.5 4 0.3441641
8-10 7 3 5.5 2 0.2340316
10-12 2 0 2.0 1 0.1489292
12-14 1 1 0.5 0 0.0744646
Nuevamente para construir el gráfico de la curva de supervivencia estimada por este método se
utiliza la función plot.
# Código 5.8
plot(intervalos[1:7],TVida.surv[,5], type="s",
main="Función de supervivencia estimada por Tablas de Vida",
xlab="Tiempo (años)",
ylab="Probabilidad de supervivencia estimada",
lty=1, lwd=2, cex=1, cex.lab=0.8,col ="blue")
# Al indicar como primer parámetro de la función
# plot “intervalos”, se obtiene en el eje del tiempo
# la escala en función de los límites de los
# intervalos.
# TVida.surv[,5]: indica que del objeto “TVida.surv”
# se utilice la quinta columna, la cual contiene
# la supervivencia estimada.
# type="s":indica que los puntos
# correspondientes a la función estimada
# aparezcan unidos y en forma escalonada.
axis(1, seq(0,12,1))
axis(2, seq(0,1,.1))
Salida 5.8
16
Estimación de funciones y pruebas no paramétricas para datos de supervivencia utilizando R 2019
Recordar:
En SAS, la estimación de la función de supervivencia se realiza por medio del procedimiento lifetest,
especificando el método a utilizar mediante method=lt.
data intervalos;
input tiempo censura freq;
cards;
1 0 6
1 1 38
3 0 11
3 1 4
5 0 5
5 1 6
7 0 3
7 1 4
9 0 3
9 1 2
11 0 0
11 1 1
13 0 1
13 1 0
;
run;
17
Estimación de funciones y pruebas no paramétricas para datos de supervivencia utilizando R 2019
18
Estimación de funciones y pruebas no paramétricas para datos de supervivencia utilizando R 2019
( )
( )
( )
Esta función sirve para determinar la distribución de los eventos utilizando información cualitativa
acerca del mecanismo de falla (o de generación de eventos) y para describir cómo dicho mecanismo
cambia a través del tiempo.
( ) ∫ ( ) [ ( )]
Haciendo uso de esta última relación, la función hazard acumulada estimada a través del método de
Nelson-Aalen se puede obtener a partir de la función de supervivencia calculada por el mismo método
en la sección5.2.
La función hazard acumulada estimada se obtiene tal como se muestra en el código 6.1.
# Código 6.1
h.aalen<-(-log(NAalen.surv$surv))
# Se le asigna al objeto llamado h.aalen el valor
# negativo del logaritmo de los valores de la función
# de supervivencia estimada por Nelson-Aalen para
# obtener la estimación de la función hazard
# acumulada.
h.aalen
19
Estimación de funciones y pruebas no paramétricas para datos de supervivencia utilizando R 2019
Salida 6.1
Se muestran los primeros 42 valores.
# Código 6.2
attach(NAalen.surv)
aalen.est
detach(NAalen.surv)
20
Estimación de funciones y pruebas no paramétricas para datos de supervivencia utilizando R 2019
Salida 6.2
Se muestran las primeras 8filas.
Para realizar el gráfico de la función hazard estimada por Nelson-Aalen junto con una curva loess se
pueden utilizar las funciones plotpara el gráfico de dispersión y linespara ajustar la curva loess de
la siguiente manera.
# Código 6.3
attach(aalen.est)
detach(aalen.est)
21
Estimación de funciones y pruebas no paramétricas para datos de supervivencia utilizando R 2019
Salida 6.4
Recordar:
En SAS, como resultado de la macro nelaalense obtiene el data hazard, el cual contiene las
estimaciones de la función hazard por Nelson-Aalen tanto en forma puntual como acumulada, bajo los
nombres hazna y hazcumrespectivamente. Por lo tanto, a través de los procedimientos proc
loessy procgplot se puede obtener el gráfico correspondiente, utilizando el data hazard.
procgplotdata=Results;
plotDepVar*tiempo=1Pred*tiempo / vaxis=axis1 hm=3vm=3 overlay;
formatdepvar5.2 tiempo 2.;
run; quit;
22
Estimación de funciones y pruebas no paramétricas para datos de supervivencia utilizando R 2019
# Código 7.1
KM_estadoclinico<-survfit(Surv(tiempo, evento==1)~estado_clinico)
# estima la función de supervivencia
# según la variable que se quiere comparar, la cual
# se especifica luego del símbolo “~”, en este caso
# “estado_clínico”.
summary(KM_estadoclinico)
23
Estimación de funciones y pruebas no paramétricas para datos de supervivencia utilizando R 2019
Salida 7.1
Se muestran los primeros 7 registros para el grupo de trasplante electivo.
# Código 7.2
plot(KM_estadoclinico,
xlab="Tiempo(años)",
ylab="Probabilidad de supervivencia estimada",
main="Estimador de Kaplan-Meier según estado clínico",
lty=c(1,2)) # lty=c(1,2): es un vector que indica el
# tipo de línea, en este caso 1=línea sólida y
# 2=línea punteada.
legend(x=5,y=1,
legend=c("Urgencia/Emergencia","Electivo"),lty=c(1,2))
# legend: esta función se puede utilizar para
# agregar leyenda al gráfico.
# x e y son las coordenadas que se utilizan para
# colocar la leyenda.
24
Estimación de funciones y pruebas no paramétricas para datos de supervivencia utilizando R 2019
Salida 7.2
Existen dos explicaciones posibles para la diferencia observada entre las funciones de supervivencia
estimadas; puede ocurrir que exista una diferencia real en la supervivencia entre los dos grupos o bien
queno exista tal diferencia y que la diferencia observada sea solamente el resultado del azar. Para
decidir entre las dos explicaciones se utiliza un test de hipótesis. Dicho test puede realizarse a través
de la función survdiff, que permite efectuar el contraste de hipótesis para verificar la igualdad o
diferencia de dos o más curvas de supervivencias en base a la familia de pruebas G-rho propuestas por
Harrington y Fleming (1982). La familia de tests G-rho de Fleming y Harrington es otra forma de
estudiar los test log-ranky de Peto-Peto. Esos dos autores sugieren pesos de la forma:
[^ ( )] ; haciendo se tiene que (test log-rank) y, si , se obtiene el test de
Peto-Peto. Por lo tanto, es fundamental especificar el argumento “rho” en el código de R.
Por ejemplo, si se quiere obtener el test log-rank para evaluar si la diferencia observada en el gráfico
según estado clínico es significativa puede utilizarse el código 7.3.
# Código 7.3
25
Estimación de funciones y pruebas no paramétricas para datos de supervivencia utilizando R 2019
Salida 7.3
Recordar:
En SAS se obtienen las estimaciones de las funciones de supervivencia para cada grupo junto con los
tests de hipótesis mediante la sentencia stratadentro del procedimiento lifetest.
26
Estimación de funciones y pruebas no paramétricas para datos de supervivencia utilizando R 2019
# Código 7.4
# Código 7.5
test_tendencia<-coxph(Surv(tiempo, evento==1)~Base_EPOC$edad_cat)
summary(test_tendencia)
27
Estimación de funciones y pruebas no paramétricas para datos de supervivencia utilizando R 2019
Salida 7.5
Recordar:
En SAS el test de tendencia se obtiene mediante la sentencia test en el procedimiento lifetest.
Proc lifetestdata=EPOC_2 ;
time tiempo*evento(0);
testedad_cat;
run;
El test estratificado se utiliza para comparar dos o más conjuntos de datos de supervivencia teniendo
en cuenta una variable adicional. Por ejemplo, si se quisiera evaluar la existencia de diferencias en la
supervivencia de los pacientes según su estado clínico, estratificando (o controlando) por grupo etario.
Este test puede llevarse a cabo corriendo la función surfdiff( # Código 7.6) o recurriendo nuevamente a
un modelo de Cox ( # Código 7.7).
# Código 7.6
Estratificado1<-survdiff(Surv(tiempo, evento==1)~estado_clinico +
strata(Base_EPOC$edad_cat)
28
Estimación de funciones y pruebas no paramétricas para datos de supervivencia utilizando R 2019
Salida 7.6
# Código 7.7
Estratificado<-coxph(Surv(tiempo,evento==1)~
strata(Base_EPOC$edad_cat)+estado_clinico)
summary(estratificado)
Salida 7.7
Recordar:
Para obtener el test estratificado en SAS se utilizan las sentencias test y stratade forma
conjunta. De esta manera, las estadísticas producidas por la sentencia test son estadísticas
estratificadas que controlan por las variables listadas en la sentencia strata.
Proc lifetestdata=EPOC_2;
timetiempo*evento(0);
strataedad_cat;
testestado_clinico_;
run;
29
Estimación de funciones y pruebas no paramétricas para datos de supervivencia utilizando R 2019
8. Referencias bibliográficas
30