[PYTHON] J'ai essayé de prédire le comportement du nouveau virus corona avec le modèle SEIR.

1.Tout d'abord

Le nombre de personnes infectées par la nouvelle pneumonie corona (Covid-19) survenue à Wuhan, dans la province du Hubei, en Chine en décembre 2019, augmente également au Japon. Comprendre dans quel processus des maladies infectieuses telles que la grippe, le SIDA, le SRAS, etc. se propagent dans la population humaine est de confirmer l'effet des politiques de santé telles que la vaccination et l'isolement des personnes infectées. Est également important. Dans l'article précédent, j'ai expliqué le modèle SIR, mais je présenterai le modèle SEIR qui prend en compte la période de latence des maladies infectieuses. Je présenterai le processus de calcul de ce modèle avec Python et le résultat du calcul de la propagation du nouveau virus corona à l'aide de ce modèle SEIR.

Addendum: J'ai essayé d'en faire une interface graphique basée sur le contenu de cet article.

** Simulation GUI du nouveau virus corona (modèle SEIR) ** https://qiita.com/kotai2003/items/f6cf36e9c22c3e776dee

2. Modèle prédictif des maladies infectieuses (modèle SEIR)

Dans le modèle SEIR, la population entière est classée dans les groupes suivants, et l'augmentation / la diminution de la population de chaque groupe par rapport au temps est exprimée par une équation différentielle.

--S (sensible): pas d'immunité contre les maladies infectieuses. Personne infectable --E (exposés): ceux qui ont une maladie infectieuse pendant la période latente --I (infectieux): une personne qui tombe malade en raison d'une infection et peut être transmise à une personne qui peut être infectée (S). Personne infectée --R (Supprimé): Ceux qui se sont rétablis du début de la maladie et ont acquis une immunité. Ou ceux qui sont morts sans pouvoir se remettre de l'apparition de la maladie. (Il est appelé Supprimé car il est exclu du système de ce modèle.)

SEIR-model.png

L'augmentation / diminution de la population de chaque groupe est exprimée par l'équation différentielle suivante.


\begin{align}

\frac{dS}{dt} &= -\beta \frac{SI}{N} \\
\frac{dE}{dt} &=  \beta \frac{SI}{N}  -\epsilon E \\
\frac{dI}{dt} &=  \epsilon E -\gamma I \\
\frac{dR}{dt} &=  \gamma I \\

\end{align} 
\begin{align}
S &:Infectable, infectable sans immunité\quad \text{(Susceptible)} \\
E &:Maladie infectieuse pendant la latence\quad \text{(Infectious)} \\
I &:Ceux qui ont une maladie infectieuse, ceux qui peuvent être infectés par contact(S)Infecté par la maladie\quad \text{(Infectious)} \\
R &:Ceux qui sont décédés après une infection ou qui ont acquis une immunité\quad 
\text{(Removed)} \\
N &:Population totale, S+E+I+R
\end{align}
\begin{align}
\beta &:Taux d'infection\quad \text{(The infectious rate)}  \\
\epsilon &:Taux d'infection après exposition\quad \text{(The rate at which an exposed person becomes infective)} \quad [1/day] \\
\gamma &:Taux d'exclusion\quad \text{(The Recovery rate)} \quad [1/day] \\
\end{align}
\begin{align}
\ l_p &:Temps d'attente pour l'infection\text{(latency period [day])}\quad \epsilon= \frac{1}{l_p} \\
\ i_p &:Période d'infection\text{(Infectious period [day])}\quad \gamma= \frac{1}{i_p} \\
\end{align}

Prérequis pour ce modèle SIR ――Une personne qui a acquis une immunité ne sera plus jamais infectée et ne perdra pas son immunité.

3. Calcul du modèle SEIR

Le modèle SIR est résolu en utilisant l'intégration numérique. Ici, nous utilisons la fonction odeint qui résout l'équation Runge-Kutta du module Python Scipy.

import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt

Ensuite, décrivez l'équation différentielle du modèle SIR sous une forme qui peut être calculée par odeint. Ici, v [0], v [1], v [2], v [3] correspondent respectivement à S, E, I, R.

# Define differential equation of SEIR model

'''
dS/dt = -beta * S * I / N
dE/dt = beta* S * I / N - epsilon * E
dI/dt = epsilon * E - gamma * I
dR/dt = gamma * I

[v[0], v[1], v[2], v[3]]=[S, E, I, R]

dv[0]/dt = -beta * v[0] * v[2] / N
dv[1]/dt = beta * v[0] * v[2] / N - epsilon * v[1]
dv[2]/dt = epsilon * v[1] - gamma * v[2]
dv[3]/dt = gamma * v[2]

'''


def SEIR_EQ(v, t, beta, epsilon, gamma, N ):
    return [-beta * v[0] * v[2] / N ,beta * v[0] * v[2] / N - epsilon * v[1],
            epsilon * v[1] - gamma * v[2],gamma * v[2]]

Ensuite, définissez chaque paramètre et les conditions initiales nécessaires à l'intégration numérique. Supposons que pour une population de 1 000 habitants, il y ait une personne avec une infection précoce pendant la période latente. Réglez le taux d'infection à 1, le temps d'attente pour l'infection à 2 jours et la période d'infection à 7,4 jours.

# parameters
t_max = 100 #days
dt = 0.01

# initial_state
S_0 = 99
E_0 = 1
I_0 = 0
R_0 = 0
N_pop = S_0 + E_0 + I_0 + R_0
ini_state = [S_0, E_0, I_0, R_0]  # [S[0],E,[0], I[0], R[0]]


#Taux d'infection
beta_const = 1 #Taux d'infection

#Taux d'infection après exposition
latency_period = 2 #days
epsilon_const = 1/latency_period

#Taux de récupération et taux d'isolement
infectious_period = 7.4 #days
gamma_const = 1/infectious_period

Stockez le résultat d'intégration numérique dans résultat et tracez ce résultat sur l'axe des temps.

# numerical integration
times = np.arange(0, t_max, dt)
args = (beta_const, epsilon_const, gamma_const, N_pop)

# Numerical Solution using scipy.integrate
# Solver SEIR model
result = odeint(SEIR_EQ, ini_state, times, args)
# plot
plt.plot(times, result)
plt.legend(['Susceptible', 'Exposed', 'Infectious', 'Removed'])
plt.title("SEIR model  COVID-19")
plt.xlabel('time(days)')
plt.ylabel('population')
plt.grid()

plt.show()

Figure_1.png

À partir de ce graphique, on peut dire que dans une population de 100 personnes, une personne (Exposée (0)) a une infection pendant la période latente, et finalement 100 personnes (Supprimé (100)) connaîtront l'infection. C'est. On peut voir que le pic de personnes infectées (infectieuses) survient vers 18 jours, puis l'infection converge. De cette manière, il est possible d'évaluer l'effet des maladies infectieuses sur la population avec des paramètres liés aux maladies infectieuses.

4. Prédiction du virus Corona

Actuellement, de nombreux articles de recherche ont été publiés pour estimer les paramètres SEIR à partir des cas de nouveau coronavirus. Cette fois, je vais calculer le modèle SEIR avec les estimations de paramètres publiées dans l'article publié le 16 février. (Référence 2)

Parameter Chine continentale (à l'exclusion de la province du Hubei) Province du Hubei (à l'exclusion de Wuhan) Wuhan
Population N(million) 1340 45 14
Taux d'infection[beta] 1.0 1.0 1.0
Latency period (days) 2 2 2
infectious_period (days) 6.6 7.2 7.4
E_0 696 592 318
I_0 652 515 389

Le résultat du calcul s'affiche. Notez que chacun a un chiffre de population différent sur l'axe vertical. Le premier graphique est une prévision de la propagation de l'infection en Chine continentale à l'exclusion de la province du Hubei. China-mainland.png

Le deuxième graphique est une prévision de la propagation de l'infection dans la province du Hubei, à l'exclusion de Wuhan. hubei.png

Le troisième graphique est une prédiction de la propagation de l'infection à Wuhan. Wuhan.png

Avec ce paramètre, le nombre de personnes infectées culmine en 30 à 40 jours, et finalement presque 100% de la population sera infectée (Supprimé (100)). J'étais vraiment surpris. Probablement, le résultat de la prédiction est basé sur le pire des cas. Je pense qu'il faut faire attention à chaque étape de ce virus corona.

5. Références

  1. SEIR and SEIR models https://institutefordiseasemodeling.github.io/Documentation/general/model-seir.html

  2. Epidemic analysis of COVID-19 in China by dynamical modeling https://arxiv.org/abs/2002.06563

  3. Présentation d'articles qui prédisaient l'épidémie de coronavirus en 2015 https://qiita.com/kotai2003/private/a44ca921314d17cc62e3

Recommended Posts

J'ai essayé de prédire le comportement du nouveau virus corona avec le modèle SEIR.
J'ai essayé de prédire le nombre de personnes infectées au niveau national de la nouvelle corona avec un modèle mathématique
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
Simulation GUI du nouveau virus corona (modèle SEIR)
J'ai essayé de prédire l'infection d'une nouvelle pneumonie en utilisant le modèle SIR: ☓ Wuhan edition ○ Hubei province edition
J'ai essayé de rationaliser le rôle standard des nouveaux employés avec Python
J'ai essayé de créer un modèle avec l'exemple d'Amazon SageMaker Autopilot
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
J'ai essayé de faire quelque chose comme un chatbot avec le modèle Seq2Seq de TensorFlow
J'ai essayé de prédire le nombre de personnes infectées par le virus corona au Japon par la méthode du dernier article en Chine
J'ai essayé de prédire le nombre de personnes infectées par le virus corona en tenant compte de l'effet de s'abstenir de sortir
J'ai essayé d'automatiser l'arrosage du pot avec Raspberry Pi
J'ai essayé d'agrandir la taille du volume logique avec LVM
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
J'ai essayé de classer le nombre de décès par habitant de COVID-19 (nouveau virus corona) par pays
J'ai essayé de prédire les ventes de logiciels de jeux avec VARISTA en me référant à l'article du Codexa
J'ai essayé de prédire l'année prochaine avec l'IA
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.
J'ai essayé de corriger la forme trapézoïdale de l'image
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
J'ai essayé d'extraire automatiquement les mouvements des joueurs Wiire avec un logiciel
J'ai essayé de prédire la survie du Titanic avec PyCaret
J'ai essayé d'analyser la négativité de Nono Morikubo. [Comparer avec Posipa]
J'ai essayé de visualiser le texte du roman "Weather Child" avec Word Cloud
J'ai essayé de visualiser le modèle avec la bibliothèque d'apprentissage automatique low-code "PyCaret"
J'ai essayé d'obtenir les informations sur le film de l'API TMDb avec Python
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
J'ai essayé d'obtenir et d'analyser les données statistiques de la nouvelle Corona avec Python: données de l'Université John's Hopkins
J'ai essayé de prédire la détérioration de la batterie lithium-ion en utilisant le SDK Qore
J'ai essayé de prédire les chevaux qui seront dans le top 3 avec LightGBM
J'ai essayé de visualiser facilement les tweets de JAWS DAYS 2017 avec Python + ELK
J'ai essayé de prédire la présence ou l'absence de neige par apprentissage automatique.
L'histoire de la fabrication de soracom_exporter (j'ai essayé de surveiller SORACOM Air avec Prometheus)
J'ai essayé d'afficher le degré d'infection par le virus corona sur la carte thermique Seaborn
J'ai essayé d'entraîner la fonction péché avec chainer
J'ai essayé d'extraire des fonctionnalités avec SIFT d'OpenCV
J'ai essayé de résumer la forme de base de GPLVM
J'ai essayé de prédire le match de la J League (analyse des données)
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé de visualiser les informations spacha de VTuber
J'ai essayé de résoudre le problème avec Python Vol.1
J'ai essayé de classer les voix des acteurs de la voix
J'ai essayé de résumer les opérations de chaîne de Python
J'ai essayé de prédire la victoire ou la défaite de la Premier League en utilisant le SDK Qore
J'ai essayé d'automatiser la mise à jour de l'article du blog Livedoor avec Python et sélénium.
La théorie selon laquelle la clé du contrôle de l'infection du nouveau coronavirus est l'hyperdispersion de la sensibilité.
J'ai essayé de résumer les nouvelles personnes infectées par le virus corona dans la ville d'Ichikawa, préfecture de Chiba
J'ai essayé de visualiser les données de course du jeu de course (Assetto Corsa) avec Plotly
J'ai essayé de comparer la vitesse de traitement avec dplyr de R et pandas de Python
Le 15e temps réel hors ligne, j'ai essayé de résoudre le problème de l'écriture avec python
J'ai essayé de prédire et de soumettre les survivants du Titanic avec Kaggle
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
J'ai essayé de simuler la propagation de l'infection avec Python
J'ai essayé d'analyser les émotions de tout le roman "Weather Child" ☔️
J'ai essayé d'obtenir les informations de localisation du bus Odakyu