[PYTHON] Prédire les épidémies de maladies infectieuses avec le modèle SIR

introduction

Aujourd'hui, on dit à la télévision et dans d'autres médias que "80% des restrictions comportementales sont nécessaires pour résoudre la nouvelle pneumonie corona". Il semble que la base de ce nombre de 80% soit une équation de modèle classique appelée modèle SIR. Je suis curieux, mais j'ai implémenté le modèle SIR et vérifié l'effet du taux d'auto-retenue.

Modèle SIR

** Le modèle SIR ** est un classique qui décrit définitivement le processus épidémique à court terme des [maladies infectieuses](https://ja.wikipedia.org/wiki/infectious disease). [Équation du modèle](https://ja.wikipedia.org/w/index.php?title=model equation & action = edit & redlink = 1). Le nom est pour [Model](https://ja.wikipedia.org/wiki/Mathematical model)

--Sensibilité titulaire (** S ** usceptible) --Infecté (** I ** négatif)

  • Détenteur de l'immunité (** R ** récupéré ou mise en quarantaine [** R ** emoved](https: //ja.wiktionary. org / wiki / supprimé)))

Nommé d'après l'acronyme>. Le modèle prototype est [WO Kermac](https://ja.wikipedia.org/w/index.php?title=William Oglevi Carmac & action = edit & redlink = 1) (version anglaise //en.wikipedia.org/wiki/William_Ogilvy_Kermack)) et [AG McKendrick](https://ja.wikipedia.org/w/index.php?title=Anderson Gray McKendrick & action = [1 ] proposé dans un article de 1927 par edit & redlink = 1) (version anglaise) / wiki / modèle SIR # cite_note-1).

{\displaystyle {\begin{aligned}{\frac {dS}{dt}}(t)&=-\beta S(t)I(t)\{\frac {dI}{dt}}(t)&=\beta S(t)I(t)-\gamma I(t)\{\frac {dR}{dt}}(t)&=\gamma I(t)\end{aligned}}}

Cependant, * β *> 0 représente le taux d'infection, * γ *> 0 représente le taux de récupération (taux d'isolement) (l'inverse 1 / * γ * représente la période moyenne d'infection).

Exposant: [wikipedia]([https://ja.wikipedia.org/wiki/SIR%E3%83%A2%E3%83%87%E3%83%AB](https://ja.wikipedia.org/ modèle wiki / SIR)))

Le modèle SIR est une équation différentielle simultanée ternaire de S, R, I, $ S(t)+I(t)+R(t)=const. $ Par conséquent, il peut être remplacé par une équation à deux variables. De plus, en supposant * S >> I * et en posant γ = 1 et R = βS, elle peut être remplacée par l'équation de I uniquement. Ici, l'équation suivante est utilisée comme équation dominante. $ \frac{dI}{dt}=I(t)(R-1) $ Ici, R est une valeur appelée [numéro de reproduction de base](https://ja.wikipedia.org/wiki/basic numéro de reproduction), et on dit que COVID-19 est d'environ 2 à 3.

Littérature → https://www.biorxiv.org/content/10.1101/2020.01.25.919787v1

Si vous notez la formule ci-dessus comme une différence à terme, $ I(t+Δt)=I(t)+I(t)(R-1)Δt $ Ce sera. Dans le code source suivant, nous simulerons sur la base de cette formule.

Code source

importer

Utilisez matplotlib pour la visualisation des graphiques.

from matplotlib import pyplot

Paramètres

R = 2.5
activity = 0.2
x0 = 200
infection_days = 14
dt = 1/infection_days
stop_day = 30
start_day = 150
total_day = 180
Paramètres La description
R Nombre de reproductions de base (nombre de personnes nouvellement infectées par personne infectée pendant les activités normales)
activity Taux d'activité pendant la période de maîtrise de soi (1 est normal)
Par exemple, 1 pour 80% de maîtrise de soi-0.8=0.Ce sera 2.
x0 Nombre d'infections initiales
infection_days Jours de quarantaine ou de récupération
dt Pas de temps de calcul
stop_day Date de début de l'autolimitation (le taux d'activité passe de 1 à activité après cette date)
start_day Le jour pour mettre fin à la maîtrise de soi et reprendre les activités normales
total_day Nombre total de jours de simulation

Initialisation variable

x = [x0]
new = [0]
Nom de variable La description
x[day] t=Nombre de personnes infectées par jour
new[day] t=Nombre de nouvelles infections par jour

Mettre à jour les variables

for day in range(1,total_day):
	p = 1
	if day >= stop_day:
		p = activity
	if day >= start_day:
		p = 1
	x.append(x[day-1]+x[day-1]*(R*p-1.0)*dt)
	new.append(x[day-1]*R*p*dt)

p représente le taux d'activité, qui est de 1 jusqu'à ce que «day» devienne «stop_day», «activité» de «stop_day» à «start_day», et 1 après cela. En multipliant cette valeur par R, il représente le nombre de base de reproductions au moment de la maîtrise de soi. Par exemple, si p = 0,5, alors R × p = 2,5 × 0,5 = 1,25.

Afficher le graphique

pyplot.plot(x,label='Infected persons')
pyplot.plot(new,label='New infected persons')
pyplot.xlabel('days')
pyplot.ylabel('Persons')
pyplot.legend()
pyplot.show()

Transition des personnes infectées lorsque le comportement est réduit de 80% («activité = 0,2»)

figure1.png

Le nombre de personnes infectées a diminué rapidement à partir de la date de début de l'autolimitation (stop_day), mais la date de début de l'activité ( start_day) a été atteinte avant qu'elle ne soit complètement éradiquée, et le nombre de personnes infectées a progressivement augmenté après ce jour. Je suis. Vous pouvez voir que même si le nombre de personnes infectées diminue, c'est généralement inutile.

Transition des personnes infectées lorsque le comportement est réduit de 60% («activité = 0,4»)

figure2.png

Comme le graphique est difficile à voir, j'ai mis start_day = 180 (pas de réactivation). C'est un graphique que vous voyez souvent à la télévision. Si «activité = 0,4», alors R × p = 1, ce qui signifie que ** en moyenne 1 personne est infectée par personne infectée **. Sous la prémisse de R = 2,5, il est nécessaire de maintenir le statu quo avec une réduction de 60% et de réduire le nombre de personnes infectées de 80% en tenant compte de l'incertitude.

à la fin

Encore une fois, le code source de cet article est juste pour ** une compréhension intuitive de la façon dont la réglementation peut contrôler les infections **. Je pense que le modèle est trop simple et trop strict pour une évaluation quantitative.

Code APPENDICE complet

from matplotlib import pyplot

#Nombre de reproductions de base (nombre de personnes nouvellement infectées par personne infectée pendant les activités normales)
R = 2.5
#Taux d'activité pendant la période de maîtrise de soi (1 est normal)
activity = 0.2
#Nombre d'infections initiales
x0 = 200
#Jours de quarantaine ou de récupération
infection_days = 14
#Pas de temps de calcul
dt = 1/infection_days
#Date de début de l'autolimitation (le taux d'activité passe de 1 à activité après cette date)
stop_day = 30
#Le jour pour mettre fin à la maîtrise de soi et reprendre les activités normales
start_day = 150
#Nombre total de jours de simulation
total_day = 180

#Nombre actuel de personnes infectées
x = [x0]
#Nombre de personnes nouvellement infectées
new = [0]

#Mise à jour de la valeur (méthode de différence)
for day in range(1,total_day):
	p = 1
	if day >= stop_day:
		p = activity
	if day >= start_day:
		p = 1
	x.append(x[day-1]+x[day-1]*(R*p-1.0)*dt)
	new.append(x[day-1]*R*p*dt)
	
#affichage graphique
pyplot.plot(x,label='Infected persons')
pyplot.plot(new,label='New infected persons')
pyplot.xlabel('days')
pyplot.ylabel('Persons')
pyplot.legend()
pyplot.show()

Recommended Posts

Prédire les épidémies de maladies infectieuses avec le modèle SIR
Modèle mathématique des épidémies de maladies infectieuses
Implémenter le modèle mathématique «modèle SIR» des maladies infectieuses avec Open Modelica
Prédire l'été chaud avec un modèle de régression linéaire
Résolution de modèles mathématiques d'épidémies de maladies infectieuses en Python
Introduction d'un modèle de prédiction mathématique pour les maladies infectieuses (modèle SIR)
Simulation COVID-19 avec python (modèle SIR) ~~ avec carte de chaleur préfectorale ~~
Modèle de prédiction mathématique des maladies infectieuses (modèle SIR): étude de cas (1)
Montage du modèle avec lmfit
Jour 71, j'ai essayé de prédire combien de temps cette autolimitation se poursuivra avec le modèle SIR
Régression avec un modèle linéaire
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)
[Introduction au modèle de maladie infectieuse] J'ai essayé de m'adapter et de jouer