image image


Modellieren mit Python: Die Coronavirus-Kurve

In obigem Video erklärt der britische Mathematiker (und Musiker) Ben Sparks anhand des einfachen, klassischen SIR-Modells (Susceptible-Infected-Removed-Model), wie sich die Corona-Pandemie verbreiten und wie man (möglicherweise) die Kurve abflachen könnte.

Das SIR-Modell geht von drei Gruppen von Individuen aus. Die erste Gruppe sind die zum Zeitpunkt gegen die Krankheit nicht immunen Gesunden (Susceptible), die zweite Gruppe sind die Infizierten (Infected) und steht für die »entfernten« Personen (Removed), also Personen, die entweder gegen die Krankheit immun geworden oder gestorben sind. Weiterhin sei die Gesamtzahl der Individuen. Das SIR-Modell kann für Krankheiten verwendet werden, die folgende Eigenschaften aufweisen:

  • Jedes Individuum kann an der Krankheit nur einmal erkranken und wird danach entweder immun oder stirbt.
  • Die Zahl der Individuen ist konstant, das heißt es gilt der Zusammenhang . Todesfälle werden zur Gruppe R gezählt, Geburten nicht berücksichtigt.
  • Infizierte sind sofort ansteckend.
  • Gesunde erkranken mit der linearen Rate .
  • Infizierte gehen mit der linearen Rate in die Gruppe R über, womit sie aus dem Krankheitsgeschehen ausscheiden.
  • Jede Gruppe interagiert miteinander mit derselben Wahrscheinlichkeit. Dies rechtfertigt die Annahme linearer Zusammenhänge.
  • Alle Parameter bleiben im biologisch sinnvollen Bereich, also .

Unter diesen Voraussetzungen hat Ben Sparks folgende gewöhnlichen Differentialgleichungen formuliert:

Um besser mit Prozentwerten hantieren zu können, hat er angenommen und und hat er nach Eingreifen des Interviewers in transm und recov umbenannt. Als mathematische Programmierumgebung nutzt er GeoGebra. Ich mußte gestehen, das kannte ich bisher noch nicht (Notiz an mich: Unbedingt einmal anschauen), daher habe ich für meine Experimente auf Python zurückgegriffen:

image

Als erstes habe ich die notwendigen Module importiert und unter der Annahme die Startwerte und angenommene Werte für die Infektions- und Heilungsrate festgelegt:

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

# Startwerte
S0, I0, R0 = 0.99, 0.01, 0.0

# Annahmen zur Infektionsrate und zur Heilungsrate
transm, recov = 3.2, 0.23
max_t = 20                #Zeit[Tage]

Das System von Differentialgleichungen ist eine Funktion, die dann von odeint() (aus dem Modul scipy.integrate) gelöst wird:

def deriv(u, t, transm, recov):
    S, I, R = u
    dSdt = -transm * S * I
    dIdt = transm * S * I - recov * I
    dRdt = recov * I
    return(dSdt, dIdt, dRdt)

y0 = S0, I0, R0
T = np.linspace(0, max_t, 10*max_t)

ret = odeint(deriv, y0, T, args = (transm, recov))
S, I, R = ret.T

Und schließlich habe ich die Matplotlib gebeten, mir das alles als Plot anzuzeigen:

plots = plt.plot(T, S, "b", lw = 2, label = "Susceptible") \
    + plt.plot(T, I, "r", lw = 2, label = "Infected") \
    + plt.plot(T, R, "g", lw = 2, label = "Recovered/Removed")
plt.title("Coronavirus-Kurve")
# plt.title("Flatten the Curve")
plt.xlabel("Zeit [Tage]")
plt.ylabel("Anzahl")
plt.legend(loc = "upper right")
plt.show()

Das ergab obigen Plot. Man sieht deutlich, daß mit diesen Parametern fast 80 Prozent der Population infiziert wird. Das würde deutlich die Kapazitäten der Krankenhäuser und Notfallstationen überfordern. Daher ist es dringend erforderlich, die Kurve abzuflachen.

image

Abflachen kann man die Kurve auf zwei Arten. Man verringert die Ansteckungsrate zum Beispiel durch Isolation der Gesunden von den Kranken und/oder man verkürzt den Gesundungszeitraum durch Medikamente. Für einen Testlauf habe ich mal folgende Paramter angenommen.

# Flatten the Curve
transm, recov = 0.5, 0.14
max_t = 50

Die Rate der Neuinfektionen ist deutlich kleiner eins und auch der Gesundugszeitraum ist mit 0.14 verkürzt. Da die Kurve flacher verläuft, mußte auch der Zeitraum der Simulation mit max_t = 50 vergrößert werden.

Wenn man sich die Kurven nun anschaut, verläuft die Kurve der Infizierten nun tatsächlich flacher und hat ihren Peak bei etwa 40 Prozent. Das würde Krankenhäuser und Notfallstationen erheblich entlasten. Doch obwohl die Kurve flacher ist, wenn man über beide Kurven der Infizierten integrieren würde, wären vermutlich die Werte etwa gleich groß. Die Anzahl der Infizierten verringert sich nämlich nicht, sondern wird nur über einen größeren Zeitraum verteilt, so daß das Gesundheitssystem entlastet würde.

Das ist auch die Überlegung, die hinter den derzeitigen Shutdown-Maßnahmen steht. Denn das sollten wir aus Italien und Spanien gelernt haben: Bei einem überlasteten Gesundheitssystem ist die Sterberate höher, weil nicht mehr alle medizinisch versorgt werden können.

Caveat: Bei all meiner Begeisterung für Mathematik, das SIR-Modell ist ein Modell und daher nur innerhalb seiner eigenen Modellgrenzen (mathematisch) wahr. Übertragungen von Modellen auf die reale Welt sind immer mit Vorsicht zu genießen. Aber Modelle können helfen, die realen Ereignisse zu verstehen und (in Grenzen) auch Vorhersagen zu treffen.

Daher: Wenn Ihr mit diesem Modell spielen wollt, den vollständigen Quellcode findet Ihr in meinem GitLab-Repositorium – das Python-Script heißt sir.py.


(Kommentieren) 

image image



Über …

Der Schockwellenreiter ist seit dem 24. April 2000 das Weblog digitale Kritzelheft von Jörg Kantel (Neuköllner, EDV-Leiter Rentner, Autor, Netzaktivist und Hundesportler — Reihenfolge rein zufällig). Hier steht, was mir gefällt. Wem es nicht gefällt, der braucht ja nicht mitzulesen. Wer aber mitliest, ist herzlich willkommen und eingeladen, mitzudiskutieren!

Alle eigenen Inhalte des Schockwellenreiters stehen unter einer Creative-Commons-Lizenz, jedoch können fremde Inhalte (speziell Videos, Photos und sonstige Bilder) unter einer anderen Lizenz stehen.

Der Besuch dieser Webseite wird aktuell von der Piwik Webanalyse erfaßt. Hier können Sie der Erfassung widersprechen.

Diese Seite verwendet keine Cookies. Warum auch? Was allerdings die iframes von Amazon, YouTube und Co. machen, entzieht sich meiner Kenntnis.


Werbung

Diese Spalte wurde absichtlich leergelassen!


Werbung


image  image  image
image  image  image


image