Quelle est la probabilité de ce processus?

10

Un patient est admis à l'hôpital. Leur durée de séjour dépend de deux choses: la gravité de leur blessure et le montant que leur assurance est prête à payer pour les garder à l'hôpital. Certains patients partiront prématurément si leur assurance décide de ne plus payer leur séjour.

Supposons ce qui suit:

1) La durée de séjour est répartie en poisson (supposez simplement ceci pour l'instant, cela peut ou non être une hypothèse réaliste) avec le paramètre .λ

2) Divers plans d'assurance couvrent les séjours de 7, 14 et 21 jours. De nombreux patients partiront après 7, 14 ou 21 jours de séjour (car leur assurance est épuisée et ils doivent partir).

Si je devais obtenir des données de ce processus, cela pourrait ressembler à ceci:

entrez la description de l'image ici

Comme vous pouvez le voir, il y a des pointes aux 7, 14 et 21 jours. Ce sont des patients qui partent à la fin de leur assurance.

De toute évidence, les données peuvent être modélisées comme un mélange. J'ai du mal à écrire la probabilité de cette distribution. C'est comme un poisson gonflé à zéro, mais l'inflation est à 7, 14 et 21.

Quelle est la probabilité de ces données? Quel est le processus de réflexion derrière la probabilité?

Demetri Pananos
la source
Pour commencer, vous devez connaître les probabilités de départs forcés de 7, 14 et 21 jours.
BruceET
1
Pour moi, cela ressemble à un mélange d'un Poisson et de trois distributions de Poisson tronquées à droite (à 7, 14 et 21). Les noter est une autre étape.
Carsten
@BruceET Je vais faire une inférence bayésienne sur ce modèle, je voudrais donc l'écrire dans le cas le plus général.
Demetri Pananos

Réponses:

9

Dans ce cas, je crois qu'un chemin vers une solution existe si nous mettons notre chapeau d'analyse de survie. Notez que même si ce modèle n'a pas de sujets censurés (au sens traditionnel), nous pouvons toujours utiliser l'analyse de survie et parler des dangers des sujets.

Nous devons modéliser trois choses dans cet ordre: i) le risque cumulatif, ii) le danger, iii) la probabilité logarithmique.

H(t)H(t)=-JournalS(t)TPoje(λ)

HT(t)=-Journal(1-Q(t,λ))=-JournalP(t,λ)

Q,P

Maintenant, nous voulons ajouter les "risques" de l'assurance qui s'épuise. La bonne chose à propos des dangers cumulatifs est qu'ils sont additifs, nous devons donc simplement ajouter des "risques" aux moments 7, 14, 21:

HT(t)=-JournalP(t,λ)+une1(t>7)+b1(t>14)+c1(t>21)

>une,bc

c

HT(t)=-JournalP(t,λ)+une1(t>7)+b1(t>14)+1(t>21)

h(t)

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

Brancher notre risque cumulatif et simplifier:

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

iii) Enfin, écrire le log vraisemblance pour les modèles de survie (sans censure) est super facile une fois que nous avons le danger et le risque cumulatif:

ll(λ,une,b|t)=je=1N(Journalh(tje)-H(tje))

Et voilà!

une=-Journal(1-pune),b=-Journal(1-pune-pb)-Journal(1-pune),pc=1-(pune+pb)


La preuve est dans le pudding. Faisons quelques simulations et inférences en utilisant la sémantique du modèle personnalisé des lignes de vie .

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

¹ voir la section 1.2 ici

Cam.Davidson.Pilon
la source