Introduction Dies ist ein Einführungsartikel über das Python-Paket CovsirPhy, mit dem Sie COVID-19-Daten (z. B. die Anzahl der PCR-Positiven) einfach herunterladen und analysieren können.
** Dieses Mal werde ich die Szenarioanalyse (Parametervergleich) erläutern. ** ** **
Die englische Version des Dokuments lautet CovsirPhy: COVID-19-Analyse mit phasenabhängigen SIRs, [Kaggle: COVID-19-Daten mit SIR-Modell]( Weitere Informationen finden Sie unter https://www.kaggle.com/lisphilar/covid-19-data-with-sir-model.
CovsirPhy kann mit der folgenden Methode installiert werden! Bitte verwenden Sie Python 3.7 oder höher oder Google Colaboratory.
--Stabile Version: pip install covsirphy --upgrade
pip install" git + https://github.com/lisphilar/covid19-sir.git#egg=covsirphy "
import covsirphy as cs
cs.__version__
# '2.8.3'
Ausführungsumgebung | |
---|---|
OS | Windows Subsystem for Linux / Ubuntu |
Python | version 3.8.5 |
Klicken Sie hier für den Code [^ 2], um die tatsächlichen Daten von COVID-19 Data Hub [^ 1] herunterzuladen:
data_loader = cs.DataLoader("input")
jhu_data = data_loader.jhu()
population_data = data_loader.population()
In der Tabelle und Grafik dieses Artikels werden die Daten Japans zum 3. Oktober 2020 (vom Ministerium für Gesundheit, Arbeit und Soziales angekündigter nationaler Gesamtwert) vom folgenden Code verwendet [^ 3]. COVID-19 Data Hub [^ 1] enthält ebenfalls japanische Daten, scheint sich jedoch von dem vom Ministerium für Gesundheit, Arbeit und Soziales angekündigten nationalen Gesamtwert zu unterscheiden.
[^ 3]: [CovsirPhy] COVID-19 Python-Paket für die Datenanalyse: S-R-Trendanalyse
# (Optional)Datenerfassung beim Ministerium für Gesundheit, Arbeit und Soziales
#Wenn Sie eine Fehlermeldung erhalten"pip install requests aiohttp"
japan_data = data_loader.japan()
jhu_data.replace(japan_data)
print(japan_data.citation)
Bestätigung der tatsächlichen Daten:
#Instanzgenerierung einer Klasse zur Analyse
snl = cs.Scenario(jhu_data, population_data, country="Japan")
#Grafische Anzeige der tatsächlichen Daten
snl.records(filename=None)
Einteilung in Phase durch S-R-Trendanalyse [^ 3] und Periodenanpassung [^ 4]:
[^ 4]: [CovsirPhy] COVID-19 Python-Paket für die Datenanalyse: Optimieren der Phaseneinstellungen
# S-R trend analysis
snl.trend(filename=None)
# Separate 0th phase
snl.separate("01Apr2020")
#Listenanzeige
snl.summary()
Type | Start | End | Population | |
---|---|---|---|---|
0th | Past | 06Feb2020 | 31Mar2020 | 126529100 |
1st | Past | 01Apr2020 | 21Apr2020 | 126529100 |
2nd | Past | 22Apr2020 | 06Jul2020 | 126529100 |
3rd | Past | 07Jul2020 | 23Jul2020 | 126529100 |
4th | Past | 24Jul2020 | 01Aug2020 | 126529100 |
5th | Past | 02Aug2020 | 14Aug2020 | 126529100 |
6th | Past | 15Aug2020 | 28Aug2020 | 126529100 |
7th | Past | 29Aug2020 | 08Sep2020 | 126529100 |
8th | Past | 09Sep2020 | 19Sep2020 | 126529100 |
9th | Past | 20Sep2020 | 03Oct2020 | 126529100 |
Parameter estimation with SIR-F model[^5]:
[^ 5]: [CovsirPhy] COVID-19 Python-Paket für die Datenanalyse: Parameterschätzung
# Parameter estimation
snl.estimate(cs.SIRF)
#Listenanzeige (Teil)
est_cols = ["Start", "End", "Rt", *cs.SIRF.PARAMETERS, "RMSLE"]
snl.summary(columns=est_cols)
Start | End | Rt | theta | kappa | rho | sigma | RMSLE | |
---|---|---|---|---|---|---|---|---|
0th | 06Feb2020 | 31Mar2020 | 3.6 | 0.0197967 | 0.000781433 | 0.110404 | 0.0292893 | 0.693445 |
1st | 01Apr2020 | 21Apr2020 | 13.53 | 0.00119307 | 0.000954275 | 0.119908 | 0.00789786 | 0.17892 |
2nd | 22Apr2020 | 06Jul2020 | 0.37 | 0.090172 | 0.000858737 | 0.0264027 | 0.0636349 | 0.883253 |
3rd | 07Jul2020 | 23Jul2020 | 1.93 | 0.000466376 | 8.04707e-05 | 0.133382 | 0.0689537 | 0.0318977 |
4th | 24Jul2020 | 01Aug2020 | 1.78 | 7.63782e-05 | 0.000231109 | 0.135991 | 0.0760643 | 0.0193947 |
5th | 02Aug2020 | 14Aug2020 | 1.4 | 0.00100709 | 0.000215838 | 0.100929 | 0.0716643 | 0.0797834 |
6th | 15Aug2020 | 28Aug2020 | 0.82 | 0.000562179 | 0.000899694 | 0.0783473 | 0.0943161 | 0.021244 |
7th | 29Aug2020 | 08Sep2020 | 0.7 | 0.00168729 | 0.00119958 | 0.0616905 | 0.0863032 | 0.0182731 |
8th | 09Sep2020 | 19Sep2020 | 0.78 | 0.00293238 | 0.00132534 | 0.0793277 | 0.099966 | 0.0282502 |
9th | 20Sep2020 | 03Oct2020 | 0.87 | 0.000463924 | 0.000984493 | 0.0793406 | 0.090479 | 0.0274187 |
In der Covsirphy-Klasse "Szenario" können Sie mehrere Arten von Phaseneinstellungen [^ 3] registrieren. "Phase [^ 3] Einstellungen" heißt "Szenario".
Wie in der folgenden Tabelle gezeigt, können beispielsweise "Hauptszenario" und "Medizin-Szenario" parallel eingestellt werden, um eine Szenarioanalyse durchzuführen. Die Daten werden unter der Annahme aufgeführt, dass die tatsächlichen Daten von 2020/2/6 bis 2020/10/3 vorliegen.
Name des Szenarios | 0th-9th | 10th | 11th |
---|---|---|---|
Main | 2/6 - 10/3 | 10/4 - 12/31 | 2021/1/1 - 2020/4/10 |
Medicine | 2/6 - 10/3 | 10/4 - 12/31 | 2021/1/1 - 2020/4/10 |
Schätzen Sie die Parameter der 0.-9. Phase für jedes Szenario und simulieren Sie die Anzahl der Patienten unter der Annahme, dass die Parameter der 10. Phase gleich sind und sich $ \ sigma $ zwischen der 10. und 11. Phase für das Medizin-Szenario verdoppelt. .. Zu diesem Zeitpunkt kann durch Vergleich des Übergangs der Anzahl der Patienten zwischen 2021/1 / 1-2021 / 4/10 der Verdopplungseffekt von $ \ sigma $ geschätzt werden.
Es ist unwahrscheinlich, dass es sich aufgrund der Entwicklung neuer Medikamente sofort verdoppelt, aber bitte bezeichnen Sie es als Demonstration.
Um die Auswirkung von Parametern auf die Anzahl der Patienten zu untersuchen, erstellen Sie Szenarien mit unterschiedlichen Parametern, simulieren Sie die Anzahl der Patienten und vergleichen Sie sie. Zunächst wird das Szenario selbst wie folgt erstellt / initialisiert / gelöscht.
Sie können die Methode "Scenario.clear (name =" Name des neuen Szenarios ", template =" Name des Quellenszenarios ")" verwenden, um ein konfiguriertes Szenario zu kopieren und ein neues zu erstellen. Beim Erstellen eines "neuen" Szenarios mit dem Hauptszenario (Standard) als Kopierquelle
#Erstelle neu
snl.clear(name="New", template="Main")
#Listenanzeige
cols = ["Start", "End", "Rt", *cs.SIRF.PARAMETERS]
snl.summary(columns=cols)
(1.-8. Phase wird auf Papier weggelassen)
Start | End | Rt | theta | kappa | rho | sigma | |
---|---|---|---|---|---|---|---|
('Main', '0th') | 06Feb2020 | 31Mar2020 | 3.85 | 0.0185683 | 0.000768779 | 0.112377 | 0.027892 |
('Main', '9th') | 20Sep2020 | 03Oct2020 | 0.87 | 0.000463924 | 0.000984493 | 0.0793406 | 0.090479 |
('New', '0th') | 06Feb2020 | 31Mar2020 | 3.85 | 0.0185683 | 0.000768779 | 0.112377 | 0.027892 |
('New', '9th') | 20Sep2020 | 03Oct2020 | 0.87 | 0.000463924 | 0.000984493 | 0.0793406 | 0.090479 |
Verwenden Sie zum Löschen "Scenario.delete (name =" szenario name ")". Löschen Sie das "Neue" Szenario und bringen Sie nur das "Hauptszenario" in den registrierten Zustand zurück.
#Szenario löschen
snl.delete(name="New")
#Listenanzeige
snl.summary(columns=cols)
(1.-8. Phase wird auf Papier weggelassen)
Start | End | Rt | theta | kappa | rho | sigma | |
---|---|---|---|---|---|---|---|
0th | 06Feb2020 | 31Mar2020 | 3.85 | 0.0185683 | 0.000768779 | 0.112377 | 0.027892 |
9th | 20Sep2020 | 03Oct2020 | 0.87 | 0.000463924 | 0.000984493 | 0.0793406 | 0.090479 |
Von hier aus werde ich erklären, wie eine Phase hinzugefügt wird. Sie können eine neue Phase hinzufügen, indem Sie das letzte Datum angeben, z. B. "Scenario.add (end_date =" 31Dec2020 ")".
# Main:Bis zu 31Dec2020 als 10. Phase hinzugefügt
snl.add(end_date="31Dec2020", name="Main")
#Listenanzeige
snl.summary(columns=cols, name="Main")
(1.-8. Phase wird auf Papier weggelassen)
Start | End | Rt | theta | kappa | rho | sigma | |
---|---|---|---|---|---|---|---|
0th | 06Feb2020 | 31Mar2020 | 3.61 | 0.0190222 | 0.00099167 | 0.110766 | 0.0290761 |
9th | 20Sep2020 | 03Oct2020 | 0.87 | 0.000463924 | 0.000984493 | 0.0793406 | 0.090479 |
10th | 04Oct2020 | 31Dec2020 | 0.87 | 0.000463924 | 0.000984493 | 0.0793406 | 0.090479 |
Da keine Parameter eingestellt wurden, haben die hinzugefügten Parameter der 10. Phase dieselben Werte wie die der 9. Phase.
Sie können eine neue Phase hinzufügen, indem Sie die Anzahl der Tage angeben, z. B. "Scenario.add (Tage = 100)".
# main: 01Jan2021 (Der Tag nach dem letzten Tag des 10 ..)100 Tage als 11. hinzugefügt
snl.add(days=100, name="Main").summary(columns=cols)
#Listenanzeige
snl.summary(columns=cols, name="Main")
(1.-8. Phase wird auf Papier weggelassen)
Start | End | Rt | theta | kappa | rho | sigma | |
---|---|---|---|---|---|---|---|
0th | 06Feb2020 | 31Mar2020 | 3.61 | 0.0190222 | 0.00099167 | 0.110766 | 0.0290761 |
9th | 20Sep2020 | 03Oct2020 | 0.87 | 0.000463924 | 0.000984493 | 0.0793406 | 0.090479 |
10th | 04Oct2020 | 31Dec2020 | 0.87 | 0.000463924 | 0.000984493 | 0.0793406 | 0.090479 |
11th | 01Jan2021 | 10Apr2021 | 0.87 | 0.000463924 | 0.000984493 | 0.0793406 | 0.090479 |
Da keine Parameter eingestellt wurden, haben die hinzugefügten Parameter der 11. Phase dieselben Werte wie die der 10. Phase.
Sie können eine neue Phase hinzufügen, indem Sie einen Parameterwert angeben, z. B. "Scenario.add (sigma = 0.18)".
In diesem Artikel wird zur Schätzung des Verdopplungseffekts von $ \ sigma $ der geschätzte Wert von $ \ sigma $ in der Phase des Hauptszenarios 11 (letzte Phase) mit der Methode "Scenario.get ()" ermittelt.
sigma_last = snl.get("sigma", phase="last", name="Main")
sigma_med = sigma_last * 2
print(round(sigma_last, 3), round(sigma_med, 3))
# -> 0.09 0.181
Erstellen Sie ein Medizin-Szenario mit dem Hauptszenario als Kopierquelle. Zu diesem Zeitpunkt werden zukünftige Phasen (10., 11. Phase) gelöscht. Fügen Sie dann die 10. Phase (gleiche Parameter wie Main) und die 11. Phase ($ \ sigma $ wird verdoppelt) hinzu.
snl.clear(name="Medicine", template="Main")
snl.add(end_date="31Dec2020", name="Medicine")
# Medicine: 01Jan2021 (Der Tag nach dem letzten Tag des 10 ..)100 Tage als 11. hinzugefügt
snl.add(sigma=sigma_med, days=100, name="Medicine")
#Listenanzeige
snl.summary(columns=cols, name="Medicine")
(1.-8. Phase wird auf Papier weggelassen)
Start | End | Rt | theta | kappa | rho | sigma | |
---|---|---|---|---|---|---|---|
0th | 06Feb2020 | 31Mar2020 | 3.85 | 0.0185683 | 0.000768779 | 0.112377 | 0.027892 |
9th | 20Sep2020 | 03Oct2020 | 0.87 | 0.000463924 | 0.000984493 | 0.0793406 | 0.090479 |
10th | 04Oct2020 | 31Dec2020 | 0.87 | 0.000463924 | 0.000984493 | 0.0793406 | 0.090479 |
11th | 01Jan2021 | 10Apr2021 | 0.44 | 0.000463924 | 0.000984493 | 0.0793406 | 0.180958 |
Da sich $ sigma $ verdoppelt hat, hat sich die effektive Anzahl der Reproduktionen $ Rt $ halbiert.
Nebenbei können Sie eine Phase mit "Scenario.delete (phase = [" Phasenname "])" löschen. Fügen Sie hier die 12. Phase hinzu und löschen Sie sie.
#Phase hinzufügen
snl.add(days=30, name="Medicine")
#Phase löschen
snl.delete(phases=["last"], name="Medicine")
Überprüfen Sie das Diagramm, um festzustellen, ob die Parameterübergänge wie geplant eingestellt sind. Verwenden Sie "Scenario.history (Parametername)". Verwenden Sie den Szenarionamen als Seriennamen.
Ob $ \ sigma $ in der 11. Phase des Medizin-Szenarios (2021/1/1 --2021 / 4/1) verdoppelt wird:
snl.history("sigma", filename=None)
Ob die effektive Reproduktionszahl $ Rt $ bis zur 11. Phase (2021/1/1 --2021 / 4/1) des Medizinszenarios halbiert wird:
snl.history("Rt", filename=None)
Sie können auch das Simulationsergebnis der Anzahl der Patienten in "Scenario.history (Variablenname)" abrufen.
snl.history("Infected", filename=None)
Die Zahl der Infizierten nimmt aufgrund der Verdoppelung von $ \ sigma $ rapide ab. Es ist unwahrscheinlich, dass es sich aufgrund der Entwicklung neuer Medikamente sofort verdoppelt. Durch Ändern der Parameterwerte in realistische Werte und Durchführen von Simulationen ist es jedoch möglich, die Anzahl der infizierten Personen und die Endzeit in der Zukunft abzuschätzen.
Wenn Sie den Wert im Datenrahmenformat erhalten möchten, verwenden Sie bitte die Methode "Scenario.track ()".
snl.track().tail()
Scenario | Date | Confirmed | Fatal | Infected | Recovered | Population | Rt | theta | kappa | rho | sigma | 1/alpha2 [day] | 1/gamma [day] | alpha1 [-] | 1/beta [day] | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
425 | Medicine | 2021-04-06 | 108463 | 1884 | 0 | 106579 | 126529100 | 0.44 | 0.000463924 | 0.000984493 | 0.0793406 | 0.180958 | 1015 | 5 | 0 | 12 |
426 | Medicine | 2021-04-07 | 108463 | 1884 | 0 | 106579 | 126529100 | 0.44 | 0.000463924 | 0.000984493 | 0.0793406 | 0.180958 | 1015 | 5 | 0 | 12 |
427 | Medicine | 2021-04-08 | 108463 | 1884 | 0 | 106579 | 126529100 | 0.44 | 0.000463924 | 0.000984493 | 0.0793406 | 0.180958 | 1015 | 5 | 0 | 12 |
428 | Medicine | 2021-04-09 | 108463 | 1884 | 0 | 106579 | 126529100 | 0.44 | 0.000463924 | 0.000984493 | 0.0793406 | 0.180958 | 1015 | 5 | 0 | 12 |
429 | Medicine | 2021-04-10 | 108463 | 1884 | 0 | 106579 | 126529100 | 0.44 | 0.000463924 | 0.000984493 | 0.0793406 | 0.180958 | 1015 | 5 | 0 | 12 |
Vergleichen Sie die Merkmalswerte, um die Merkmale des Szenarios zu verstehen. Da es jedoch bedeutungslos ist, die durchschnittliche Anzahl infizierter Personen zu vergleichen, werden die charakteristischen Werte wie folgt festgelegt.
Klicken Sie hier für Code und Ausgabeergebnisse:
snl.describe()
max(Infected) | argmax(Infected) | Infected on 11Apr2021 | Fatal on 11Apr2021 | 11th_Rt | |
---|---|---|---|---|---|
Main | 15154 | 21Apr2020 | 512 | 1970 | 0.87 |
Medicine | 15154 | 21Apr2020 | 0 | 1884 | 0.44 |
Die effektive Reproduktionsnummer $ Rt $ wird nur für Phasen ausgegeben, deren Werte sich zwischen den Szenarien unterscheiden.
Wenn die aktuellen Parameter bis 2021/4/10 andauern, scheint die vorhergesagte Anzahl infizierter Personen selbst ab 4/11 bei etwa 512 zu liegen. Wenn sich $ \ sigma $ verdoppelt, infizieren sich die infizierten Personen Die vorhergesagte Zahl ist 0.
Vielen Dank, dass Sie diesmal auch stöbern! Wir würden uns freuen, wenn Sie uns Ihre Meinung mitteilen könnten, beispielsweise das Hinzufügen charakteristischer Werte.
Nächstes Mal werde ich erklären, wie die Wirksamkeit von Impfstoffen bewertet werden kann.
Recommended Posts