In questo caso, credo che esista un percorso per una soluzione se indossiamo il nostro cappello per l'analisi della sopravvivenza. Si noti che anche se questo modello non ha soggetti censurati (nel senso tradizionale), possiamo ancora usare l'analisi della sopravvivenza e parlare dei pericoli dei soggetti.
Dobbiamo modellare tre cose in questo ordine: i) il rischio cumulativo, ii) il pericolo, iii) la probabilità del log.
i) Faremo parte i) nei passaggi. Qual è il rischio cumulativo, , di una variabile casuale di Poisson? Per una distribuzione discreta, ci sono due modi per definirlo¹, ma useremo la definizione . Quindi il rischio cumulativo per èH(t)H(t)=−logS(t)T∼Poi(λ)
HT(t)=−log(1−Q(t,λ))=−logP(t,λ)
dove è rispettivamente la funzione gamma regolarizzata superiore, inferiore.Q,P
Ora vogliamo aggiungere i "pericoli" dell'assicurazione che si sta esaurendo. La cosa bella dei pericoli cumulativi è che sono additivi, quindi dobbiamo semplicemente aggiungere "rischi" ai tempi 7, 14, 21:
HT′(t)=−logP(t,λ)+a⋅1(t>7)+b⋅1(t>14)+c⋅1(t>21)
Dal punto di vista euristico, un paziente è soggetto a un rischio di "Poisson" di fondo, quindi a rischi puntuali a 7, 14 e 21. (Poiché si tratta di un rischio cumulativo , accumuliamo quei rischi puntuali, quindi il .) non so cosa siano e , ma in seguito li collegheremo alle nostre probabilità di esaurimento assicurativo.>a,bc
In realtà, poiché sappiamo che 21 è il limite superiore e tutti i pazienti vengono rimossi dopo, possiamo impostare come infinito.c
HT′(t)=−logP(t,λ)+a⋅1(t>7)+b⋅1(t>14)+∞⋅1(t>21)
ii) Successivamente utilizziamo il rischio cumulativo per ottenere il pericolo, . La formula per questo è:h(t)
h(t)=1−exp(H(t)−H(t+1))
Collegare il nostro rischio cumulativo e semplificare:
hT′(t)=1−P(t+1,λ)P(t,λ)exp(−a⋅1(t=7)−b⋅1(t=14)−∞⋅1(t=21))
iii) Infine, scrivere la verosimiglianza dei log per i modelli di sopravvivenza (senza censura) è super facile una volta che abbiamo il rischio e il rischio cumulativo:
ll(λ,a,b|t)=∑i=1N(logh(ti)−H(ti))
Ed eccolo qui!
Esistono le relazioni che collegano i nostri coefficienti di rischio puntuali e le probabilità delle lunghezze assicurative: .a=−log(1−pa),b=−log(1−pa−pb)−log(1−pa),pc=1−(pa+pb)
La prova è nel budino. Facciamo alcune simulazioni e deduzioni usando la semantica del modello personalizzato delle linee di vita .
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
"""
¹ vedere la Sezione 1.2 qui