이 경우 생존 분석 모자를 쓰면 해결 방법이 존재한다고 생각합니다. 이 모델에는 검열 대상이 없지만 (전통적인 의미에서) 생존 분석을 사용하여 대상의 위험에 대해 이야기 할 수 있습니다.
i) 누적 위험, ii) 위험, iii) 로그 우도의 순서로 세 가지를 모델링해야합니다.
i) 단계 i)를 단계적으로 수행합니다. 푸 아송 랜덤 변수 의 누적 위험도 는 무엇입니까 ? 불연속 분포의 경우이를 정의하는 두 가지 방법 ¹이 있지만 정의를 사용합니다 . 따라서 의 누적 위험 은H( t )H( t ) = − 로그에스( t )티∼ Po 나는 ( λ )
H티( t ) = − 로그( 1 − Q ( t , λ ) ) =−로그피( t , λ )
여기서 는 각각 상부 정규화 된 감마 함수입니다.Q , P
이제 우리는 보험 소진의 "위험"을 추가하고 싶습니다. 누적 위험에 대한 좋은 점은 부가 적이라는 것입니다. 따라서 7, 14, 21시에 "위험"을 추가하면됩니다.
H티'( t ) = − 로그피( t , λ ) +a⋅1( t > 7 )+ b ⋅1( t > 14 )+ c ⋅1( t > 21 )
경험적으로, 환자는 배경 "포아송"위험에 노출 된 다음 7, 14 및 21에 점별 위험이 따릅니다. (이는 누적 위험 이므로 이러한 점별 위험을 누적 하므로 .) 및 가 무엇인지 모르지만 나중에 보험 부족 가능성에 연결합니다.>a , b씨
실제로, 우리 는 21이 상한 임을 알고 그 이후에 모든 환자가 제거되므로 를 무한대로 설정할 수 있습니다.씨
H티'( t ) = − 로그피( t , λ ) +a⋅1( t > 7 )+ b ⋅1( t > 14 )+ ∞ ⋅1( t > 21 )
ii) 다음으로 누적 위험을 사용하여 위험을 얻습니다 . . 이에 대한 공식은 다음과 같습니다.h ( 톤 )
h ( t ) = 1 - exp( H( t ) - H( t + 1 ) )
누적 위험을 막고 단순화 :
h티'( t ) = 1 −피( t + 1 , λ )피( t , λ )특급( − a ⋅1( t = 7 )− b ⋅1( t = 14 )− ∞ ⋅1( t = 21 ))
iii) 마지막으로, 위험과 누적 위험이 있으면 생존 모델에 대한 로그 우도를 작성하는 것이 (검열없이) 매우 쉽습니다.
l l ( λ , a , b|t ) =∑나는 = 1엔( 로그h (티나는) − H(티나는) )
그리고 거기 있습니다!
우리의 포인트 별 위험 계수와 보험 기간의 확률을 연결하는 관계가 있습니다 : .a = − 로그( 1 −피ㅏ) , b = −log( 1 −피ㅏ−피비)−log(1−pa),pc=1−(pa+pb)
증거는 푸딩에 있습니다. 라이프 라인의 커스텀 모델 시맨틱을 사용하여 시뮬레이션과 추론을 해봅 시다 .
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 단원을 참조 하십시오