Schätzung der maximalen Wahrscheinlichkeit von Infektionsmodellparametern

7

Ich verwende das Standardinfektionsmodell für einige Daten, mit denen ich arbeite.

dS=βSI

dI=βSIγI

dR=γI

Wobei die Anzahl der anfälligen Probanden ist, die Infizierten und die Wiederhergestellten. Ich versuche verschiedene Methoden zur Schätzung der Parameter und .SIRβγ


Für jeden diskreten Zeitraum mit fester Breite kenne ich die Anzahl der Infizierten und die festgelegte Gesamtbevölkerung. Eine der Methoden, die ich zum Schätzen der Parameter verwendet habe, besteht darin, den Anfangszustand in einen Differentialgleichungslöser in R einzuspeisen und mehrere Werte für und durchlaufen, bis sie den mittleren quadratischen Fehler minimiert haben.βγ

Mir wurde gesagt, dass es möglich ist, eine Maximum-Likelihood-Schätzung der Parameter vorzunehmen, aber ich weiß nicht, wie ich damit anfangen soll.


Eine Idee, die mir vorgestellt wurde, bestand darin, eine Normalkurve zu verwenden und die Parameter der Verteilung unter Verwendung der bekannten Maximum-Likelihood-Schätzungen für die Parameter der Normalverteilungen zu schätzen. Mein Problem dabei ist, dass ich es mit der Anzahl der Infizierten (oder sogar dem Anteil der Infizierten) in einer Population zu tun habe, nicht mit irgendetwas, das den notwendigen Annahmen einer Wahrscheinlichkeitsverteilung folgt.

Wenn ich dies tun würde, müsste ich einen anderen Parameter einführen, um die normale Kurve nach oben in Richtung meiner Daten zu verschieben. Damit meine ich, wenn die Normalverteilung ist, würde ich einen anderen Parameter benötigen, so dassf(t;μ,σ)k>1

Itkf(t;μ,σ)

Dabei ist die Anzahl der Infizierten (oder der Anteil spielt keine Rolle) zum Zeitpunkt .Itt

Wenn ich diese Methode anwenden würde, würde ich wahrscheinlich die Parameter und schätzen durch:βγ

  1. Verwenden Sie die Maximum-Likelihood-Schätzung der normalen (ish) Kurve mit der obigen Methode.
  2. Verwenden Sie die Schätzung der kleinsten Quadrate wie in dieser Frage , um das Infektionsmodell anstelle der tatsächlichen Daten an die normale Kurve anzupassen.

Ich bin mir nicht sicher, was ich sonst tun soll, daher schätze ich jeden Einblick, den Sie gewähren können, sehr.

Poisson Fisch
quelle
Ich wollte übrigens ein Tag wie "Sir-Modell", "Kompartiment-Modell", "Infektions-Modell" oder "Epidemie-Modell", habe aber nicht den Ruf, es zu erstellen. Wenn einer von Ihnen seriöseren Mitwirkenden denjenigen hinzufügen könnte, den Sie für am besten halten, wäre das großartig.
Poisson Fish
Ich hatte gedacht, dass das SIR-Modell nur mit ODE oder PDE zusammenhängt. Es wird interessant sein zu sehen, wie man Differentialgleichungen mit Statistiken kombiniert.
Deep North
Es ist, aber die Schätzung der Parameter ist Statistik :)
Poisson Fish
3
Haben Sie auch diese , und erforschte das Paket {EpiModel}? Die Antwort auf die Frage interessiert mich sehr.
Antoni Parellada
@ Antoni Parellada, vielen Dank für den Hinweis.
Deep North

Antworten:

3

Hier ist eine Möglichkeit, bei der das Modell modifiziert wird (1), um explizit probabilistisch zu sein, und (2) um in diskreter Zeit zu erfolgen.

Der folgende Code erklärt das modifizierte Modell, simuliert es und verwendet dann MLE, um die Parameter wiederherzustellen (deren wahrer Wert in diesem Spielzeugbeispiel bekannt ist, da wir die Daten simuliert haben). Achtung: Meine Beta entspricht nicht genau Ihrer Beta - siehe "Geschichte" in den Kommentaren unten.

library(ggplot2)
library(reshape2)

## S(t) susceptible, I(t) infected, R(t) recovered at time t
## Probabilistic model in discrete time:
## S(t+1) = S(t) - DeltaS(t)
## I(t+1) = I(t) + DeltaS(t) - DeltaR(t)
## R(t+1) = R(t) + DeltaR(t)
## DeltaR(t) ~ Binomial(I(t), gamma) >= 0
## DeltaS(t) ~ Binomial(S(t), 1 - (1 - beta)^I(t)) >= 0
## Story: each infected has probability gamma of recovering during the period;
## before recoveries are realized, each susceptible interacts with each infected;
## each interaction leads to infection with probability beta;
## susceptible becomes infected if >= 1 of her interactions leads to infection

simulate <- function(T=100, S1=100, I1=10, R1=0, beta=0.005, gamma=0.10) {
    stopifnot(T > 0)
    stopifnot(beta >= 0 && beta <= 1)
    stopifnot(gamma >= 0 && gamma <= 1)
    total_pop <- S1 + I1 + R1
    df <- data.frame(t=seq_len(T))
    df[, c("S", "I", "R")] <- NA
    for(t in seq_len(T)) {
        if(t == 1) {
            df$S[t] <- S1
                df$I[t] <- I1
            df$R[t] <- R1
                next
            }
            DeltaS <- rbinom(n=1, size=df$S[t-1], prob=1 - (1-beta)^df$I[t-1])
            DeltaR <- rbinom(n=1, size=df$I[t-1], prob=gamma)
        df$S[t] <- df$S[t-1] - DeltaS
        df$I[t] <- df$I[t-1] + DeltaS - DeltaR
        df$R[t] <- df$R[t-1] + DeltaR
        stopifnot(df$S[t] + df$I[t] + df$R[t] == total_pop)  # Sanity check
    }
    return(df)
}

inverse_logit <- function(x) {
    p <- exp(x) / (1 + exp(x))  # Maps R to [0, 1]
    return(p)
}
curve(inverse_logit, -10, 10)  # Sanity check

loglik <- function(logit_beta_gamma, df) {
    stopifnot(length(logit_beta_gamma) == 2)
    beta <- inverse_logit(logit_beta_gamma[1])
    gamma <- inverse_logit(logit_beta_gamma[2])
    dS <- -diff(df$S)
        dR <- diff(df$R)
    n <- nrow(df)
    pr_dS <- 1 - (1-beta)^df$I[seq_len(n-1)]  # Careful, problematic if 1 or 0
        return(sum(dbinom(dS, size=df$S[seq_len(n-1)], prob=pr_dS, log=TRUE) +
               dbinom(dR, size=df$I[seq_len(n-1)], prob=gamma, log=TRUE)))
}

get_estimates <- function() {
    df <- simulate()
    mle <- optim(par=c(-4, 0), fn=loglik, control=list(fnscale=-1), df=df)
    beta_gamma_hat <- inverse_logit(mle$par)
    names(beta_gamma_hat) <- c("beta", "gamma")
    return(beta_gamma_hat)
}

set.seed(54321999)

df <- simulate()
df_melted <- melt(df, id.vars="t")
p <- (ggplot(df_melted, aes(x=t, y=value, color=variable)) +
      geom_line(size=1.1) + theme_bw() +
      xlab("time") +
      theme(legend.key=element_blank()) +
      theme(panel.border=element_blank()))
p

## Sampling distribution of beta_gamma_hat
estimates <- replicate(100, get_estimates())
df_estimates <- as.data.frame(t(estimates))
summary(df_estimates)  # Looks reasonable given true values of (0.005, 0.10)

Lassen Sie mich wissen, wenn etwas nicht selbsterklärend ist.

Haftungsausschluss: Ich habe das SIR-Modell nur einmal kurz in einer College-Klasse vor einigen Jahren studiert. Das Modell, das ich oben simuliere und schätze, ist nicht genau das klassische SIR-Modell mit Differentialgleichung, das Sie in Ihrer Frage angegeben haben. Außerdem habe ich heute ein bisschen Fieber, also überprüfe den Code auf Fehler!

Adrian
quelle
2

Diese Folien bieten einen guten ersten Start durch iterative Anpassungen der kleinsten Quadrate. Dies gilt jedoch nur für das SI-Modell.

Dieser Blog behandelt dieses Problem ausführlicher. Dies scheint Ihrem Ansatz ähnlich zu sein. Das Anpassen eines Gaußschen Kernels über nichtlineare kleinste Quadrate könnte ein guter Weg sein, um anfängliche Parameterschätzungen zu erhalten. Dann müssen Sie eine Art Beziehung zwischen den Gaußschen Kernelparametern und den Parametern in Ihrem Modell identifizieren.

Gumeo
quelle