En este caso, creo que existe un camino hacia una solución si nos ponemos nuestro sombrero de análisis de supervivencia. Tenga en cuenta que aunque este modelo no tiene sujetos censurados (en el sentido tradicional), todavía podemos usar el análisis de supervivencia y hablar sobre los peligros de los sujetos.
Necesitamos modelar tres cosas en este orden: i) el peligro acumulado, ii) el peligro, iii) la probabilidad logarítmica.
i) Haremos la parte i) en pasos. ¿Cuál es el riesgo acumulado, , de una variable aleatoria de Poisson? Para una distribución discreta, hay dos formas de definirla¹, pero usaremos la definición . Entonces, el peligro acumulativo para esH( t )H( t ) = - logS( t )T∼ Po i ( λ )
HT( t ) = - log( 1 - Q ( t , λ ) ) =-logPAG( t , λ )
donde es la función gamma regularizada superior e inferior respectivamente.Q , P
Ahora queremos agregar los "peligros" del seguro que se acaba. Lo bueno de los riesgos acumulativos es que son aditivos, por lo que simplemente necesitamos agregar "riesgos" en los momentos 7, 14, 21:
HT′( t ) = - logPAG( t , λ ) +a⋅ 1( t > 7 )+ b ⋅ 1( t > 14 )+ c ⋅ 1( t > 21 )
Heurísticamente, un paciente está sujeto a un riesgo de "Poisson" de fondo, y luego a los riesgos puntuales a los 7, 14 y 21. (Debido a que este es un riesgo acumulativo , acumulamos esos riesgos puntuales, de ahí el .) no saben lo que , y son, pero vamos a ellos más adelante conectarse a nuestras probabilidades de seguro está acabando.>a , bC
En realidad, como sabemos que 21 es el límite superior y todos los pacientes son eliminados después de eso, podemos establecer que sea infinito.C
HT′(t)=−logP(t,λ)+a⋅1(t>7)+b⋅1(t>14)+∞⋅1(t>21)
ii) A continuación, usamos el peligro acumulado para obtener el peligro, . La fórmula para esto es:h(t)
h(t)=1−exp(H(t)−H(t+1))
Conectando nuestro peligro acumulativo y simplificando:
hT′(t)=1−P(t+1,λ)P(t,λ)exp(−a⋅1(t=7)−b⋅1(t=14)−∞⋅1(t=21))
iii) Finalmente, escribir el registro de probabilidad de modelos de supervivencia (sin censura) es superfácil una vez que tenemos el peligro y el peligro acumulativo:
ll(λ,a,b|t)=∑i=1N(logh(ti)−H(ti))
¡Y ahí está!
Existen las relaciones que conectan nuestros coeficientes de riesgo puntuales y las probabilidades de la duración del seguro: .a=−log(1−pa),b=−log(1−pa−pb)−log(1−pa),pc=1−(pa+pb)
La prueba está en el pudín. Hagamos algunas simulaciones e inferencias utilizando la semántica del modelo personalizado de líneas de vida .
from lifelines.fitters import ParametericUnivariateFitter
from autograd_gamma import gammaincln, gammainc
from autograd import numpy as np
MAX = 1e10
class InsuranceDischargeModel(ParametericUnivariateFitter):
"""
parameters are related by
a = -log(1 - p_a)
b = -log(1 - p_a - p_b) - log(1 - p_a)
p_c = 1 - (p_a + p_b)
"""
_fitted_parameter_names = ["lbd", "a", "b"]
_bounds = [(0, None), (0, None), (0, None)]
def _hazard(self, params, t):
# from (1.64c) in http://geb.uni-giessen.de/geb/volltexte/2014/10793/pdf/RinneHorst_hazardrate_2014.pdf
return 1 - np.exp(self._cumulative_hazard(params, t) - self._cumulative_hazard(params, t+1))
def _cumulative_hazard(self, params, t):
lbd, a, b = params
return -gammaincln(t, lbd) + a * (t > 7) + b * (t > 14) + MAX * (t > 21)
def gen_data():
p_a, p_b = 0.4, 0.2
p = [p_a, p_b, 1 - p_a - p_b]
lambda_ = 18
death_without_insurance = np.random.poisson(lambda_)
insurance_covers_until = np.random.choice([7, 14, 21], p=p)
if death_without_insurance < insurance_covers_until:
return death_without_insurance
else:
return insurance_covers_until
durations = np.array([gen_data() for _ in range(40000)])
model = InsuranceDischargeModel()
model.fit(durations)
model.print_summary(5)
"""
<lifelines.InsuranceDischargeModel: fitted with 40000 observations, 0 censored>
number of subjects = 40000
number of events = 40000
log-likelihood = -78845.10392
hypothesis = lbd != 1, a != 1, b != 1
---
coef se(coef) lower 0.95 upper 0.95 p -log2(p)
lbd 18.05026 0.03353 17.98455 18.11598 <5e-06 inf
a 0.50993 0.00409 0.50191 0.51794 <5e-06 inf
b 0.40777 0.00557 0.39686 0.41868 <5e-06 inf
"""
¹ ver Sección 1.2 aquí