此过程的可能性如何?


10

病人被送进医院。他们的住院时间取决于两件事:他们受伤的严重程度,以及他们愿意为住院而支付多少保险。如果某些患者的保险决定停止支付住宿费用,则某些患者会过早离开。

假设以下内容:

1)停留时间是泊松分布的(参数为λ,现在假设是暂时的,可能是现实的假设,也可能不是)。

2)各种保险计划涵盖7、14和21天的住宿时间。许多患者将在停留7,14或21天后离开(因为他们的保险用完了,必须离开)。

如果要从此过程中获取数据,它可能如下所示:

在此处输入图片说明

如您所见,在7、14和21天都有峰值。这些是在保险结束后离开的患者。

显然,可以将数据建模为混合模型。我很难记下这种分布的可能性。这就像零膨胀的泊松,但通货膨胀率分别为7、14和21。

此数据的可能性是多少?可能性背后的思考过程是什么?


首先,您需要知道7天,14天和21天强迫离开时间的概率。
BruceET

1
对我来说,这听起来像是泊松分布和三个截断的泊松分布(分别为7、14和21)的混合。将它们写下来是另外一个步骤。
卡斯滕

@BruceET我将在此模型上进行贝叶斯推理,因此我想在最一般的情况下将其写下来。
Demetri Pananos

Answers:


9

在这种情况下,我相信如果戴上生存分析帽,便会找到解决方案的途径。请注意,即使该模型没有被检查的对象(传统意义上),我们仍然可以使用生存分析并谈论对象的危害。

我们需要按此顺序对三件事建模:i)累积危害,ii)危害,iii)对数似然。

H(t)H(t)=logS(t)TPoi(λ)

HT(t)=log(1Q(t,λ))=logP(t,λ)

Q,P

现在,我们要添加即将用完的保险的“危害”。关于累积危害的好处是它们是可加的,因此我们只需要在时间7、14、21加上“风险”即可:

HT(t)=logP(t,λ)+a1(t>7)+b1(t>14)+c1(t>21)

>a,bc

c

HT(t)=logP(t,λ)+a1(t>7)+b1(t>14)+1(t>21)

h(t)

h(t)=1exp(H(t)H(t+1))

插入我们的累积危害并简化:

hT(t)=1P(t+1,λ)P(t,λ)exp(a1(t=7)b1(t=14)1(t=21))

iii)最后,一旦我们有了危害和累积危害,就可以很容易地为生存模型(无需审查)写对数可能性:

ll(λ,a,b|t)=i=1N(logh(ti)H(ti))

在那里!

a=log(1pa),b=log(1papb)log(1pa),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节

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.