[PYTHON] Modèle de prédiction mathématique des maladies infectieuses (modèle SIR): étude de cas (1)

1. Introduction

Dans l'article précédent, j'ai présenté le modèle SIR, qui est un modèle de prédiction mathématique des maladies infectieuses.

Titre: Introduction du modèle de prédiction mathématique des maladies infectieuses (modèle SIR) https://qiita.com/kotai2003/items/3078f4095c3e94e5325c

Cette fois, nous listerons les cas d'infection réellement survenus et confirmerons les performances prédictives de ce modèle SIR.

2. Infection grippale dans un internat au Royaume-Uni (1978)

En janvier 1978, une épidémie de grippe s'est déclarée dans un internat du nord de l'Angleterre. Sur les 763 garçons âgés de 10 à 18 ans, tous sauf 30 ont été confirmés infectés par la grippe. Parmi ceux-ci, 512 étaient malades pendant l'épidémie qui a duré du 22 janvier au 4 février. En outre, l'infection a commencé avec un garçon.

figure01.png https://www.ncbi.nlm.nih.gov/pmc/articles/PMC1603269/pdf/brmedj00115-0064.pdf

Le tableau montre la valeur du nombre de personnes souffrant de problèmes de santé (personnes infectées infectieuses) estimée à partir de la figure.

Day Number of Infectious
1 3
2 8
3 28
4 75
5 221
6 291
7 255
8 235
9 190
10 125
11 70
12 28
13 12
14 5

Tracez ces données dans la figure. Le nombre de contagieux a culminé au jour 6 avec une valeur de 255.

real_data.png

3. Estimation des paramètres

Maintenant, reconfirmez l'équation différentielle du modèle SIR. Afin de résoudre ce modèle, nous devons connaître les conditions initiales de chaque variable. Cette infection a commencé avec l'un des 763 élèves de l'école, donc S0 = 762, I0, R0 = 0.


\begin{align}

\frac{dS}{dt} &= -\beta SI \\
\frac{dI}{dt} &=  \beta SI -\gamma I \\
\frac{dR}{dt} &=  \gamma I \\

\end{align} 
\begin{align}
S &:Personne infectable\quad \text{(Susceptible)} \\
I &:Personne infectée\quad \text{(Infectious)} \\
R &:Ceux qui sont décédés après une infection ou qui ont acquis une immunité\quad \text{(Removed)} \\
\beta &:Taux d'infection\quad \text{(The infectious rate)} \quad [1/day] \\
\gamma &:Taux d'exclusion\quad \text{(The Recovery rate)} \quad [1/day] \\
\end{align}

Le problème est le taux d'infection et le taux d'élimination. En général, le modèle SIR est nécessaire au début de l'éclosion de l'infection. Estimez rapidement les paramètres du taux d'infection et du taux d'élimination à partir des données sur les personnes infectées précocement et calculez les modèles SIR pour voir si cette infection se propage ou converge. Si le modèle SIR montre que l'infection se propage (R0> 1), il entre dans le processus de hiérarchisation des politiques de santé telles que la ségrégation des personnes infectées et la restriction du mouvement des personnes pour empêcher cette propagation.

Les premières infections ont montré qu'un garçon malade infecterait deux autres garçons un jour plus tard. À titre d'estimation approximative, le nombre de personnes pouvant être infectées devrait diminuer à raison de 2 personnes par jour.

\frac{dS}{dt} \simeq -2 \\

Puisque S_0 = 762 et I_0 = 1 sont connus comme conditions initiales, le taux d'infection est calculé par la formule suivante.

\beta = 
\frac{-dS/dt}{S_0I_0}\simeq\frac{2}{762\times  1}=0.0026

Vient ensuite l'estimation du taux d'élimination. Le taux d'élimination est le taux auquel les individus infectés diminuent par rapport au nombre d'individus infectés en raison de la mort et de l'immunité. Selon les rapports de l'époque, les garçons hospitalisés se sont rétablis en un jour ou deux. Par conséquent, en supposant un rétablissement dans 2 jours, environ la moitié de la population infectée sera éliminée quotidiennement.

\gamma = \frac{1}{2\text{days}}=0.5[\frac{1}{day} ]


Pour référence, calculez le rapport entre le taux d'élimination et le taux d'infection. Sa valeur est de 192.

\rho = \frac{\gamma}{\beta}=\frac{0.5}{0.0026}= 192

4. Comparaison des prévisions du modèle et des données de mesure réelles

Mettez les conditions ci-dessus et résolvez le modèle SIR par intégration numérique.

import numpy as np
from scipy.integrate import odeint
from scipy.optimize import minimize
import matplotlib.pyplot as plt
%matplotlib inline
#Define differential equation of SIR model

'''
dS/dt = -beta * S * I
dI/dt = beta * S * I - gamma * I
dR/dt = gamma * I

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

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

'''
def SIR_EQ(v, t, beta, gamma):
    return [-beta*v[0]*v[1], beta * v[0] * v[1] - gamma * v[1], gamma * v[1]]

Entrez les conditions initiales S_0, I_0, R_0 et le taux d'infection et le taux d'élimination dans cette partie.

#parameters
t_max = 14
dt = 0.01

beta_const = 0.0026
gamma_const = 0.5


#initial_state
S_0=762
I_0=1
R_0=0
ini_state = [S_0,I_0,R_0] #[S[0], I[0], R[0]]

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

#R0
N_total = S_0+I_0+R_0
R0 = N_total*beta_const *(1/gamma_const)
print(R0)
#Numerical Solution using scipy.integrate
#Solver SIR model
result = odeint(SIR_EQ, ini_state, times, args)
#plot
plt.plot(times,result)
plt.legend(['Susceptible','Infectious', 'Removed'])
plt.title("Influenza 1978: a=0.0026, b=0.5, $S_0$=762, $I_0$=1")
plt.xlabel('time(days)')
plt.ylabel('population')

plt.show()

calc_01.png

Tracons les données réelles de la personne infectée avec le modèle SIR.

# Real Data
data_day = [1,2,3,4,5,6,7,8,9,10,11,12,13,14]
data_infectious = [3,8,28,75,221,291,255,235,190,125,70,28,12,5]

#SIR model Plot
plt.plot(times,result)

# Real Data Plot

plt.scatter(data_day, data_infectious,s=10, c="pink", alpha=0.5, linewidths="2",
            edgecolors="red")
plt.title("Influenza 1978: a=0.0026, b=0.5, $S_0$=762, $I_0$=1")
plt.legend(['Susceptible','Infectious', 'Removed','data'])
plt.xlabel('time(days)')
plt.ylabel('population')
plt.show()

calc_real.png

En comparant le modèle SIR Infectieux (personne infectée) dans la figure avec les données (données) de la personne infectée réelle, il peut être confirmé que les tendances correspondent généralement. Le nombre maximum de personnes infectées (Infections_Max) prédit par ce modèle SIR était de 306, et le nombre maximum réel de personnes infectées était de 291. L'erreur était de 5%. Et la dernière personne infectable (= nombre de personnes qui n'ont pas été infectées jusqu'à la fin) prédite par le modèle SIR était de 16. En réalité, il y avait 30 personnes.

5. Résumé

Cette fois, nous avons confirmé l'efficacité du modèle SIR en utilisant des cas réels de maladies infectieuses. À partir des informations sur les personnes infectées au stade initial, les conditions initiales et les paramètres du taux d'infection et du taux d'élimination ont été estimés. Ensuite, en comparant avec les données réelles sur les personnes infectées, il a été confirmé qu'elles étaient presque en accord avec le résultat de prédiction du modèle SIR.

6. Documents de référence

  1. https://qiita.com/kotai2003/items/3078f4095c3e94e5325c
  2. https://www.researchgate.net/publication/336701551_On_parameter_estimation_approaches_for_predicting_disease_transmission_through_optimization_deep_learning_and_statistical_inference_methods
  3. https://www.ncbi.nlm.nih.gov/pmc/articles/PMC1603269/pdf/brmedj00115-0064.pdf

Recommended Posts

Modèle de prédiction mathématique des maladies infectieuses (modèle SIR): étude de cas (1)
Introduction d'un modèle de prédiction mathématique pour les maladies infectieuses (modèle SIR)
Implémenter le modèle mathématique «modèle SIR» des maladies infectieuses avec Open Modelica
Implémenter le modèle mathématique «modèle SIR» des maladies infectieuses dans OpenModelica (voir l'effet du vaccin)
Implémenter le modèle mathématique «modèle SIR» des maladies infectieuses avec OpenModelica (exemple de régulation répétée et de relaxation)
Mettre en œuvre le modèle mathématique «modèle SIR» des maladies infectieuses dans OpenModelica (reflétant le taux de mortalité et de réinfection)
Modèle mathématique des épidémies de maladies infectieuses
Prédire les épidémies de maladies infectieuses avec le modèle SIR