Le modèle SEIR ou modèle SIR est souvent utilisé pour prédire et analyser la propagation d'une nouvelle infection à coronavirus (COVID-19), mais récemment basé sur un réseau sans échelle [article de GM Szabo](https: // arxiv. org / pdf / 2004.00067.pdf) et Article de Y. Ohsawa ont été publiés et attirent l'attention. En termes simples, un réseau sans échelle est, comme le montre la figure ci-dessous, «Certains sommets sont connectés à de nombreux autres sommets par des arêtes et ont un ordre important, tandis que la plupart des autres ont quelques sommets. La propriété à laquelle il est uniquement connecté et la commande est petite "([Complex network](https://ja.wikipedia.org/wiki/%E8%A4%87%E9%9B%91%E3%83%8D%" Il s'agit d'une structure de réseau avec E3% 83% 83% E3% 83% 88% E3% 83% AF% E3% 83% BC% E3% 82% AF)), mais cette propriété a été trouvée dans l'enquête du groupe de cluster. ** Le nombre de reproductions de base d'un petit nombre de personnes est grand, tandis que le nombre de reproductions de base de la majorité est petit ** ([New Corona Cluster Countermeasure Expert (2)]](https: // ensemble. Il est très similaire à com / li / 1492002)) et semble avoir une grande affinité. (Extrait de Article de G.M. Szabo) Ainsi, dans cet article, inspiré de cette étude, ** Comment les nombres de reproduction basale individuels affectent-ils la propagation globale lorsqu'ils sont déterminés selon une large distribution? Je voudrais étendre ** au modèle SEIR et le vérifier.
Effectuez une simulation basée sur le modèle SEIR. Tout d'abord, définissez les groupes et les individus.
Ensuite, définissez une variable stochastique pour l'individu j.
Puisqu'il s'agit d'une probabilité, elle satisfait naturellement ce qui suit.
Ensuite, définissez les variables dans leur ensemble.
De plus, les éléments suivants sont introduits en tant que paramètres.
Le nombre de reproduction de base $ R_0 $ est défini comme "le nombre d'infections secondaires produites par une personne infectée (au stade précoce de l'infection) pendant la période d'infection". La raison du stade initial de l'infection est que la valeur fluctue en raison des changements du rapport SEIR au fil du temps. Si cela dépend du temps, il s'écrit $ R_t $. Selon Survey of Cluster Countermeasures Group of Ministry of Health, Labour and Welfare, le nombre de reproductions de base est échantillonné comme indiqué dans le graphique suivant.
Le paramètre $ e_r $ ci-dessus montre la probabilité d'être dans un environnement mal ventilé sur ce graphique. Comme le montre ce graphique, nous pouvons voir la propriété que ** le nombre de reproductions de base d'un petit nombre de personnes est grand, tandis que le nombre de reproductions de base de la majorité des gens est petit **. Cette distribution des nombres de reproduction de base est réalisée par le code d'approximation suivant.
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
Il convient également de noter que ** le nombre de reproductions de base a un sens à la fois dans la dimension temporelle et dans le nombre de personnes infectées ** par définition. Par exemple
Dans les deux cas, $ R_0 = 8 $, mais 1 implique ** la force de l'infectivité de l'individu **, et 2 est plutôt ** les gens sont 3 denses, etc. On peut dire que cela implique la sensibilité ** d'être dans la scène. Maintenant, mettons en place un modèle mathématique qui calcule le modèle SEIR basé sur la distribution des nombres de reproduction de base. Considérons les deux types de modèles suivants.
Un modèle qui suppose une surdispersion de l'infectiosité peut s'écrire comme suit.
\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}
Surtout la deuxième ligne est importante, mais si vous additionnez cette formule par rapport à $ j $,
\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}
Ce sera. Si $ \ 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}
Par conséquent, seul le deuxième terme est différent du modèle SEIR normal, mais ce terme indique que ** je ne ferai pas de moi-même une personne infectée secondaire **, compte tenu de la transition du modèle SEIR. On peut l'ignorer car on peut dire que c'est presque $ s_j i_j = 0 $. En d'autres termes, c'est un modèle ** qui aboutit à un modèle SEIR normal lorsque ** $ \ beta_j $ est homogénéisé.
Un modèle qui suppose une hypersensibilité peut être écrit comme suit.
\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}
En vous concentrant sur la deuxième ligne, vous pouvez voir que $ \ beta_k $ est passé à $ \ beta_j $ pour le modèle mathématique 1 ci-dessus. Comme précédemment, ce modèle est un modèle qui aboutit à un modèle SEIR normal lorsque ** $ \ beta_j $ est égalisé **.
Maintenant, calculons le modèle mathématique 1 et le modèle mathématique 2 en utilisant Python. Premièrement, les hypothèses pour le calcul sont les suivantes.
Considérons un groupe de + $ N = 200 $.
Importez la bibliothèque.
import numpy as np
import matplotlib.pyplot as plt
Une fonction qui calcule le nombre de reproductions de base et génère une distribution. Cette fois, j'ai choisi $ er = 0,6 $ pour que la valeur moyenne soit autour de $ E [R_0] = 2,5 $. De plus, $ R_ {0j} $ est trié par ordre décroissant pour $ j $.
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()
Une fonction qui résout les équations différentielles ordinaires.
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
C'est une fonction de calcul du modèle mathématique 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) #Ne vous auto-infectez pas
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]
C'est une fonction de calcul du modèle mathématique 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) #Ne vous auto-infectez pas
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]
Ceci est une fonction d'affichage.
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()
C'est une fonction de simulation. L'état initial est uniforme pour chaque individu.
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
C'est le code pour exécuter et afficher le modèle mathématique 1. C'est très lourd (-_-;).
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)
C'est le code pour exécuter et afficher le modèle mathématique 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)
Jetons un coup d'œil aux résultats du calcul.
La distribution des nombres de reproduction de base est la suivante. Le nombre moyen de reproductions de base était de $ E [R_0] = 2,49 $.
Premièrement, dans le modèle mathématique 1, l'axe horizontal est pour chaque individu et l'axe vertical est pour chaque probabilité de (s, e, i, r) après 95% du temps.
Comment, ** Il n'y a presque aucune différence individuelle due à la surdispersion de l'infectiosité! ** Le résultat est. Ensuite, regardons la transition de SEIR en tant que groupe comme un modèle SEIR normal.
Finalement, environ 90% seront infectés, entraînant une terminaison par immunité de masse.
Ensuite, dans le modèle mathématique 2, l'axe horizontal est pour chaque individu et l'axe vertical est pour chaque probabilité de (s, e, i, r) après 95% du temps. Très différent du résultat précédent **, l'influence de la distribution individuelle R0 est très forte! ** Le résultat est. Les individus avec un $ R_0 $ plus grand ont tendance à être plus sensibles à l'infection, et les individus avec un $ R_0 $ plus petit ont tendance à être moins sensibles à l'infection. Ensuite, regardons la transition de SEIR en tant que groupe.
Finalement, ** environ 37% seront infectés et seront terminés par l'immunité de masse !! **. Le résultat calculé par le modèle mathématique 1 étant de 90% **, le nombre de personnes infectées a été supprimé de 59% **.
De ce qui précède, les tendances suivantes peuvent être dérivées de la simulation concernant le calcul par le modèle SEIR en considérant la surdispersion du nombre de reproduction de base.
(Extrait de Article de G.M. Szabo)
Je me suis référé à la page suivante.
Recommended Posts