In diesem Fall glaube ich, dass ein Weg zu einer Lösung besteht, wenn wir unseren Hut für die Überlebensanalyse aufsetzen. Beachten Sie, dass wir, obwohl dieses Modell keine zensierten Probanden hat (im traditionellen Sinne), dennoch eine Überlebensanalyse verwenden und über die Gefahren von Probanden sprechen können.
Wir müssen drei Dinge in dieser Reihenfolge modellieren: i) die kumulative Gefahr, ii) die Gefahr, iii) die logarithmische Wahrscheinlichkeit.
i) Wir machen Teil i) in Schritten. Was ist die kumulative Gefahr einer Poisson-Zufallsvariablen? Für eine diskrete Verteilung gibt es zwei Möglichkeiten, sie zu definieren¹, aber wir werden die Definition . Die kumulative Gefahr für ist alsoH(t)H(t)=−logS(t)T∼Poi(λ)
HT(t)=−log(1−Q(t,λ))=−logP(t,λ)
wobei die obere bzw. untere regulierte Gammafunktion ist.Q,P
Jetzt wollen wir die "Gefahren" der ablaufenden Versicherung hinzufügen. Das Schöne an kumulativen Gefahren ist, dass sie additiv sind, also müssen wir einfach zu den Zeiten 7, 14, 21 "Risiken" hinzufügen:
HT′(t)=−logP(t,λ)+a⋅1(t>7)+b⋅1(t>14)+c⋅1(t>21)
Heuristisch gesehen unterliegt ein Patient einem Poisson-Hintergrundrisiko und dann punktuellen Risiken bei 7, 14 und 21. (Da dies eine kumulative Gefahr darstellt, akkumulieren wir diese punktuellen Risiken, daher das .) Wir Ich weiß nicht, was und sind, aber wir werden sie später mit unseren Wahrscheinlichkeiten für das Auslaufen der Versicherung verbinden.>a,bc
Da wir wissen, dass 21 die Obergrenze ist und alle Patienten danach entfernt werden, können wir auf unendlich setzen.c
HT′(t)=−logP(t,λ)+a⋅1(t>7)+b⋅1(t>14)+∞⋅1(t>21)
ii) Als nächstes verwenden wir die kumulative Gefahr, um die Gefahr . Die Formel dafür lautet:h(t)
h(t)=1−exp(H(t)−H(t+1))
Unsere kumulative Gefahr einstecken und vereinfachen:
hT′(t)=1−P(t+1,λ)P(t,λ)exp(−a⋅1(t=7)−b⋅1(t=14)−∞⋅1(t=21))
iii) Schließlich ist das Schreiben der Protokollwahrscheinlichkeit für Überlebensmodelle (ohne Zensur) sehr einfach, sobald wir die Gefahr und die kumulative Gefahr haben:
ll(λ,a,b|t)=∑i=1N(logh(ti)−H(ti))
Und da ist es!
Es gibt die Beziehungen, die unsere punktuellen Gefährdungskoeffizienten und die Wahrscheinlichkeiten der Versicherungslängen verbinden: .a=−log(1−pa),b=−log(1−pa−pb)−log(1−pa),pc=1−(pa+pb)
Der Beweis ist im Pudding. Lassen Sie uns einige Simulationen und Schlussfolgerungen unter Verwendung der benutzerdefinierten Modellsemantik von Lebenslinien durchführen .
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
"""
¹ siehe Abschnitt 1.2 hier