[PYTHON] Die Theorie, dass der Schlüssel zur Kontrolle der Infektion des neuen Coronavirus die Hyperdispersion der Anfälligkeit ist.

Einführung

Das SEIR-Modell oder SIR-Modell wird häufig zur Vorhersage und Analyse der Ausbreitung der neuen Coronavirus-Infektion (COVID-19) verwendet, basiert jedoch kürzlich auf dem skalierungsfreien Netzwerk [Artikel von GM Szabo](https: // arxiv. org / pdf / 2004.00067.pdf) und Paper von Y. Ohsawa wurden veröffentlicht und ziehen die Aufmerksamkeit auf sich. Einfach ausgedrückt ist ein skalierungsfreies Netzwerk, wie in der folgenden Abbildung gezeigt, "einige Scheitelpunkte sind durch Kanten mit vielen anderen Scheitelpunkten verbunden und haben eine große Ordnung, während die meisten anderen einige Scheitelpunkte haben. Die Eigenschaft, mit der es nur verbunden ist, und die Reihenfolge sind klein "(Komplexes Netzwerk Es handelt sich um eine Netzwerkstruktur mit E3% 83% 83% E3% 83% 88% E3% 83% AF% E3% 83% BC% E3% 82% AF)), aber diese Eigenschaft wurde in der Umfrage der Clustergruppe gefunden. ** Die Anzahl der Grundreproduktionen einer kleinen Anzahl von Personen ist groß, während die Anzahl der Grundreproduktionen der Mehrheit gering ist ** ([New Corona Cluster Countermeasure Expert (2)]](https: // together. Es ist com / li / 1492002)) sehr ähnlich und scheint eine hohe Affinität zu haben. scale-free-network.jpg (Zitiert aus Artikel von G. M. Szabo) In diesem Artikel, inspiriert von dieser Studie, ** Wie wirken sich einzelne basale Reproduktionszahlen auf die Gesamtausbreitung aus, wenn sie anhand einer breiten Verteilung bestimmt werden? Ich möchte ** auf das SEIR-Modell erweitern und es überprüfen.

Begriffsdefinitionen

Führen Sie eine Simulation basierend auf dem [SEIR-Modell] durch (https://qiita.com/oki_mebarun/items/60592c703dd4e8d1ff72). Definieren Sie zunächst Gruppen und Einzelpersonen.

Definieren Sie als nächstes eine stochastische Variable für das einzelne j.

Da es sich um eine Wahrscheinlichkeit handelt, erfüllt es natürlich Folgendes.

  1. \forall j, 0 \leq s_j, e_j, i_j, r_j \leq 1
  2. \forall j, s_j + e_j + i_j + r_j = 1

Definieren Sie als Nächstes die Variablen als Ganzes.

Zusätzlich werden die folgenden als Parameter eingeführt.

Grundreproduktionsnummer und Überdispersion

Die Grundreproduktionsnummer $ R_0 $ ist definiert als "die Anzahl der Sekundärinfektionen, die von einer infizierten Person (im Frühstadium der Infektion) während des Infektionszeitraums verursacht wurden". Der Grund für das Anfangsstadium der Infektion ist, dass der Wert aufgrund von Änderungen des SEIR-Verhältnisses im Laufe der Zeit schwankt. Wenn es von der Zeit abhängt, wird es als $ R_t $ geschrieben. Laut Umfrage der Gruppe für Cluster-Gegenmaßnahmen des Ministeriums für Gesundheit, Arbeit und Soziales wird die Anzahl der Grundreproduktionen wie in der folgenden Grafik dargestellt erfasst. クラスター対策班のR0_2.jpg

Der obige Parameter $ e_r $ zeigt in diesem Diagramm die Wahrscheinlichkeit, in einer schlecht belüfteten Umgebung zu sein. Wie aus dieser Grafik ersichtlich ist, ** ist die Grundreproduktionszahl einer kleinen Anzahl von Personen groß, während die Grundreproduktionszahl der Mehrheit der Personen klein ist **. Diese Verteilung der Grundreproduktionszahlen wird durch den folgenden Näherungscode realisiert.

def COVID19R0(er):
    if np.random.rand() < er:
        # good environment
        if np.random.rand() < 0.8:
            R0 = 0
        else:
            R0 = np.random.randint(1,4)*1.0
    else:
        # bad environment
        R0 = np.random.randint(0,12)*1.0
    return R0

Es ist auch zu beachten, dass ** die Anzahl der Grundreproduktionen per Definition sowohl in der Zeitdimension als auch in der Anzahl der infizierten Personen ** eine Bedeutung hat. Zum Beispiel

  1. Eine Person infizierte acht Tage lang täglich eine Person.
  2. Eine Person infizierte täglich acht Personen und entwickelte danach keine Sekundärinfektion.

In beiden Fällen ist $ R_0 = 8 $, aber 1 impliziert ** die Stärke der Infektiosität des Individuums **, und 2 ist eher ** Menschen sind 3 dicht usw. Man kann sagen, dass dies die Empfindlichkeit ** impliziert, in der Szene zu sein. Nun werden wir ein mathematisches Modell erstellen, um das SEIR-Modell basierend auf der Verteilung der Grundreproduktionszahl zu berechnen, aber die folgenden zwei Arten von Modellen berücksichtigen.

  1. Ein Modell, das eine Überdispersion der Infektiosität voraussetzt. ** Betrachten Sie die Überdispersion als einen Faktor seitens der betroffenen Person **.
  2. Ein Modell, das eine Hyperdispersion der Anfälligkeit voraussetzt. ** Betrachten Sie die Überdispersion als einen Faktor seitens des Empfängers **.

Mathematisches Modell 1 (Überdispersion der Infektiosität)

Ein Modell, das eine Überdispersion der Infektiosität voraussetzt, kann wie folgt geschrieben werden.

\begin{eqnarray}
\beta_j &=& \frac{R_{0j}}{ip N} \\
\frac{ds_j}{dt} &=& - s_j \cdot \sum_{k \neq j} \beta_k i_k \\
\frac{de_j}{dt} &=& -\frac{ds_j}{dt} - \frac{1}{lp} e_j \\
\frac{di_j}{dt} &=& \frac{1}{lp} e_j - \frac{1}{ip} i_j \\
\frac{dr_j}{dt} &=& \frac{1}{ip} i_j 
\end{eqnarray}

Besonders die zweite Zeile ist wichtig, aber wenn Sie diese Formel in Bezug auf $ j $ summieren,

\begin{eqnarray}
\frac{dS}{dt} &=& - S \cdot BI  + \sum_j s_j i_j \beta_j \\
\frac{dS}{dt} &=& \sum_j \frac{ds_j}{dt} \\
BI &=& \sum_k \beta_k i_k 
\end{eqnarray}

Es wird sein. Wenn $ \ forall k, \ beta_k = \ beta $,

\begin{eqnarray}
\frac{dS}{dt} &=& - \beta S \cdot I  + \sum_j s_j i_j \beta_j \\
I &=& \sum_j i_j \\
\end{eqnarray}

Daher unterscheidet sich nur der zweite Begriff vom normalen SEIR-Modell, aber dieser Begriff zeigt an, dass ** ich mich angesichts des Übergangs des SEIR-Modells nicht zu einer sekundär infizierten Person machen werde **. Es kann ignoriert werden, da gesagt werden kann, dass es fast $ s_j i_j = 0 $ ist. Mit anderen Worten, es ist ein Modell **, das zu einem normalen SEIR-Modell führt, wenn ** $ \ beta_j $ ausgeglichen wird.

Mathematisches Modell 2 (Hyperdispersion der Empfindlichkeit)

Ein Modell, das eine Überempfindlichkeit annimmt, kann wie folgt geschrieben werden.

\begin{eqnarray}
\beta_j &=& \frac{R_{0j}}{ip N} \\
\frac{ds_j}{dt} &=& - s_j \beta_j \cdot \sum_{k \neq j}  i_k \\
\frac{de_j}{dt} &=& -\frac{ds_j}{dt} - \frac{1}{lp} e_j \\
\frac{di_j}{dt} &=& \frac{1}{lp} e_j - \frac{1}{ip} i_j \\
\frac{dr_j}{dt} &=& \frac{1}{ip} i_j 
\end{eqnarray}

Wenn Sie sich auf die zweite Zeile konzentrieren, können Sie sehen, dass $ \ beta_k $ für das mathematische Modell 1 oben nach $ \ beta_j $ verschoben wurde. Nach wie vor ist dieses Modell auch ein Modell, das zu einem normalen SEIR-Modell führt, wenn ** $ \ beta_j $ homogenisiert ist **.

Versuchen Sie mit Python zu rechnen

Berechnen wir nun das mathematische Modell 1 und das mathematische Modell 2 mit Python. Erstens sind die Annahmen für die Berechnung wie folgt.

Betrachten Sie eine Gruppe von + $ N = 200 $.

Importieren Sie die Bibliothek.

import numpy as np
import matplotlib.pyplot as plt

Eine Funktion, die die Anzahl der Grundreproduktionen berechnet und eine Verteilung generiert. Dieses Mal habe ich $ er = 0,6 $ gewählt, sodass der Durchschnittswert bei $ E [R_0] = 2,5 $ liegt. Außerdem wird $ R_ {0j} $ in absteigender Reihenfolge nach $ j $ sortiert.

def COVID19R0(er):
    if np.random.rand() < er:
        # good environment
        if np.random.rand() < 0.8:
            R0 = 0
        else:
            R0 = np.random.randint(1,4)*1.0
    else:
        # bad environment
        R0 = np.random.randint(0,12)*1.0
    return R0

N  = 200
er = 0.6
R0 = np.array([COVID19R0(er) for i in range(N)])
R0 = np.sort(R0)[::-1]
plt.hist(R0,bins=10)
plt.title("Ro distribution with E[Ro]: {}".format(np.average(R0)))
plt.xlabel('R0')
plt.ylabel('num. of people')
plt.show()

Eine Funktion, die gewöhnliche Differentialgleichungen löst.

def my_odeint(deq, ini_state, tseq, keys):
    sim = None
    v = np.array(ini_state).astype(np.float64)
    dt = (tseq[1] - tseq[0])*1.0
    c = 0
    for t in tseq:
        dv = deq(v,t, keys)
        v = v + np.array(dv) * dt
        if sim is None:
            sim = v
        else:
            sim = np.vstack((sim, v))
        pg = 100.* t / tseq[-1]
        if pg >= c:
            c = c + 10
            print("progress: {}%".format(pg))
    return sim

Es ist eine Funktion zur Berechnung des mathematischen Modells 1.

#define differencial equation of seir model
def seir_eq10_1(v, t, keys):
    N  = keys['N']
    b  = keys['b']
    lp = keys['lp']
    ip = keys['ip']
    #
    ds = np.zeros(N)
    de = np.zeros(N)
    di = np.zeros(N)
    dr = np.zeros(N)
    #
    BI = np.sum([ b[k]*v[2][k] for k in range(N)])
    #
    for j in range(N):
        s  = v[0][j];
        e  = v[1][j];
        i  = v[2][j];
        r  = v[3][j];
        #
        ds[j] = - s * (BI - b[j]*i) #Nicht selbst infizieren
        de[j] = - ds[j] -  (1/lp) * e
        di[j] = (1/lp)*e - (1/ip) * i
        dr[j] = (1/ip)*i
    return [ds, de, di, dr]

Es ist eine Funktion zur Berechnung des mathematischen Modells 2.

#define differencial equation of seir model
def seir_eq10_2(v, t, keys):
    N  = keys['N']
    b  = keys['b']
    lp = keys['lp']
    ip = keys['ip']
    #
    ds = np.zeros(N)
    de = np.zeros(N)
    di = np.zeros(N)
    dr = np.zeros(N)
    #
    CI = np.sum([ v[2][k] for k in range(N)])
    #
    for j in range(N):
        s  = v[0][j];
        e  = v[1][j];
        i  = v[2][j];
        r  = v[3][j];
        #
        ds[j] = - s * b[j] * (CI - i) #Nicht selbst infizieren
        de[j] = - ds[j] -  (1/lp) * e
        di[j] = (1/lp)*e - (1/ip) * i
        dr[j] = (1/ip)*i
    return [ds, de, di, dr]

Dies ist eine Anzeigefunktion.

def showSim_01(n, sim, keys):
    N = keys['N']
    plt.rcParams["font.size"] = 12
    fig, ax = plt.subplots(figsize=(10,5))
    
    x = range(N)
    
    ax.plot(x,sim[n+0]) # extract S
    ax.plot(x,sim[n+1]) # extract E
    ax.plot(x,sim[n+2]) # extract I
    ax.plot(x,sim[n+3]) # extract R
    ax.grid(which='both')
    ax.legend([ 'Susceptible','Exposed', 'Infected', 'Recoverd'])
    ax.set_xlabel('person no.')
    ax.set_ylim(0,1)
    plt.show()

def showSim_02(t, sim, keys):
    N = keys['N']
    plt.rcParams["font.size"] = 12
    fig, ax = plt.subplots(figsize=(10,5))
    
    n = len(t)
    sdat = [np.average(sim[4*i+0]) for i in range(n)]
    edat = [np.average(sim[4*i+1]) for i in range(n)]
    idat = [np.average(sim[4*i+2]) for i in range(n)]
    rdat = [np.average(sim[4*i+3]) for i in range(n)]

    ax.plot(t,sdat) # extract S
    ax.plot(t,edat) # extract E
    ax.plot(t,idat) # extract I
    ax.plot(t,rdat) # extract R
    ax.grid(which='both')
    ax.legend([ 'Susceptible','Exposed', 'Infected', 'Recoverd'])
    ax.set_xlabel('date')
    ax.set_ylim(0,)
    plt.show()

Dies ist eine Funktion zur Simulation. Der Ausgangszustand ist für jeden Einzelnen einheitlich.

def calcsim( R0, keys):
    # solve seir model
    N = keys['N']
    #           S      E      I       R
    ini_state=[np.ones(N), np.zeros(N), np.zeros(N), np.zeros(N)]
    ini_state=[np.ones(N)*0.99, np.zeros(N), np.ones(N)*0.01, np.zeros(N)]
    t_max=180
    dt=0.01
    t=np.arange(0,t_max,dt)
    keys['b'] = R0/(N*keys['ip'])
    #
    sim = my_odeint(seir_eq10, ini_state, t, keys)
    #    
    return sim,t

Dies ist der Code zum Ausführen und Anzeigen des mathematischen Modells 1. Es ist sehr schwer (-_-;).

seir_eq10 = lambda v, t, keys: seir_eq10_1(v, t, keys)
keys = {'N':N, 'lp':5, 'ip':8, 'R0':2.5 }
sim,t = calcsim(R0, keys)
showSim_01(np.int(180/0.01*0.95), sim, keys)
showSim_02(t, sim, keys)

Dies ist der Code zum Ausführen und Anzeigen des mathematischen Modells 2.

seir_eq10 = lambda v, t, keys: seir_eq10_2(v, t, keys)
keys = {'N':N, 'lp':5, 'ip':8, 'R0':2.5 }
sim,t = calcsim(R0, keys)
showSim_01(np.int(180/0.01*0.95), sim, keys)
showSim_02(t, sim, keys)

Simulationsergebnis

Werfen wir einen Blick auf die Berechnungsergebnisse.

Verteilung der Grundreproduktionsnummern

Die Verteilung der Grundreproduktionszahlen ist wie folgt. Die durchschnittliche Anzahl der Grundreproduktionen betrug $ E [R_0] = 2,49 $. m10_R0dist.jpg

Mathematisches Modell 1 (Überdispersion der Infektiosität)

Erstens ist im mathematischen Modell 1 die horizontale Achse für jedes Individuum und die vertikale Achse für jede Wahrscheinlichkeit von (s, e, i, r) nach Ablauf von 95% der Zeit. case1_m10_1_N_200_at17100.jpg

Wie, ** Es gibt fast keinen individuellen Unterschied aufgrund einer Überdispersion der Infektiosität! ** Das Ergebnis ist. Als nächstes betrachten wir den Übergang von SEIR als Gruppe wie ein normales SEIR-Modell. case1_m10_2_N_200.jpg

Schließlich werden ungefähr 90% infiziert, was zur Beendigung durch Massenimmunität führt.

Mathematisches Modell 2 (Hyperdispersion der Empfindlichkeit)

Als nächstes gilt im mathematischen Modell 2 die horizontale Achse für jedes Individuum und die vertikale Achse für jede Wahrscheinlichkeit von (s, e, i, r) nach Ablauf von 95% der Zeit. case2_m10_1_N_200_at17100.jpg Sehr unterschiedlich zum vorherigen Ergebnis ** ist der Einfluss der individuellen R0-Verteilung sehr stark! ** Das Ergebnis ist. Personen mit größerem $ R_0 $ sind tendenziell anfälliger für Infektionen, und Personen mit kleinerem $ R_0 $ sind tendenziell weniger anfällig für Infektionen. Als nächstes betrachten wir den Übergang von SEIR als Gruppe. case2_m10_2_N_200.jpg

Irgendwann ** werden ungefähr 37% infiziert und durch Massenimmunität beendet !! **. Da das vom mathematischen Modell 1 berechnete Ergebnis 90% beträgt **, wurde die Anzahl der infizierten Personen um 59% unterdrückt **.

Erwägung

Aus dem Obigen können die folgenden Trends aus der Simulation bezüglich der Berechnung durch das SEIR-Modell unter Berücksichtigung der Überdispersion der Grundreproduktionszahl abgeleitet werden.

Außerdem ...

initial-distribution.jpg (Zitiert aus Artikel von G. M. Szabo)

Referenzlink

Ich habe auf die folgende Seite verwiesen.

  1. [Komplexes Netzwerk](https://ja.wikipedia.org/wiki/%E8%A4%87%E9%9B%91%E3%83%8D%E3%83%83%E3%83%88% E3% 83% AF% E3% 83% BC% E3% 82% AF)
  2. Propagation and mitigation of epidemics in ascale-free network
  3. COVID-19 Should be Suppressed by Mixed Constraints -- from Simulations on Constrained Scale-Free Networks
  4. Schätzen Sie die maximale Infektiosität des neuen Corona-Virus
  5. Die Koronaturbulenzen können aufgrund falsch positiver Ergebnisse im PCR-Test nicht für immer enden
  6. Neuer Corona Cluster Countermeasure Expert (2)
  7. "Definition von Begriffen für neue Corona-Cluster-Gegenmaßnahmen", berichtet von Spezialisten für neue Corona-Cluster-Gegenmaßnahmen

Recommended Posts

Die Theorie, dass der Schlüssel zur Kontrolle der Infektion des neuen Coronavirus die Hyperdispersion der Anfälligkeit ist.
Die Geschichte, den privaten Schlüssel mit chmod auf 600 zu setzen
Ich habe versucht, das Verhalten des neuen Koronavirus mit dem SEIR-Modell vorherzusagen.
Ich habe versucht, die Literatur des neuen Corona-Virus mit Python automatisch an LINE zu senden
Ich habe versucht, die Eigenschaften der neuen Informationen über mit dem Corona-Virus infizierte Personen mit Wordcloud zu visualisieren
Quantifizieren Sie den Grad der Selbstbeherrschung, der erforderlich ist, um das neue Koronavirus einzudämmen
Zeichnen Sie die Ausbreitung des neuen Koronavirus
So überprüfen Sie, ob sich der angegebene Schlüssel im angegebenen Bucket in Boto 3 befindet
So stellen Sie fest, dass in Python3 ein Kreuzschlüssel eingegeben wurde
Erstellen Sie einen Bot, der die Anzahl der Personen, die für das neue Corona-Virus in Tokio positiv sind, an Slack sendet
Hat die Anzahl der Ladenschließungen aufgrund des Einflusses des neuen Koronavirus zugenommen?
Ich habe versucht, die Standardrolle neuer Mitarbeiter mit Python zu optimieren
[Einführung in Python] Wie wird mit der continue-Anweisung wiederholt?
Folding @ Home unter Linux Mint soll zur Analyse des neuen Corona-Virus beitragen
Schätzen Sie die maximale Infektiosität des neuen Coronavirus ab
Python> set> Mit set () konvertieren> Wörterbuch wird nur Schlüssel> Ich habe gelernt, wie man die Werte des Wörterbuchs in set / dir ({}) / help ({}) / help ({}) konvertiert .Werte)
Simulieren wir den Übergang der Infektionsrate in Bezug auf die Bevölkerungsdichte mit Python
Hackasons Erfahrung, dass es am wichtigsten ist, die Gefühle des Veranstalters zu verstehen
Ich habe versucht, den Grad der Koronavirusinfektion auf der Seekarten-Wärmekarte anzuzeigen
Eine neue Form der App, die mit GitHub funktioniert: So erstellen Sie GitHub-Apps
Die Basis der Graphentheorie mit Matplotlib-Animation
GUI-Simulation des neuen Koronavirus (SEIR-Modell)
Überprüfen Sie die Wirkung des Urlaubs als Gegenmaßnahme gegen das neue Koronavirus mit dem SEIR-Modell
Hier ist eine, ich werde die mit "künstlicher Intelligenz" ausgestatteten Anwendungen zusammenfassen, an denen ich interessiert war
Da die Aktie aufgrund des Einflusses des neuen Corona-Virus eingebrochen ist, habe ich versucht, die Performance meines Investment Trusts mit Python zu visualisieren.
Fügen Sie mit Matplotlib Informationen am unteren Rand der Abbildung hinzu
Versuchen Sie, den Inhalt von Word mit Golang zu erhalten
Lassen Sie uns die medizinische Kollapshypothese des neuen Koronavirus testen
Skript zum Ändern der Klanglänge mit REAPER
Verwenden Sie Hash, um das Kollisionsurteil von etwa 1000 Bällen in Python zu erleichtern (im Zusammenhang mit dem neuen Corona-Virus).
Das Geräusch von Mr. Tick am Arbeitsplatz ist ... Ich habe es mit dem Code geschafft
Wenn sich eine Zeichenfolge einer bestimmten Reihe im Schlüssel des Wörterbuchs befindet, wird die Zeichenfolge in den Wert des Wörterbuchs konvertiert.
Ich habe versucht, die Infektion mit einer neuen Lungenentzündung mithilfe des SIR-Modells vorherzusagen: ☓ Wuhan ed. ○ Hubei ed.
Eine einfache Version der Regierungsstatistik (Einwanderungskontrolle), die mit Jupyter einfach zu handhaben ist
Versuchen Sie, die Nährstoffe von Cornflakes zu visualisieren, die M-1-Champion Milkboy mit Python sagte
[VLC] Wie man mit dem Problem umgeht, dass es während der Wiedergabe nicht im Vordergrund steht
[Python] Der Status jeder Präfektur des neuen Koronavirus wird nur als PDF veröffentlicht, aber ich habe versucht, ihn zu kratzen, ohne ihn herunterzuladen.
Wenn die Menschen in Tokio ernsthaft an dem neuen Koronavirus erkranken, können sie in ein Krankenhaus in der Präfektur Kagoshima gebracht werden.
Ich möchte ausgeben, während der Wert des Typs (z. B. datetime) konvertiert wird, der bei der Ausgabe von json mit Python nicht unterstützt wird