Bagaimana kemungkinan proses ini?

10

Seorang pasien dirawat di rumah sakit. Lama tinggal mereka tergantung pada 2 hal: Tingkat keparahan cedera mereka, dan seberapa besar asuransi mereka bersedia membayar untuk menjaga mereka di rumah sakit. Beberapa pasien akan pergi sebelum waktunya jika asuransi mereka memutuskan untuk berhenti membayar untuk masa inap mereka.

Asumsikan yang berikut:

1) Lamanya tinggal didistribusikan poisson (anggap saja ini untuk saat ini, itu mungkin atau mungkin bukan asumsi yang realistis) dengan parameter .λ

2) Berbagai paket asuransi mencakup masa inap 7, 14, dan 21 hari. Banyak pasien akan pergi setelah 7,14, atau 21 hari menginap (karena asuransi mereka habis dan mereka harus pergi).

Jika saya memperoleh data dari proses ini, itu mungkin terlihat sebagai berikut:

masukkan deskripsi gambar di sini

Seperti yang Anda lihat, ada paku di tanda 7, 14, dan 21 hari. Ini adalah pasien yang pergi ketika asuransi mereka berakhir.

Jelas, data dapat dimodelkan sebagai campuran. Saya mengalami kesulitan menuliskan kemungkinan untuk distribusi ini. Ini seperti poisson inflasi nol, tetapi inflasi berada pada 7, 14, dan 21.

Apa kemungkinan data ini? Apa proses pemikiran di balik kemungkinan itu?

Pisang Demetri
sumber
Untuk memulai, Anda harus mengetahui probabilitas 7, 14, dan 21 hari waktu cuti paksa.
BruceET
1
Bagi saya ini terdengar seperti campuran Poisson dan tiga distribusi Poisson kanan-terpotong (pada 7, 14 dan 21). Menuliskannya adalah langkah lain sekaligus.
Carsten
@BruceET Saya akan melakukan inferensi Bayesian pada model ini, jadi saya ingin menuliskannya dalam kasus yang paling umum.
Demetri Pananos

Jawaban:

9

Dalam hal ini, saya percaya jalan menuju solusi ada jika kita memakai topi analisis kelangsungan hidup kita. Perhatikan bahwa meskipun model ini tidak memiliki subjek yang disensor (dalam pengertian tradisional), kita masih dapat menggunakan analisis bertahan hidup dan berbicara tentang bahaya subjek.

Kita perlu memodelkan tiga hal dalam urutan ini: i) bahaya kumulatif, ii) bahaya, iii) kemungkinan log.

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

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

Q,P

Sekarang kami ingin menambahkan "bahaya" dari asuransi yang habis. Hal yang menyenangkan tentang bahaya kumulatif adalah bahwa zat tersebut bersifat aditif, jadi kita hanya perlu menambahkan "risiko" pada waktu 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))

Memasukkan bahaya kumulatif kami, dan menyederhanakan:

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

iii) Akhirnya, menulis kemungkinan log untuk model bertahan hidup (tanpa menyensor) sangat mudah setelah kita memiliki bahaya dan bahaya kumulatif:

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

Dan itu dia!

a=log(1pa),b=log(1papb)log(1pa),pc=1(pa+pb)


Buktinya ada di puding. Mari kita lakukan beberapa simulasi dan inferensi dengan menggunakan semantik model khusus jalur kehidupan .

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
"""

¹ lihat Bagian 1.2 di sini

Cam.Davidson.Pilon
sumber