[PYTHON] Expliquons la différence dans la façon dont le nouveau virus corona se propage entre le Japon et d'autres pays avec un modèle de contre-mesure en cluster

introduction

La nouvelle infection à coronavirus (COVID-19) se propage de la Chine vers l'Europe et les Amériques et est endémique. Au Japon également, au 27 mars, il y avait 1 254 personnes infectées au Japon, et le gouverneur de Tokyo demande également des restrictions sur les sorties de week-end à Tokyo. Cependant, par rapport aux pays du G7 où les soins médicaux semblent relativement bien développés, le nombre de personnes au Japon est faible, avec 85594 aux États-Unis, 80589 en Italie, 43938 en Allemagne, 9155 en France, 11658 au Royaume-Uni et 4043 au Canada. Cela se démarque. Dans cet article, comme hypothèse pour expliquer cette raison, nous avons examiné si elle pouvait être expliquée par ** un modèle mathématique axé sur les contre-mesures de cluster **. Le flux d'examen est constitué des problèmes du modèle conventionnel, de l'examen du nouveau modèle, de la simulation et de la considération.

Conclusion

Tout d'abord, de la conclusion,

  1. Si l'éclosion de grappes est laissée sans surveillance, le nombre total de personnes infectées augmentera de manière explosive. ** Il y a 113 grappes avec 10 reproductions initiales, 3493 grappes avec 20 reproductions initiales et 30 grappes avec 30 reproductions initiales. Produit 58 437 personnes infectées **.
  2. L'effet des contre-mesures de cluster peut être attendu dès qu'il le sera, et plus la taille de cluster est grande, plus elle peut être efficace. y a-t-il.
  3. Cependant, ** 50 jours après l'apparition du cluster, l'effet des contre-mesures du cluster disparaîtra presque **.
  4. Par conséquent, si le nombre de personnes infectées qui ne peuvent pas suivre l'itinéraire augmente, il est rationnel d'interdire la sortie de l'uniforme à un stade précoce.
  5. Les facteurs qui font la différence entre les pays occidentaux du G7 et le Japon sont les suivants: ** Passage précoce à des contre-mesures relatives aux clusters, limitation des clusters à forte production initiale en s'abstenant de manifestations à grande échelle et en plus des installations religieuses Il est possible qu'il y ait peu de réunions **.

Limitations du modèle conventionnel (modèle SEIR)

Dans l'article ci-dessous, j'ai calculé à l'aide d'un modèle appelé modèle SEIR, qui calcule la transition des maladies infectieuses.

Pour le dire simplement, le modèle SEIR est S: sensible, E: exposé, I: infectieux, R: infectieux. C'est un modèle qui exprime comment la distribution d'un certain groupe change parmi les quatre personnes qui se sont rétablies de la maladie et ont acquis l'immunité (récupérées) par une équation différentielle. Il semble qu'il soit souvent utilisé dans l'analyse des tendances des maladies infectieuses, et il apparaît souvent dans les documents explicatifs du ministère de la Santé au Japon, du ministère de la Santé au Royaume-Uni et du CDC américain. Cependant, si vous essayez de calculer le groupe de population S sur la base d'un grand groupe tel que tout le pays ou toute la préfecture, ce ne sera pas du tout un chiffre **. Par exemple, dans le calcul du modèle SEIR examiné dans l'article ci-dessus, en supposant une population de 1000 personnes, il culmine en 60 jours, et au sommet, plus de 30% de la population est infectée, mais en termes de ratio de population Même si vous regardez l'Italie, où le nombre de personnes infectées est extrêmement élevé, le nombre actuel de personnes infectées n'est que d'environ 0,1% de la population de 60,48 millions. Il y a plusieurs raisons possibles, mais les suivantes sont supposées, par exemple.

Alors, réfléchissons à ** Existe-t-il un modèle qui peut expliquer davantage les faits à partir des données réellement observées **?

Envisagez un modèle SEIR basé sur des clusters

Par conséquent, vérifions le phénomène réellement observé. La figure ci-dessous est le résultat calculé par Examinons le temps de convergence à partir de la tendance globale du nombre de reproduction effectif du nouveau virus corona. R0_爆発的感染が観測された地域+推定.png

Les chiffres du graphique sont calculés sur la base d'une certaine norme pour le nombre de reproductions de base effectives (** ci-dessous, appelé Rp. **). La ligne pointillée est une expression approximative (linéaire logique) qui se rapproche du graphique. Les tendances qui peuvent être lues à partir de ce graphique sont les suivantes.

Alors ** modélisons docilement cette tendance observée **. En particulier,

Ce sera comme ça une fois écrit dans une formule mathématique.

Rp(t) = Rp(t_0) \cdot 2^{-\frac{t-t_0}{T_h}},  T_h=7.5[days]

Incorporer ce nombre de reproduction effective Rp (t) dans le modèle SEIR pour en faire un ** modèle SEIR basé sur des grappes **.

\begin{eqnarray}
\frac{dRp}{dt} &=& - \frac{ln2}{T_h}Rp \\
\frac{dS}{dt} &=& -\frac{1}{ip} Rp \cdot I \\
\frac{dE}{dt} &=& -\frac{dS}{dt} - \frac{1}{lp} E \\
\frac{dI}{dt} &=& \frac{1}{lp} E - \frac{1}{ip} I \\
\frac{dR}{dt} &=& \frac{1}{ip} I
\end{eqnarray}

Le fait est que, contrairement au modèle SEIR original, il ne dépend pas de la valeur initiale de ** S (t) **. Dans ce qui suit, j'aimerais examiner ce modèle avec l'effet de l'anti-clustering, c'est-à-dire l'effet de découvrir un cluster et de découvrir et d'isoler les personnes infectées provenant du cluster **.

Essayez de calculer avec Python

Calculons le modèle SEIR basé sur les clusters ci-dessus en Python. Importez la bibliothèque.

import numpy as np
import matplotlib.pyplot as plt

Définissez ODE. Ici, pour calculer l'effet des contre-mesures de cluster, après un certain temps $ T_c $, il est calculé avec $ Rp = 0 $.

#define differencial equation of seir model
def seir_eq7(v, t, keys):
    Th = keys['Th']
    lp = keys['lp']
    ip = keys['ip']
    Tc = keys['Tc']
    #
    Rp = v[0];
    s  = v[1];
    e  = v[2];
    i  = v[3];
    r  = v[4];
    #
    if t >= Tc:
        Rp = 0
    #
    dRp = - np.log(2)/Th * Rp
    ds  = - Rp/ip * i
    de  = - ds - (1/lp) * e
    di  = (1/lp)*e - (1/ip)*i
    dr  = (1/ip)*i
    return [dRp, ds, de, di, dr]

Définissez une fonction pour résoudre ODE.

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
    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))
    return sim

C'est le code à simuler en modifiant la valeur initiale du cluster $ Rp (t_0) $ de différentes manières. Les paramètres sont $ lp = 5, ip = 8, Th = 7,5 $.

# case 7.1
def calcsim(Rp0, keys):
    # solve seir model
    #          Rp  S  E  I  R
    ini_state=[Rp0, 0, 0, 1, 0]
    t_max=180
    dt=0.01
    t=np.arange(0,t_max,dt)
    #
    sim = my_odeint(seir_eq7, ini_state, t, keys)
    #
    plt.rcParams["font.size"] = 12
    fig, ax = plt.subplots(figsize=(10,5))
    ax.plot(t,sim[:,[2,3,4]]) # extract Rp, E I R
    ax.set_xticks(np.linspace(0,t_max,19))
    ax.grid(which='both')
    ax.legend([ 'Exposed', 'Infected','Recoverd'])
    ax.set_xlabel('date')
    ax.set_ylim(0,)
    plt.show()
    print("R(tmax):{}".format(sim[-1,4]))

# try different Rp0
keys = {'lp':5, 'ip':8, 'Th':7.5, 'Tc':200 }
calcsim(100, keys)
calcsim(30, keys)
calcsim(20, keys)
calcsim(10, keys)
# try different Tc
keys = {'lp':5, 'ip':8, 'Th':7.5, 'Tc':20 }
calcsim(10, keys)
keys = {'lp':5, 'ip':8, 'Th':7.5, 'Tc':10 }
calcsim(10, keys)

C'est le code à simuler en modifiant le temps de contre-mesure du cluster $ T_c $ de différentes manières.

# case 7.2
def calcTctoRp(Rp0):
    #          Rp  S  E  I  R
    ini_state=[Rp0, 0, 0, 1, 0]
    t_max=180
    dt=0.01
    t=np.arange(0,t_max,dt)
    #
    lp = 5
    ip = 8
    keys = {'lp':lp, 'ip':ip, 'Th':7.5, 'Tc':(5+0) }
    #
    rslt = []
    for i in range(0,60):
        keys['Tc'] = lp + i
        sim = my_odeint(seir_eq7, ini_state, t, keys)
        rslt.append([keys['Tc'], sim[-1:,4]]) # (i, R(tmax))
    #
    rslt = np.array(rslt)
    ymax = max(rslt[:,1])
    plt.rcParams["font.size"] = 12
    fig, ax = plt.subplots(figsize=(10,5))
    #
    ax.plot([0 , 0],[0,ymax],'m:')
    ax.plot([lp,lp],[0,ymax],'b:')
    ax.plot([lp+ip,lp+ip],[0,ymax],'g:')
    #
    ax.plot( rslt[:,0], rslt[:,1], 'r')
    ax.legend([ '0 day', 'lp days','lp + ip days','Total infected'], loc='lower right')
    ax.grid(which='both')
    ax.set_xlabel('cluster shutdown date since cluster occured')
    ax.set_ylabel('R(tmax)')
    #
    for tat in [10,13,20,30,40]:
        idx = [i for i in range(len(rslt[:,0])) if rslt[i,0] >= tat][0]
        print("R_fin with Tc:{} is {}".format(rslt[idx,0], rslt[idx,1]))
    #
    ax.set_xlim(-1,)
    ax.set_ylim(0,)
    plt.show()
    
calcTctoRp(100)
calcTctoRp(30)
calcTctoRp(20)
calcTctoRp(10)

résultat de la simulation

Jetons un coup d'œil aux résultats du calcul. Le résultat de la modification du numéro de reproduction initial $ Rp (t_0) $ par certains modèles, de la correction de $ Rp (t_0) $ et de la modification du temps de contre-mesure du cluster $ T_c $ par certains modèles est affiché.

1. Effet du nombre de reproduction initial Rp (t_0)

Lorsque le nombre de reproduction initial Rp (t_0) = 10

Finalement, 113 personnes seront infectées. m7_1_Rp0_10_Tc_200.jpg

Lorsque le nombre de reproduction initial Rp (t_0) = 20

Finalement, 3493 personnes seront infectées. m7_1_Rp0_20_Tc_200.jpg

Lorsque le nombre de reproduction initial Rp (t_0) = 30

Finalement, 58 437 personnes seront infectées. m7_1_Rp0_30_Tc_200.jpg

2. Impact du temps de contre-mesure de cluster Tc

Lorsque le nombre de reproduction initial Rp (t_0) = 10, le temps de contre-mesure de cluster Tc est modifié et vérifié. Bien sûr, plus tôt les contre-mesures de cluster seront prises, plus elles seront efficaces. Dans la simulation ci-dessus, 113 personnes ont finalement été infectées sans mesures de cluster.

Lorsque le temps de contre-mesure du cluster Tc = 10 [jours]

Si les personnes infectées peuvent être isolées dans les 10 jours suivant le cluster, le nombre final d'infectés peut être réduit de 113 à 21. m7_1_Rp0_10_Tc_10.jpg

Lorsque le temps de contre-mesure du cluster Tc = 20 [jours]

Si les personnes infectées peuvent être mises en quarantaine dans les 20 jours suivant le cluster, le nombre final d'infectés peut être réduit de 113 à 64. m7_1_Rp0_10_Tc_20.jpg

3. Relation entre le temps de contre-mesure Tc du cluster et le nombre final de personnes infectées

Représentons graphiquement la relation entre le temps de contre-mesure du cluster Tc et le nombre final de personnes infectées. Des lignes pointillées sont tracées en trois points: lorsqu'un cluster se produit, lorsque la période de latence lp s'est écoulée et lorsque la période de latence + période d'infection (lp + ip) s'est écoulée.

Lorsque le nombre de reproduction initial Rp (t_0) = 10

m7_2_Rp0_10.jpg

Lorsque le nombre de reproduction initial Rp (t_0) = 20

Comparé à lorsque Rp (t_0) = 10, l'effet des mesures de grappes est relativement accru. m7_2_Rp0_20.jpg

Lorsque le nombre de reproduction initial Rp (t_0) = 30

Comparé à lorsque Rp (t_0) = 20, l'effet des mesures de grappes est relativement accru. m7_2_Rp0_30.jpg

Considération

De ce qui précède, les tendances suivantes peuvent être dérivées de la simulation concernant la transition du nombre de personnes infectées et l'effet du temps de contre-mesure de cluster basé sur le modèle SEIR basé sur les clusters.

Même dans le modèle SEIR basé sur des grappes qui ne prend pas la valeur initiale de + S, la courbe a presque la même forme que le modèle SEIR normal.

En outre ...

Lien de référence

Je me suis référé à la page suivante.

  1. Modèle SEIR
  2. Esquisse de la stratégie de soutien des modules (version provisoire du 10 mars 2020)

Recommended Posts

Expliquons la différence dans la façon dont le nouveau virus corona se propage entre le Japon et d'autres pays avec un modèle de contre-mesure en cluster
Vérifiez l'effet du congé comme contre-mesure contre le nouveau virus corona avec le modèle SEIR
[Python] Explique la différence entre strftime et strptime dans le module datetime avec un exemple
Comment obtenir la différence de date et d'heure en secondes avec Python
À propos de la différence entre "==" et "is" en python
Comment utiliser argparse et la différence entre optparse
Simulons l'effet de l'introduction d'une application de suivi des contacts comme contre-mesure contre le nouveau virus corona
Jetons un coup d'œil à la tendance infectieuse du nouveau coronavirus COVID-19 dans chaque pays et à l'état de la réponse médicale (informations supplémentaires).
Quelle est la différence entre les liens symboliques et les liens durs?
Enregistrez le modèle pystan et les résultats dans un fichier pickle
J'ai essayé de trouver la différence entre A + = B et A = A + B en Python, alors notez