[PYTHON] [Einführung in das SEIR-Modell] Versuchen Sie, COVID-19-Daten anzupassen ♬

Ich habe versucht, die Infektionsdaten der neuen Korona mit dem SEIR-Modell anzupassen. Die Methode ist dieselbe wie bei der vorherigen [Einführung zur Minimierung] SEIR-Modelldatenanalyse (. Die Infektionsdaten wurden von der folgenden Referenzstelle erhalten. Die folgenden Ergebnisse wurden in [Einführung in matplotlib] Lesen der Endzeit aus COVID-19-Daten ( für die Daten von Wuhan erhalten. fig_Hubei_.png Der Anfangswert wird ausgewählt und angepasst, so dass eine solche Kurve erhalten werden kann, und das Ergebnis wird wie folgt erhalten. SEIR_Hubei_b0.00_ip0.00_gamma14.61_N112177_E0318_I0389_R00.02_.png Daher möchte ich dieses Mal für jedes Land ähnliche Anpassungen vornehmen und prüfen, ob neue Erkenntnisse gewonnen werden können. Die Daten stammen aus dem Folgenden, und sofern nicht anders angegeben, handelt es sich um ** Daten zum 24. März 2020 **, die oben genannten Daten ** zum 22. März 2020 **. Beachten Sie außerdem, wie in der Code-Erläuterung erläutert, dass diesmal die Anpassung für die Infektionsdaten durchgeführt wird und die Anpassung, die auch die Heilungsdaten verwendet, von verschiedenen Programmen ausgeführt wird. 【Referenz】 CSSEGISandData/COVID-19

Was ich getan habe

・ Das Ende Japans ・ Codeerklärung ・ Anpassung nationaler Daten

・ Das Ende Japans

Ich habe versucht, es wie oben erwähnt sanft zu schreiben, aber da die Stadtregierung von Tokio angekündigt hat, dass die Stadt geschlossen wird, möchte ich erwähnen, ob das Ende Japans zuerst gesehen werden kann. Aus der Schlussfolgerung geht hervor, dass das Ende sicherlich in einem weiteren Monat zu sehen sein wird. Tatsächlich gab es in den obigen Daten vom 22. März eine Situation, in der ich eine Weile eingeschlafen bin und dies der Höhepunkt der Infektion war, aber da die Anzahl der Infektionen hier linear anstieg, wurde die Sättigung leicht verschoben. Als Anpassung habe ich die folgende Grafik für die Daten bis zum 24. März erhalten. fig_Japan_.png

Die Anpassung bestimmt gleichzeitig die Anzahl der Infektionen und die Heilungskurve. Die Daten für Japan sind vom 53. bis zum 59. etwas seltsam, bewegen sich aber im Allgemeinen natürlich. Also habe ich eine schöne Kurve wie folgt. Mit anderen Worten, das Ergebnis ist, dass ein Peak in ungefähr 10 Tagen auftritt, eine Heilungskurve in ungefähr einem Monat einen Peak aufweist und der Rest sanft beendet wird. SEIR_Japan_b1.59e-01_ip1.97e-23_gamma53_N1474_E01_I00_R04_.png

Die erhaltenen Parameter sind

beta_const=0.159
lp=1.97e-23
gamma=52.7
N=1474
R0 = 4.45

・ Codeerklärung

Der gesamte Code ist unten. Die beiden Gründe sind, dass sich die bereitgestellte Datenstruktur geändert hat und die aktuellen Daten wie in (2) einzeln gelesen werden müssen. Außerdem wurde in (2) die Anpassungsfunktion von der normalsten wahrscheinlichsten Funktion in den normalen quadratischen Fehler geändert, damit sie leichter in die Kurve passt. ①collective_particles/fitting_COVID.pycollective_particles/fitting_COVID2.py

Der einfache Code wird unten erklärt. Verwenden Sie die folgende Bibliothek. Dies ist die Summe der Artikel aus den beiden vorherigen Artikeln.

#include package
import numpy as np
from scipy.integrate import odeint
from scipy.optimize import minimize
import matplotlib.pyplot as plt
import pandas as pd

Das Folgende entspricht dem Zeichnen infizierter Daten.

#Lesen Sie CSV-Daten mit Pandas.
data = pd.read_csv('COVID-19/csse_covid_19_data/csse_covid_19_time_series/time_series_19-covid-Confirmed.csv')
data_r = pd.read_csv('COVID-19/csse_covid_19_data/csse_covid_19_time_series/time_series_19-covid-Recovered.csv')
data_d = pd.read_csv('COVID-19/csse_covid_19_data/csse_covid_19_time_series/time_series_19-covid-Deaths.csv')
    
confirmed = [0] * (len(data.columns) - 4)
confirmed_r = [0] * (len(data_r.columns) - 4)
confirmed_d = [0] * (len(data_d.columns) - 4)
days_from_22_Jan_20 = np.arange(0, len(data.columns) - 4, 1)

#City
city = "Hubei" #Wuhan Daten

#Prozessdaten
t_cases = 0

for i in range(0, len(data), 1):
    #if (data.iloc[i][1] == city): #for country/region
    if (data.iloc[i][0] == city):  #for province:/state  
        print(str(data.iloc[i][0]) + " of " + data.iloc[i][1])
        for day in range(4, len(data.columns), 1):
            confirmed[day - 4] += data.iloc[i][day] -  data_r.iloc[i][day] 
            confirmed_r[day - 4] += data_r.iloc[i][day]
            confirmed_d[day - 4] += data_d.iloc[i][day]

Verwenden Sie das SEIR-Modell.

#define differencial equation of seir model
def seir_eq(v,t,beta,lp,ip,N0):
    N=N0 #int(26749*1) #58403*4
    a = -beta*v[0]*v[2]/N
    b = beta*v[0]*v[2]/N-(1/lp)*v[1] #N
    c = (1/lp)*v[1]-(1/ip)*v[2]
    d = (1/ip)*v[2]
    return [a,b,c,d]

Hier ändert sich das erhaltene Bild in Abhängigkeit vom Wert von N0. Es ist gut, das zu passen, aber diesmal ist es nicht fertig. Bei der Anpassung von Hubei habe ich auf die folgenden Werte Bezug genommen. Für ** N und S0 wurde jedoch die tatsächliche Anzahl infizierter Personen (Werte verschoben) angenommen, basierend auf der Idee, dass die Bewohner nicht alle Teilnehmer des Spiels sind, sondern das Ziel der Infektion **. 【Referenz】 ・ Ich habe versucht, das Verhalten des neuen Koronavirus mit dem SEIR-Modell vorherzusagen. Anfangswerteinstellung

#solve seir model
N0 = 70939 #Hubei
N,S0,E0,I0=int(N0*1.),N0,int(318),int(389) #N is total population, S0 initial value of fresh peaple
ini_state=[S0,E0,I0,0] #initial value of diff. eq.
beta,lp,ip=1, 2, 7.4 
t_max=60 #len(days_from_22_Jan_20)
dt=0.01
t=np.arange(0,t_max,dt)
obs_i = confirmed

Eine Funktion, die einen Auswertungswert für einen Eingabeparameter zurückgibt. Das folgende v [2] gibt die Anzahl der Infektionen zurück.

#function which estimate i from seir model func 
def estimate_i(ini_state,beta,lp,ip,N):
    v=odeint(seir_eq,ini_state,t,args=(beta,lp,ip,N))
    est=v[0:int(t_max/dt):int(1/dt)]
    return est[:,2]

Die Zielfunktion zur Minimierung unten (im Folgenden wird die wahrscheinlichste Funktion verwendet).

#define logscale likelihood function
def y(params):
    est_i=estimate_i(ini_state,params[0],params[1],params[2],params[3])
    return np.sum(est_i-obs_i*np.log(np.abs(est_i)))

Finden Sie den Minimalwert mit minim @ scipy und berechnen Sie die Basisreproduktionsnummer.

#optimize logscale likelihood function
mnmz=minimize(y,[beta,lp,ip,N],method="nelder-mead")
print(mnmz)
#R0
beta_const,lp,gamma_const,N = mnmz.x[0],mnmz.x[1],mnmz.x[2],mnmz.x[3] #Infektionsrate, Wartezeit der Infektion, Entfernungsrate (Wiederherstellungsrate)
print(beta_const,lp,gamma_const,N)
R0 = N*beta_const*(1/gamma_const)
print(R0)

Grafische Darstellung der Berechnungsergebnisse.

#plot reult with observed data
fig, (ax1,ax2) = plt.subplots(2,1,figsize=(1.6180 * 4, 4*2))
lns1=ax1.plot(obs_i,"o", color="red",label = "data")
lns2=ax1.plot(confirmed_r,"*", color="green",label = "data_r")
lns3=ax1.plot(estimate_i(ini_state,mnmz.x[0],mnmz.x[1],mnmz.x[2],mnmz.x[3]), label = "estimation")
lns0=ax1.plot(t,odeint(seir_eq,ini_state,t,args=(mnmz.x[0],mnmz.x[1],mnmz.x[2],mnmz.x[3])))
lns_ax1 = lns1+lns2 + lns3 + lns0
labs_ax1 = [l.get_label() for l in lns_ax1]
ax1.legend(lns_ax1, labs_ax1, loc=0)
ax1.set_ylim(0,N0)

Im Folgenden wird ein Diagramm mit großer Spannweite angezeigt, damit das Ende sichtbar ist.

t_max=200 #len(days_from_22_Jan_20)
t=np.arange(0,t_max,dt)

lns4=ax2.plot(obs_i,"o", color="red",label = "data")
lns5=ax2.plot(confirmed_r,"*", color="green",label = "recovered")
lns6=ax2.plot(t,odeint(seir_eq,ini_state,t,args=(mnmz.x[0],mnmz.x[1],mnmz.x[2],mnmz.x[3])))
ax2.legend(['data','data_r','Susceptible','Exposed','Infected','Recovered'], loc=1)
ax2.set_title('SEIR_b{:.2f}_ip{:.2f}_gamma{:.2f}_N{:.2f}_E0{:d}_I0{:d}_R0{:.2f}'.format(beta_const,lp,gamma_const,N,E0,I0,R0))
ax1.grid()
ax2.grid()
plt.savefig('./fig/SEIR_{}_b{:.2f}_ip{:.2f}_gamma{:.2f}_N{:.2f}_E0{:d}_I0{:d}_R0{:.2f}_.png'.format(city,beta_const,lp,gamma_const,N,E0,I0,R0)) 
plt.show()
plt.close()

Andererseits wurden bei der gleichzeitigen Anpassung der Anzahl von Infektionen und der Anzahl von Heilungen die Bewertungsfunktion und die Zielfunktion in der Mitte wie folgt geändert.

#function which estimate i from seir model func 
def estimate_i(ini_state,beta,lp,ip,N):
    v=odeint(seir_eq,ini_state,t,args=(beta,lp,ip,N))
    est=v[0:int(t_max/dt):int(1/dt)] 
    return est[:,2],est[:,3] #v0-S,v1-E,v2-I,v3-R
    
#define logscale likelihood function
def y(params):
    est_i_2,est_i_3=estimate_i(ini_state,params[0],params[1],params[2],params[3])
    return np.sum((est_i_2-obs_i_2)*(est_i_2-obs_i_2)+(est_i_3-obs_i_3)*(est_i_3-obs_i_3))

In diesem Fall ist es möglich, nur die Anzahl der Infektionen oder nur die Anzahl der Heilungen anzupassen.

・ Anpassung nationaler Daten

· Iran Der Iran, der eine relativ hohe Heilungsrate aufweist, sättigt schneller als Japan und wird wahrscheinlich enden, aber die Anzahl der Infektionen steigt immer noch und die Heilungsrate ist träge, so dass es möglicherweise länger dauert. fig_Iran_.png SEIR_Iran_b1.60e-01_ip1.35e-23_gamma17_N38098_E01_I00_R0350_.png

·Korea Irgendwie wurde die Verzerrung im Vergleich zu den vorherigen Daten deutlicher und die Glaubwürdigkeit der Daten wurde gebrochen. Dennoch steigt die Heilungsrate insgesamt an und das Ende scheint relativ früh zu sein. fig_Korea, South_.png SEIR_Korea, South_b1.98e-01_ip5.42e-32_gamma56_N16115_E01_I00_R057_.png

·Italien Die Sterblichkeitsrate ist extrem hoch und gefährlich, aber die Daten sind sehr sauber und anspruchsvoll. Daher war es einfach zu montieren und ich kam sauber voran. Die Heilungsrate beträgt immer noch etwa 10%, und es scheint, dass es einige Zeit dauern wird (der Heilungspeak beträgt 2 Monate), aber wenn der Peak danach gesehen wird, ist das Ende nahe. fig_Italy_.png SEIR_Italy_b1.61e-01_ip6.22e-26_gamma78_N116637_E01_I00_R0242_.png

Das Folgende ist die anfängliche Expansionsperiode, und es scheint, dass die Anpassungsgenauigkeit schlecht und nicht zuverlässig ist, aber ich werde sie veröffentlichen. ·Spanien Es steht immer mehr auf, aber es ist schwer zu erreichen. fig_Spain_.png SEIR_Spain_b1.50e-01_ip1.47e-30_gamma69_N104007_E01_I00_R0226_.png ·Deutschland Dies ist noch nicht abgeschlossen, und die Anzahl der Heilungen ist in erster Linie zu gering, so dass es den Anschein hat, dass es sich in der anfänglichen Expansionsphase befindet. fig_Germany_.png SEIR_Germany_b1.22e-01_ip1.51e-37_gamma160_N29502_E01_I00_R023_.png

Zusammenfassung

・ Ich habe versucht, COVID-19-Daten anzupassen ・ Japan, Iran und Südkorea werden nach China voraussichtlich ein Ende haben. ・ Andere Europa und die Vereinigten Staaten befinden sich noch in der Expansionsphase, und es ist schwierig, das Ende vorherzusagen.

・ Ich habe diesmal ungefähr gesprochen, möchte aber eine detailliertere Analyse durchführen, während ich mir die täglichen Updates ansehe.

Bonus

Die gleichzeitige Anpassung von Wuhan ist wie folgt Wuhans Daten scheinen durch dieses Modell nicht erklärt zu werden (> <) Originale Daten fig_Hubei_.png Nur Infektionsdaten anpassen SEIR_Hubei_b5.47e-01_ip4.97e+00_gamma15_N23774_E0318_I0389_R0866_.png Heilungsdaten passen nur SEIR_Hubei_b2.11e-01_ip1.15e+00_gamma6_N176229_E0318_I0389_R06739_.png Anpassen von Infektions- und Heilungsdaten SEIR_Hubei_b3.68e+00_ip2.88e+01_gamma23_N-1287313_E0318_I0389_R0-204877_.png

Recommended Posts

[Einführung in das SEIR-Modell] Versuchen Sie, COVID-19-Daten anzupassen ♬
[Einführung zur Minimierung] Datenanalyse mit SEIR-Modell ♬
[Einführung in das SIR-Modell] Prognostizieren Sie die Endzeit jedes Landes mit der COVID-19-Datenanpassung ♬
Passend zu ARMA, ARIMA Modell
[Einführung in matplotlib] Lesen Sie die Endzeit aus den COVID-19-Daten ♬
[Einführung in das Modell der Infektionskrankheiten] Ich habe versucht, zu passen und zu spielen ♬
[Einführung in Tensorflow] Verstehen Sie Tensorflow richtig und versuchen Sie, ein Modell zu erstellen
Einführung in die statistische Modellierung für die Datenanalyse GLM-Modellauswahl
Versuchen Sie, Daten in MongoDB abzulegen
[Einführung in das SIR-Modell] Betrachten Sie das passende Ergebnis von Diamond Princess ♬
[Einführung in Python3, Tag 17] Kapitel 8 Datenziele (8.1-8.2.5)
[Einführung in Python3, Tag 17] Kapitel 8 Datenziele (8.3-8.3.6.1)
[Einführung in Python3 Tag 19] Kapitel 8 Datenziele (8.4-8.5)
[Einführung in Python3 Tag 18] Kapitel 8 Datenziele (8.3.6.2 bis 8.3.6.3)
Versuchen Sie, mit Pandas in ordentliche Daten umzuwandeln
[Einführung in Data Scientist] Grundlagen von Python ♬
Versuchen Sie, mit django-import-export csv-Daten zu django hinzuzufügen
Versuchen Sie, Doujin-Musikdaten mit Pandas zu aggregieren
Eine Einführung in die statistische Modellierung für die Datenanalyse
[Einführung in Python] Umgang mit Daten im JSON-Format
Vorbereitung zum Versuch "Data Science 100 Knock (Strukturierte Datenverarbeitung)"
[Einführung in cx_Oracle] (5.) Umgang mit japanischen Daten
Einführung in MQTT (Einführung)
Einführung in Scrapy (1)
Erste Schritte mit Supervisor
Einführung in Tkinter 1: Einführung
Einführung in PyQt
Einführung in Scrapy (2)
[Linux] Einführung in Linux
Einführung in Scrapy (4)
Einführung in discord.py (2)
Lesehinweis: Einführung in die Datenanalyse mit Python
Versuchen Sie, Twitter-Daten in SPAM und HAM zu unterteilen
[CovsirPhy] COVID-19 Python-Paket für die Datenanalyse: SIR-F-Modell
[CovsirPhy] COVID-19 Python-Paket für die Datenanalyse: SIR-Modell
Versuchen Sie, die in Firefox gespeicherten Anmeldedaten zu entschlüsseln
[Technisches Buch] Einführung in die Datenanalyse mit Python -1 Kapitel Einführung-