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. (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.
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.
Definieren Sie als Nächstes die Variablen als Ganzes.
Zusätzlich werden die folgenden als Parameter eingeführt.
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.
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
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.
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.
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 **.
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)
Werfen wir einen Blick auf die Berechnungsergebnisse.
Die Verteilung der Grundreproduktionszahlen ist wie folgt. Die durchschnittliche Anzahl der Grundreproduktionen betrug $ E [R_0] = 2,49 $.
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.
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.
Schließlich werden ungefähr 90% infiziert, was zur Beendigung durch Massenimmunität führt.
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. 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.
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 **.
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.
(Zitiert aus Artikel von G. M. Szabo)
Ich habe auf die folgende Seite verwiesen.
Recommended Posts