[PYTHON] La théorie selon laquelle la clé du contrôle de l'infection du nouveau coronavirus est l'hyperdispersion de la sensibilité.

introduction

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é. scale-free-network.jpg (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.

Définition des termes

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.

  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

Ensuite, définissez les variables dans leur ensemble.

De plus, les éléments suivants sont introduits en tant que paramètres.

Nombre de reproduction de base et surdispersion

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. クラスター対策班のR0_2.jpg

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

  1. Une personne a continué à infecter une personne par jour pendant huit jours.
  2. Une personne a infecté huit personnes par jour et n'a pas développé d'infection secondaire par la suite.

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.

  1. Un modèle qui suppose une surdispersion de l'infectiosité. ** Considérez la surdispersion comme un facteur de la part de la personne affectée **.
  2. Un modèle qui suppose une hyperdispersion de la susceptibilité. ** Considérez la surdispersion comme un facteur de la part du destinataire **.

Modèle mathématique 1 (surdispersion de l'infectiosité)

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é.

Modèle mathématique 2 (hyperdispersion de sensibilité)

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é **.

Essayez de calculer avec Python

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)

résultat de la simulation

Jetons un coup d'œil aux résultats du calcul.

Distribution des nombres de reproduction de base

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 $. m10_R0dist.jpg

Modèle mathématique 1 (surdispersion de l'infectiosité)

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. case1_m10_1_N_200_at17100.jpg

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. case1_m10_2_N_200.jpg

Finalement, environ 90% seront infectés, entraînant une terminaison par immunité de masse.

Modèle mathématique 2 (hyperdispersion de sensibilité)

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. case2_m10_1_N_200_at17100.jpg 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. case2_m10_2_N_200.jpg

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% **.

Considération

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.

En outre ...

initial-distribution.jpg (Extrait de Article de G.M. Szabo)

Lien de référence

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

  1. [Réseau complexe](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. Estimer le pic d'infectivité du nouveau virus corona
  5. La tourmente corona peut ne pas se terminer indéfiniment en raison de faux positifs dans le test PCR
  6. Nouvel expert en contre-mesures du cluster Corona (2)
  7. «Définition des termes pour les nouvelles contre-mesures de cluster corona» rapportées par les spécialistes pour les nouvelles contre-mesures de cluster corona

Recommended Posts

La théorie selon laquelle la clé du contrôle de l'infection du nouveau coronavirus est l'hyperdispersion de la sensibilité.
L'histoire de la définition de la clé privée à 600 avec chmod
J'ai essayé de prédire le comportement du nouveau virus corona avec le modèle SEIR.
J'ai essayé d'envoyer automatiquement la littérature du nouveau virus corona à LINE avec Python
J'ai essayé de visualiser les caractéristiques des nouvelles informations sur les personnes infectées par le virus corona avec wordcloud
Quantifier le degré d'autolimitation nécessaire pour contenir le nouveau virus corona
Tracez la propagation du nouveau virus corona
Pour vérifier si la clé spécifiée se trouve dans le compartiment spécifié dans Boto 3
Comment déterminer qu'une clé croisée a été entrée dans Python3
Créez un bot qui publie sur Slack le nombre de personnes positives pour le nouveau virus corona à Tokyo
Le nombre de fermetures de magasins a-t-il augmenté en raison de l'influence du nouveau virus corona?
J'ai essayé de rationaliser le rôle standard des nouveaux employés avec Python
[Introduction à Python] Quelle est la méthode de répétition avec l'instruction continue?
Folding @ Home sur Linux Mint pour contribuer à l'analyse du nouveau virus corona
Estimer le pic d'infectivité du nouveau virus corona
Python> set> Convertir avec set ()> dictionary n'est que la clé> On m'a appris à convertir les valeurs du dictionnaire en set / dir ({}) / help ({}) / help ({} .valeurs)
Simulons la transition du taux d'infection par rapport à la densité de population avec python
L'expérience de Hackason selon laquelle il est le plus important de comprendre les sentiments de l'organisateur
J'ai essayé d'afficher le degré d'infection par le virus corona sur la carte thermique Seaborn
Une nouvelle forme d'application qui fonctionne avec GitHub: Comment créer des applications GitHub
La base de la théorie des graphes avec l'animation matplotlib
Simulation GUI du nouveau virus corona (modèle SEIR)
Vérifiez l'effet du congé comme contre-mesure contre le nouveau virus corona avec le modèle SEIR
En voici une, je vais résumer les applications équipées "d'intelligence artificielle" qui m'intéressaient
Depuis que le stock a plongé en raison de l'influence du nouveau virus corona, j'ai essayé de visualiser les performances de ma fiducie d'investissement avec Python.
Ajoutez des informations au bas de la figure avec Matplotlib
Essayez d'obtenir le contenu de Word avec Golang
Testons l'hypothèse d'effondrement médical du nouveau virus corona
Script pour changer la longueur du son avec REAPER
Utilisez le hachage pour alléger le jugement de collision d'environ 1000 balles en Python (lié au nouveau virus corona)
Le son émis par M. Tick sur le lieu de travail est ... J'ai réussi à le faire avec le code
Lorsqu'une chaîne de caractères d'une certaine série se trouve dans la clé du dictionnaire, la chaîne de caractères est convertie en valeur du dictionnaire.
J'ai essayé de prédire l'infection d'une nouvelle pneumonie en utilisant le modèle SIR: ☓ Wuhan edition ○ Hubei province edition
Une version simple des statistiques gouvernementales (contrôle de l'immigration) facile à gérer avec jupyter
Essayez de visualiser les nutriments des flocons de maïs que le champion de M-1 Milkboy a dit avec Python
[VLC] Comment gérer le problème de ne pas être au premier plan pendant la lecture
[Python] Le statut de chaque préfecture du nouveau virus corona n'est publié qu'en PDF, mais j'ai essayé de le gratter sans le télécharger.
Si les habitants de Tokyo tombent gravement malades du nouveau virus corona, ils peuvent être emmenés dans un hôpital de la préfecture de Kagoshima.
Je souhaite générer une sortie lors de la conversion de la valeur du type (par exemple, datetime) qui n'est pas pris en charge lors de la sortie de json avec python