У цьому випадку я вважаю, що шлях до рішення існує, якщо ми надінемо шапку аналізу виживання. Зауважте, що хоча ця модель не має цензурованих предметів (у традиційному розумінні), ми все ще можемо використовувати аналіз виживання та говорити про небезпеку випробовуваних.
Нам потрібно моделювати три речі в такому порядку: i) накопичувальна небезпека, ii) небезпека, iii) ймовірність колоди.
i) Ми зробимо частину i) кроками. Яка сукупна небезпека випадкової величини Пуассона? Для дискретного розподілу існує два способи його визначення¹, але ми будемо використовувати визначення . Отже, накопичувальна небезпека для єН( t )Н( t ) = - журналS( t )Т∼ Рo i ( λ )
НТ( t ) = - журнал( 1 - Q ( t , λ ) ) =-логП( t , λ )
де - верхня, нижня регульована гамма-функція відповідно.Q , Р
Тепер ми хочемо додати "небезпеки" страхування, що закінчується. Приємна річ, що стосується накопичувальних небезпек, полягає в тому, що вони є адитивними, тому нам просто потрібно додавати "ризики" часом 7, 14, 21:
НТ'( t ) = - журналП( t , λ ) +a⋅1( t > 7 )+ b ⋅1( t > 14 )+ c ⋅1( t > 21 )
Евристично, пацієнт піддається основним ризикам "Пуассона", а потім вказує на ризики 7, 14 і 21. (Оскільки це сукупний ризик, ми накопичуємо ці точні ризики, звідси і .) не знаю, що таке і , але згодом ми зв’яжемо їх із нашими ймовірностями страхування.>а , бc
Насправді, оскільки ми знаємо, що 21 - це верхня межа, і всі пацієнти видаляються після цього, ми можемо встановити на нескінченність.c
НТ'( t ) = - журналП( t , λ ) +a⋅1( t > 7 )+ b ⋅1( t > 14 )+ ∞ ⋅1( t > 21 )
ii) Далі ми використовуємо накопичувальну небезпеку для отримання небезпеки, . Формула цього:год ( т )
h ( t ) = 1 - експ( Н( т ) - Н( t + 1 ) )
Підключення до нашої сукупної небезпеки та спрощення:
годТ'( t ) = 1 -П( t + 1 , λ )П( t , λ )досвід( - а ⋅1( t = 7 )- b ⋅1( t = 14 )- ∞ ⋅1( t = 21 ))
iii) Нарешті, писати ймовірність журналу для моделей виживання (без цензури) дуже просто, коли ми маємо небезпеку та накопичувальну небезпеку:
l l ( λ , a , b|t ) =∑i = 1N( журналгод (тi) - Н(тi) )
І ось воно!
Існують зв'язки, що з'єднують наші точкові коефіцієнти небезпеки та ймовірності тривалості страхування: .a = - журнал( 1 -pа) , b = - лог( 1 -pа-pб) - журнал( 1 -pа) ,pc= 1 - (pа+pб)
Доказ - у пудингу. Давайте зробимо кілька моделювання та висновку, використовуючи власну семантику моделі lifeline .
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
"""
¹ розділ 1.2 тут