Supervivencia
Análisis de tiempos de supervivencia
Distribuciones y modelos de supervivencia
En estadística, el análisis de supervivencia se refiere al conjunto de técnicas y métodos utilizados para estudiar el tiempo que transcurre hasta que ocurre un evento específico. Aunque el término "supervivencia" proviene del campo de la biomedicina, donde se estudia la duración de vida de los pacientes después de un tratamiento, este tipo de análisis es muy flexible y se aplica en muchos otros contextos. Los eventos pueden incluir la falla de una máquina, la duración de una suscripción, o el tiempo hasta una recaída en un tratamiento, entre otros.
Tiempos de supervivencia
Los tiempos de supervivencia son los períodos que se miden hasta que sucede un evento de interés. En el caso de la medicina, esto suele ser el tiempo hasta la muerte o el tiempo hasta una recuperación o recaída. Pero en otros campos, el tiempo de supervivencia podría representar el tiempo hasta que un dispositivo electrónico falla o hasta que un cliente decide abandonar un servicio.
Características de los Tiempos de Supervivencia
Algunas características comunes en los tiempos de supervivencia son:
a. Censura
Muchas veces, al finalizar un estudio, algunos sujetos no han experimentado el evento de interés. Por ejemplo, en un estudio de cáncer, puede ser que algunos pacientes estén vivos al final del estudio. Estos casos son "censurados", ya que no tenemos el tiempo exacto de ocurrencia del evento.
Existen principalmente dos tipos de censura:
Censura a la derecha: Ocurre cuando el evento no ha sucedido al final del período de estudio.
Censura a la izquierda: Sucede cuando no se sabe el momento exacto en que ocurrió el evento, solo que sucedió antes de cierto tiempo.
Una de las dificultades al usar datos para el análisis de supervivencia es que, al finalizar un estudio, muchos individuos pueden seguir “vivos”. En estadística, el término utilizado para valores de medición que solo se conocen parcialmente es censura o datos censurados.
Consideremos, por ejemplo, una lista de correos electrónicos cuyos suscriptores se dividen en dos grupos. El Grupo Uno se cansa rápidamente de los correos y se da de baja después de tres meses. El Grupo Dos los disfruta y generalmente sigue suscrito por un año y medio. Realizamos un estudio que dura un año y queremos investigar la duración promedio de suscripción.
En este caso, los individuos que se dan de baja dentro del periodo del estudio tienen tiempos de suscripción observados (representados en rojo), mientras que los suscriptores que aún están en la lista al final del estudio tienen datos de censura por la derecha (representados en azul). Si intentáramos estimar la duración promedio de suscripción sin incluir los datos censurados, claramente subestimaríamos de forma significativa el tiempo promedio de suscripción real en la población.
Un problema similar surge si algunos individuos aumentan sus configuraciones de privacidad en medio del estudio, prohibiéndonos monitorearlos hasta que este termine. Estos datos también se consideran como datos censurados por la derecha.
b. Distribuciones de Supervivencia
Existen distribuciones específicas que modelan bien los tiempos de supervivencia. Las más comunes son:
b.1 Distribución exponencial:
Modela situaciones donde el riesgo de ocurrencia del evento es constante a lo largo del tiempo.
b.2 Distribución de Weibull:
Permite que la tasa de riesgo varíe en el tiempo, haciéndola muy útil para modelar datos de supervivencia que no tienen un riesgo constante. La distribución de Weibull se usa frecuentemente para modelar datos de fiabilidad o de supervivencia. Fue identificada por primera vez por Fréchet en 1927, pero descrita en detalle por Weibull en 1951, por lo que a veces también se encuentra bajo el nombre de distribución de Fréchet.
En
scipy.stats
, la distribución de Weibull está disponible bajo el nombreweibull_min
o, de forma equivalente,frechet_r
para Fréchet derecha. (Laweibull_max
, también llamadafrechet_l
para Fréchet izquierda, simplemente es el reflejo de la primera respecto al origen).La distribución de Weibull se caracteriza por un parámetro de forma, conocido como el módulo de Weibull k. Todas las distribuciones en Python ofrecen un método conveniente para trabajar con estos parámetros.
b.3 Distribución de Kaplan-Meier: Es una técnica no paramétrica que permite estimar la probabilidad de supervivencia en distintos puntos del tiempo, considerando la censura.
b.4 Distribución Log-Normal: Asume que el logaritmo del tiempo de supervivencia sigue una distribución normal, ideal para datos asimétricos. Se utiliza en eventos donde los tiempos de supervivencia varían en orden de magnitud. Por ejemplo, en tiempo de recuperación de pacientes con alta variabilidad entre individuos.
b.5 Distribución Gamma: Distribución que generaliza la exponencial, útil para tiempos de espera acumulativos. Se aplica a sistemas donde el evento depende de múltiples subprocesos. Por ejemplo en tiempos iempo de respuesta en sistemas con múltiples pasos de procesamiento.
b.5 Distribución Log-logística: Es útil para datos con riesgo creciente al inicio y decreciente después de cierto tiempo. Se aplica en eventos de supervivencia con patrones complejos. Por ejemplo en predicción de patrones de remisión y recaída de cáncer.
b.6 Gompertz: Es de uso común en estudios de mortalidad humana y biológica; modela tasas de mortalidad crecientes con el tiempo. Se aplica en estudios de supervivencia biológica y mortalidad. Por ejemplo en redicción de probabilidad de mortalidad en poblaciones humanas a medida que envejecen.
b.7 Pareto: Describe fenómenos con probabilidad de eventos extremos en sistemas jerárquicos o de nichos. Se aplica en procesos con eventos extremos poco frecuentes. Por ejemplo en análisis del tiempo hasta el colapso en mercados competitivos.
b.8 Burr: Similar a la Weibull, es útil para datos con riesgo creciente y decreciente en distintas fases. Se aplica a datos con fases de alto y bajo riesgo. Por ejemplo en modelado de ciclos de vida de motores con varias fases de riesgo.
b.9 Modelo de Cox: Modelo semi-paramétrico que no asume una distribución específica; analiza el efecto de variables independientes. Se aplica en estudios de factores que afectan el tiempo hasta el evento. Por ejemplo en estudios clínicos y evaluación de cómo factores como la edad afectan la supervivencia en tratamientos.
b.10 Cox Estratificado: Extensión del modelo de Cox para análisis en subgrupos o estratos. Se aplica en análisis de subgrupos en supervivencia. Por ejemplo en estudios médicos donde se obser va el tiempo de recuperación en distintos grupos de edad.
b.11 Acelerado de Tiempo de Falla (AFT): Modelo que analiza cómo los factores aceleran o desaceleran el tiempo hasta el evento. Se aplica en estudio de factores que afectan la velocidad del tiempo de supervivencia. Por ejemplo en estudios de vida útil de productos: como el análisis del impacto de la temperatura en la vida útil de componentes.
b.12 Riesgos Competitivos: Modelo para analizar tiempos hasta el evento en presencia de múltiples tipos de eventos competidores. Se aplica en estudio de situaciones con múltiples causas de un evento. Por ejemplo en estudio de fallas de máquinas donde se evaluan distintas causas de falla en sistemas complejos, como en aviones.
Importancia del Análisis de Supervivencia
El análisis de supervivencia es crucial en muchas áreas porque nos ayuda a entender no solo cuándo ocurre un evento, sino también cómo ocurren estos eventos en el tiempo y si existen factores que afectan la "duración de vida". Nos permite responder preguntas como:
- ¿Cuánto tiempo es probable que un paciente sobreviva bajo un tratamiento?
- ¿Cuál es la duración media de un producto antes de que falle?
- ¿Cuánto tiempo un usuario sigue suscrito a un servicio antes de darse de baja?
Aplicaciones del Análisis de Supervivencia
El análisis de supervivencia no solo se aplica en medicina; es útil en diversos campos, como:
Economía y Finanzas: Para estudiar la duración de empleo, el tiempo hasta la quiebra de una empresa o el tiempo que tarda un crédito en ser pagado.
Industria y Calidad: En estudios de confiabilidad, para analizar el tiempo hasta la falla de componentes mecánicos o electrónicos.
Telecomunicaciones: Para analizar el tiempo que un cliente permanece en una compañía antes de cambiar de proveedor.
En resumen, el análisis de supervivencia permite realizar estudios detallados sobre la duración y el tiempo de ocurrencia de eventos críticos en cualquier disciplina, proporcionando una herramienta estadística poderosa para entender patrones de vida, duración y tiempos de falla.
Visualización de los Tiempos de Supervivencia
Un gráfico muy común en el análisis de supervivencia es la curva de Kaplan-Meier que muestra la probabilidad de supervivencia a lo largo del tiempo.
Ejemplo
A continuación, se muestra cómo generar un gráfico de Kaplan-Meier en Python usando datos de ejemplo:
```python
import matplotlib.pyplot as plt
import numpy as np
from lifelines import KaplanMeierFitter
# Datos de ejemplo
tiempos = np.array([5, 6, 6, 2, 4, 6, 8, 10, 2, 4]) # tiempos de observación
eventos = np.array([1, 1, 0, 1, 0, 1, 1, 1, 1, 0]) # 1 si el evento ocurrió, 0 si fue censurado
# Crear el objeto de KaplanMeierFitter
kmf = KaplanMeierFitter()
# Ajustar el modelo a los datos
kmf.fit(tiempos, event_observed=eventos)
# Graficar la curva de supervivencia
plt.figure(figsize=(8, 6))
kmf.plot(ci_show=True)
plt.title('Curva de Supervivencia Kaplan-Meier')
plt.xlabel('Tiempo')
plt.ylabel('Probabilidad de Supervivencia')
plt.show()
```
Lifelines
En el código anterior, lifelines
es una biblioteca de Python especializada en el análisis de supervivencia. Fue diseñada específicamente para facilitar el modelado, visualización y análisis de datos de supervivencia y es ampliamente utilizada en bioestadística, epidemiología, ingeniería, y otras disciplinas donde los tiempos hasta eventos son críticos. La biblioteca lifelines
incluye herramientas para realizar análisis de supervivencia no paramétrico, como el modelo de Kaplan-Meier, así como métodos de supervivencia paramétricos y semi-paramétricos como el modelo de riesgos proporcionales de Cox.
Funciones principales de lifelines
Algunas de las funciones clave de lifelines
incluyen:
KaplanMeierFitter: Para estimar y visualizar curvas de supervivencia usando el método de Kaplan-Meier.
CoxPHFitter: Implementa el modelo de riesgos proporcionales de Cox, útil para analizar el impacto de variables explicativas en los tiempos de supervivencia.
WeibullFitter, ExponentialFitter: Para ajustar modelos paramétricos como Weibull o exponencial, que son comunes en análisis de fiabilidad.
Ejemplo básico con Kaplan-Meier
Con KaplanMeierFitter
de lifelines
, como vimos en el código anterior, es posible ajustar y graficar una curva de supervivencia para visualizar la probabilidad de supervivencia a lo largo del tiempo. lifelines
es muy útil porque incluye opciones para manejar datos censurados y permite una visualización directa de las curvas de supervivencia, lo que simplifica el análisis.
Una forma ingeniosa de abordar estos problemas es mediante la descripción de estos datos con la curva de Kaplan-Meier, detallada en Altman (1999). Para crear esta curva, primero se subdivide el tiempo en períodos pequeños. Luego, se calcula la probabilidad de que un sujeto sobreviva un determinado período. La probabilidad de supervivencia se define como:
p(k) = P(k-1) * (rk-fk) / rk
donde
p(k) es la probabilidad de sobrevivir al período k,
rk es el número de sujetos aún en riesgo (es decir, aún siendo observados) inmediatamente antes del día k,
fk es el número de fallos (o muertes) observados en el día k.
La curva que describe la probabilidad de supervivencia resultante se denomina **tabla de vida**, **curva de supervivencia**, o **curva de Kaplan-Meier**.
Ejemplo de Problema: Análisis de la Vida Útil de Bombillas Industriales
Una empresa de manufactura de bombillas quiere estimar la vida útil de sus productos para dar una garantía adecuada a sus clientes. Las bombillas están sometidas a una serie de pruebas de desgaste acelerado para observar cuánto tiempo operan hasta que fallan. La distribución de tiempos de fallo se espera que siga una distribución de Weibull debido a las siguientes razones:
La distribución de Weibull es adecuada para analizar la vida útil de productos mecánicos y electrónicos.
Permite modelar tiempos de fallo cuando la tasa de fallo es variable: algunos productos tienen más probabilidad de fallo al principio de su vida útil, mientras que otros tienden a fallar más tarde.
Resolución
Recopilación de datos de tiempos de fallo: La empresa prueba 500 bombillas y registra los tiempos (en horas) hasta el fallo de cada bombilla. Este conjunto de datos representará los tiempos de supervivencia de las bombillas.
Ajuste de la distribución de Weibull a los datos: Se utiliza la distribución de Weibull para modelar estos tiempos de fallo. En este caso, el parámetro de forma de Weibull (`k`) indica el tipo de tasa de fallo:
Si `k < 1`: Los fallos ocurren más al inicio (fallo temprano).
Si `k = 1`: La tasa de fallo es constante (como en una distribución exponencial).
Si `k > 1`: Los fallos ocurren más tarde (fallo por desgaste).
Cálculo de parámetros clave: Usamos Python y `scipy.stats.weibull_min` para ajustar la distribución y calcular los parámetros de la distribución de Weibull (forma y escala), lo cual permitirá hacer predicciones.
En un jupyter notebook se encuentra el código para simular y resolver el problema, el código es como sigue a continuación:
```python
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
# Paso 1: Simulación de datos de tiempos de fallo (en horas) para 500 bombillas
# Usamos un parámetro de forma (Weibull Modulus) de 1.7 para simular desgaste
shape_param = 1.7 # Weibull modulus
scale_param = 2000 # Tiempo de vida promedio esperado (en horas)
weibull_dist = stats.weibull_min(shape_param, scale=scale_param)
failure_times = weibull_dist.rvs(500)
# Paso 2: Ajustar la distribución de Weibull a los datos
fitted_params = stats.weibull_min.fit(failure_times)
fitted_shape, fitted_loc, fitted_scale = fitted_params
print(f"Parámetro de forma ajustado: {fitted_shape:.2f}")
print(f"Parámetro de escala ajustado: {fitted_scale:.2f}")
# Paso 3: Graficar la distribución de Weibull ajustada y los datos observados
x = np.linspace(0, max(failure_times), 100)
pdf_fitted = stats.weibull_min.pdf(x, fitted_shape, loc=fitted_loc, scale=fitted_scale)
plt.hist(failure_times, bins=30, density=True, alpha=0.6, color='skyblue', label="Datos observados")
plt.plot(x, pdf_fitted, 'r-', lw=2, label="Distribución Weibull ajustada")
plt.xlabel("Tiempo hasta el fallo (horas)")
plt.ylabel("Densidad de probabilidad")
plt.title("Ajuste de la Distribución Weibull a los Tiempos de Fallo")
plt.legend()
plt.show()
```
Los datos de los tiempos de fallo se simulan con la generación de los mismos.
Los resultados que arrojan los cálculos son:
Parámetro de forma ajustado (
fitted_shape) : 1.62
Parámetro de escala ajustado (
fitted_scale) : 1991.7
Interpretación de los resultados
Parámetro de Forma: Si el parámetro de forma ajustado (`fitted_shape`) es mayor que 1, esto indicaría que los fallos de las bombillas tienden a ocurrir más a medida que pasa el tiempo (desgaste).
Parámetro de Escala: El parámetro de escala (`fitted_scale`) nos indica una estimación de la vida media o mediana esperada de las bombillas en horas. Este valor es útil para determinar un **período de garantía razonable**.
Visualización: El histograma de los tiempos de fallo observado, junto con la curva de densidad ajustada de Weibull, permite verificar si la distribución se ajusta adecuadamente a los datos.
Implicancias prácticas
Garantía del producto: Si la vida media estimada es de, digamos,
1991
horas, la empresa puede ofrecer una garantía que cubra un porcentaje significativo de la vida útil esperada, como 1600 horas.Predicción de fallos: Con esta distribución, la empresa también puede hacer predicciones sobre la cantidad de bombillas que es probable que fallen dentro de ciertos intervalos de tiempo.
Este análisis ayuda a la empresa a entender mejor la **durabilidad de sus productos** y **gestionar expectativas** de calidad y duración con sus clientes.