[PYTHON] Vorhersage von Epidemien von Infektionskrankheiten mit dem SIR-Modell

Einführung

Heutzutage heißt es im Fernsehen und in anderen Medien, dass "80% der Verhaltensbeschränkungen notwendig sind, um die neue Koronapneumonie zu lösen". Es scheint, dass die Basis dieser 80% -Zahl eine klassische Modellgleichung ist, die als SIR-Modell bezeichnet wird. Ich bin neugierig, habe aber das SIR-Modell implementiert und den Effekt der Selbstbeherrschungsrate überprüft.

SIR-Modell

** SIR-Modell ** ist ein Klassiker, der den kurzfristigen epidemischen Prozess von [Infektionskrankheiten] definitiv beschreibt (https://ja.wikipedia.org/wiki/infectious krankheiten). [Modellgleichung](https://ja.wikipedia.org/w/index.php?title=model Gleichung & Aktion = Bearbeiten & Redlink = 1). Der Name steht für [Model](https://ja.wikipedia.org/wiki/Mathematical model)

Benannt nach dem Akronym>. Das Prototypmodell ist [WO Kermac](https://ja.wikipedia.org/w/index.php?title=William Oglevi Carmac & action = edit & redlink = 1) (englische Version //en.wikipedia.org/wiki/William_Ogilvy_Kermack)) und [AG McKendrick](https://ja.wikipedia.org/w/index.php?title=Anderson Gray McKendrick & action = [1 ] vorgeschlagen in einem Artikel von 1927 von edit & redlink = 1) (englische Version) / wiki / SIR-Modell # 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}}}

  • Β *> 0 steht jedoch für die Infektionsrate, * γ *> 0 für die Wiederfindungsrate (Isolationsrate) (invers 1 / * γ * für die durchschnittliche Infektionsdauer).

Aussteller: [wikipedia]([https://ja.wikipedia.org/wiki/SIR%E3%83%A2%E3%83%87%E3%83%AB](https://ja.wikipedia.org/ Wiki / SIR-Modell)))

Das SIR-Modell ist eine ternäre simultane Differentialgleichung von S, R, I, $ S(t)+I(t)+R(t)=const. $ Daher wird es durch eine Gleichung mit zwei Variablen ersetzt. Unter der Annahme von * S >> I * und der Einstellung von γ = 1 und R = βS kann es außerdem nur durch die Gleichung von I ersetzt werden. Hier wird die folgende Gleichung als maßgebliche Gleichung verwendet. $ \frac{dI}{dt}=I(t)(R-1) $ Hier ist R ein Wert namens [Basisreproduktionsnummer](https://ja.wikipedia.org/wiki/basic Reproduktionsnummer), und es wird gesagt, dass COVID-19 ungefähr 2 bis 3 ist.

Literatur → https://www.biorxiv.org/content/10.1101/2020.01.25.919787v1

Wenn Sie die obige Formel als Vorwärtsdifferenz aufschreiben, $ I(t+Δt)=I(t)+I(t)(R-1)Δt $ Es wird sein. Im folgenden Quellcode werden wir basierend auf dieser Formel simulieren.

Quellcode

importieren

Verwenden Sie matplotlib zur Grafikvisualisierung.

from matplotlib import pyplot

Parameter

R = 2.5
activity = 0.2
x0 = 200
infection_days = 14
dt = 1/infection_days
stop_day = 30
start_day = 150
total_day = 180
Parameter Erläuterung
R Grundlegende Anzahl von Reproduktionen (Anzahl neu infizierter Personen pro infizierter Person während normaler Aktivitäten)
activity Aktivitätsrate während der Selbstbeherrschungsperiode (1 ist normal)
Zum Beispiel 1 für 80% Selbstbeherrschung-0.8=0.Es wird 2 sein.
x0 Anzahl der Erstinfektionen
infection_days Tage bis zur Quarantäne oder Wiederherstellung
dt Rechenzeitschritt
stop_day Startdatum für Selbstbeherrschung (Aktivitätsrate ändert sich von 1 zu Aktivität nach diesem Datum)
start_day Der Tag, um die Selbstbeherrschung zu beenden und normale Aktivitäten wieder aufzunehmen
total_day Gesamte Simulationstage

Variable Initialisierung

x = [x0]
new = [0]
Variablennamen Erläuterung
x[day] t=Anzahl der infizierten Personen am Tag
new[day] t=Anzahl der Neuinfektionen am Tag

Variablen aktualisieren

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 stellt die Aktivitätsrate dar, die 1 ist, bis "Tag" zu "Stopptag" wird, "Aktivität" von "Stopptag" zu "Starttag" und danach 1. Durch Multiplizieren dieses Wertes mit R wird die Grundanzahl der Reproduktionen zum Zeitpunkt der Selbstbeherrschung dargestellt. Wenn zum Beispiel p = 0,5 ist, dann ist R × p = 2,5 × 0,5 = 1,25.

Grafik anzeigen

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

Übergang infizierter Personen, wenn das Verhalten um 80% reduziert ist ("Aktivität = 0,2")

figure1.png

Die Anzahl der infizierten Personen nahm ab dem Startdatum der Selbstbeherrschung (stop_day) schnell ab, aber das Aktivitätsstartdatum ( start_day) wurde erreicht, bevor es vollständig ausgerottet wurde, und die Anzahl der infizierten Personen stieg nach diesem Tag allmählich an. Ich bin. Sie können sehen, dass selbst wenn die Anzahl der infizierten Personen abnimmt, dies normalerweise nutzlos ist.

Übergang infizierter Personen, wenn das Verhalten um 60% reduziert ist ("Aktivität = 0,4")

figure2.png

Da der Graph schwer zu sehen ist, setze ich start_day = 180 (keine Reaktivierung). Es ist eine Grafik, die Sie oft im Fernsehen sehen. Wenn "Aktivität = 0,4", dann ist R × p = 1, was bedeutet, dass ** durchschnittlich 1 Person pro infizierter Person infiziert ist **. Unter der Prämisse von R = 2,5 ist es notwendig, den Status quo mit einer Reduzierung um 60% beizubehalten und die Anzahl der Infizierten unter Berücksichtigung der Unsicherheit um 80% zu reduzieren.

schließlich

Auch hier dient der Quellcode für diesen Artikel nur dem ** intuitiven Verständnis, wie gut die Regulierung Infektionen kontrollieren kann **. Ich denke, das Modell ist zu einfach und zu eng für eine quantitative Bewertung.

ANHANG Code voll

from matplotlib import pyplot

#Grundlegende Anzahl von Reproduktionen (Anzahl neu infizierter Personen pro infizierter Person während normaler Aktivitäten)
R = 2.5
#Aktivitätsrate während der Selbstbeherrschungsperiode (1 ist normal)
activity = 0.2
#Anzahl der Erstinfektionen
x0 = 200
#Tage bis zur Quarantäne oder Wiederherstellung
infection_days = 14
#Rechenzeitschritt
dt = 1/infection_days
#Startdatum für Selbstbeherrschung (Aktivitätsrate ändert sich von 1 zu Aktivität nach diesem Datum)
stop_day = 30
#Der Tag, um die Selbstbeherrschung zu beenden und normale Aktivitäten wieder aufzunehmen
start_day = 150
#Gesamte Simulationstage
total_day = 180

#Aktuelle Anzahl infizierter Personen
x = [x0]
#Anzahl der neu infizierten Personen
new = [0]

#Wertaktualisierung (Differenzmethode)
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)
	
#Grafikanzeige
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

Vorhersage von Epidemien von Infektionskrankheiten mit dem SIR-Modell
Mathematisches Modell von Infektionskrankheiten
Implementieren Sie mit Open Modelica das mathematische Modell "SIR-Modell" von Infektionskrankheiten
Vorhersage des heißen Sommers mit linearem Regressionsmodell
Lösung mathematischer Modelle von Epidemien von Infektionskrankheiten in Python
Einführung eines mathematischen Vorhersagemodells für Infektionskrankheiten (SIR-Modell)
COVID-19-Simulation mit Python (SIR-Modell) ~~ mit Präfektur-Wärmekarte ~~
Mathematisches Vorhersagemodell für Infektionskrankheiten (SIR-Modell): Fallstudie (1)
Modellbefestigung mit lmfit
Tag 71 Ich habe versucht vorherzusagen, wie lange diese Selbstbeherrschung mit dem SIR-Modell anhalten wird
Regression mit einem linearen Modell
Implementieren Sie mit OpenModelica das mathematische Modell "SIR-Modell" von Infektionskrankheiten (Beispiel für wiederholte Regulierung und Entspannung)
[Einführung in das Modell der Infektionskrankheiten] Ich habe versucht, zu passen und zu spielen ♬