Trong trường hợp này, tôi tin rằng một con đường dẫn đến một giải pháp tồn tại nếu chúng ta đội chiếc mũ phân tích sinh tồn. Lưu ý rằng mặc dù mô hình này không có đối tượng kiểm duyệt (theo nghĩa truyền thống), chúng ta vẫn có thể sử dụng phân tích sinh tồn và nói về mối nguy hiểm của các đối tượng.
Chúng ta cần mô hình hóa ba điều theo thứ tự này: i) nguy cơ tích lũy, ii) nguy cơ, iii) khả năng đăng nhập.
i) Chúng tôi sẽ thực hiện phần i) theo các bước. Nguy cơ tích lũy, của biến ngẫu nhiên Poisson là gì? Đối với phân phối rời rạc, có hai cách để xác định nó¹, nhưng chúng tôi sẽ sử dụng định nghĩa . Vì vậy, nguy cơ tích lũy cho làH( t )H( t ) = - nhật kýS( t )T~ Po tôi ( λ )
HT( t ) = - nhật ký( 1 - Q ( t , λ ) ) =-logP( t , λ )
Trong đó là hàm gamma chính quy trên, dưới tương ứng.Q , P
Bây giờ chúng tôi muốn thêm "mối nguy" của bảo hiểm sắp hết. Điều hay ho về các mối nguy tích lũy là chúng là phụ gia, vì vậy chúng ta chỉ cần thêm "rủi ro" vào các thời điểm 7, 14, 21:
HT′(t)=−logP(t,λ)+a⋅1(t>7)+b⋅1(t>14)+c⋅1(t>21)
>a,bc
c
HT′(t)=−logP(t,λ)+a⋅1(t>7)+b⋅1(t>14)+∞⋅1(t>21)
h(t)
h(t)=1−exp(H(t)−H(t+1))
Cắm vào mối nguy tích lũy của chúng tôi và đơn giản hóa:
hT′(t)=1−P(t+1,λ)P(t,λ)exp(−a⋅1(t=7)−b⋅1(t=14)−∞⋅1(t=21))
iii) Cuối cùng, viết khả năng ghi nhật ký cho các mô hình sống sót (không kiểm duyệt) là cực kỳ dễ dàng một khi chúng ta có nguy cơ và rủi ro tích lũy:
ll(λ,a,b|t)=∑i=1N(logh(ti)−H(ti))
Và nó đây rồi!
a=−log(1−pa),b=−log(1−pa−pb)−log(1−pa),pc=1−(pa+pb)
Bằng chứng là trong pudding. Chúng ta hãy làm một số mô phỏng và suy luận sử dụng dây an toàn ngữ nghĩa mô hình tùy chỉnh.
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
"""
Xem Phần 1.2 tại đây