[PYTHON] Schätzen Sie die maximale Infektiosität des neuen Coronavirus ab

Einführung

Es wurde eine Notfallerklärung zur Konvergenz der neuen Coronavirus-Infektion (COVID-19) abgegeben, und obwohl dies in anderen Ländern nicht so sehr wie eine Sperrung war, wurden verschiedene Branchen geschlossen, Veranstaltungen abgesagt, Fernarbeit, verschiedene Selbstbeherrschungen usw. Beeinflusst das Leben vieler Menschen. Die Bedingung für die Konvergenz einer Infektionskrankheit wie Korona ist, dass die Anzahl der wirksamen Reproduktionen (die Gesamtzahl der von einer infizierten Person verursachten Sekundärinfektionen) dauerhaft unter 1 liegt. Vorheriger Artikel beschreibt die Latenzzeit und die Infektionsperiode als eine der Methoden zur Berechnung der effektiven Reproduktionszahl aus den Daten der Anzahl infizierter Personen in chronologischer Reihenfolge. Ich habe eine einfache Methode gezeigt, um separat zu berechnen. Was passiert in diesem Artikel, wenn die Infektiosität, dh die Intensität des Färbens anderer nach der Infektion, mit dem Effekt berücksichtigt wird, der sich mit der Zeit ändert, ** insbesondere wie viele Tage nach der Infektion der Höhepunkt der Infektiosität * Ich würde gerne über * schätzen. Kann es insbesondere auch während der Latenzzeit durch Medienberichte infiziert werden? Da der Verdacht gemeldet wurde, denke ich, dass dies auch eine Überprüfung seiner Echtheit sein wird.

Vorausgesetztes Wissen

Hier sind drei Studien, die die Grundlage für die Überprüfung dieses Artikels bilden. Die erste ist Umfrage der Cluster Countermeasures Group des Ministeriums für Gesundheit, Arbeit und Soziales. Laut der Gruppe der Cluster-Gegenmaßnahmen wird die Anzahl der grundlegenden Reproduktionen (es scheint, dass Umweltfaktoren nicht berücksichtigt werden, wenn sie grundlegend sind, und Richtlinien werden auch ergriffen, wenn sie wirksam sind) wie in der folgenden Grafik dargestellt erfasst. クラスター対策班のR0.jpg Zum Glück wird ** der Durchschnittswert mit 1,49 ** angegeben (hier wichtig). Mit anderen Worten, während die meisten Menschen nicht infizieren (0 Personen), können viele Menschen gleichzeitig infiziert werden, z. B. 11 oder 12. Daher sollte R0 als eine breitschwänzige Verteilung betrachtet werden. Der zweite ist [Forschungsbericht Nr. 13](https://www.imperial.ac.uk/mrc-global-infectious-disease-analysis/covid-19/report-13-europe] des Imperial College London im Vereinigten Königreich. -npi-Auswirkungen /). Die Universität hat frühzeitig einen Bericht über COVID-19 veröffentlicht und scheint einen starken Einfluss auf die britische Politik zu haben. In diesem Bericht ist zu beachten, dass die Infektiosität unter Verwendung der Gammaverteilung ausgedrückt wird, wie in der folgenden Abbildung gezeigt. ICL_Rep13_Fig7.jpg Der Durchschnittswert beträgt 6,5 [Tage], aber der Spitzenwert scheint zwischen dem 4. und 5. Tag zu liegen. Der dritte ist Bericht über die Latenzzeit von COVID-19 der Johns Hopkins University in den USA. Schätzungen-5-Tage-für-Inkubationszeit.html). Demnach beträgt die mittlere Latenzzeit 5,1 Tage **. Dies, kombiniert mit der Grafik aus der zweiten Studie, deutet darauf hin, dass ** vor dem Beginn ** möglicherweise ein Höhepunkt der Infektiosität vorliegt **. Basierend auf den oben genannten drei Studien werden wir die maximale Infektiosität untersuchen, insbesondere anhand von Daten zur Anzahl der Infizierten in Japan.

Berechnungsmodell

Um die Grundanzahl der Reproduktionen unter Berücksichtigung der Infektiosität zu berechnen, betrachten Sie ein Modell, das auf dem SEIR-Modell basiert, einer leicht verbesserten Version von Vorheriger Artikel. Ich würde gerne. Siehe folgende Abbildung. R0_calculation_with_bnomi.jpg Im vorherigen Artikel wurde gesagt, dass Sekundärinfektionen mit der gleichen Infektionsintensität von infizierten Personen während des Infektionszeitraums auftreten (I), aber dieses Mal werden wir die folgenden Annahmen treffen.

  1. Eine Infektion kann auch während der Latenzzeit auftreten (E).
  2. Die Sekundärinfektion ergibt sich aus der Anzahl der infizierten Personen, die sich aus der Anzahl der infizierten Personen und der Intensität der Infektion ergibt.
  3. Die Infektionsintensität wird durch eine Funktion angegeben, die von der Anzahl der Tage seit dem Infektionsdatum abhängt.
  4. Die Summe aus Latenzzeit (lp) und Infektionszeit (ip) beträgt 13.

Zusätzlich nimmt die Funktion der Infektionsintensität von 3 eine Binomialverteilung an. Dies liegt daran, dass die Handhabung einfacher ist, da im Vergleich zur Gammaverteilung nur ein Parameter erforderlich ist. Nun wird die Formel für die Anzahl der Grundreproduktionen basierend auf der Binomialverteilung wie folgt bestimmt.

R_0(y) = r_0 \cdot {}_N C_y \cdot \theta^y (1-\theta)^{N-y}

$ r_0 $ ist eine Konstante, $ \ theta $ ist ein binärer Verteilungsparameter, $ y $ ist die Anzahl der Tage seit dem Infektionsdatum und $ N $ ist die Summe aus Latenzzeit und Infektionsperiode (= 13). Eine Sekundärinfektion von einer infizierten Person zu einer infizierten Person wird durch Faltung definiert, wie in der folgenden Gleichung gezeigt. $ P (t) $ ist die Anzahl der bestätigten Positiven zum Zeitpunkt $ t $.

P(t+N) = \sum_{y=0}^N R_0(N-y) P(t+y)

Wenn Sie diese transformieren, erhalten Sie die Formel zur Berechnung von $ r_0 $.

r_0 = \frac{P(t+N)}{\sum_{y=0}^N {}_N C_{N-y} \cdot \theta^{N-y} (1-\theta)^{y} P(t+y)}

Es ist ein wenig unnatürlich, dass sowohl der Nenner als auch das Molekül $ P (t + N) $ haben, aber die Berechnung beinhaltet den Effekt, dass unmittelbar am Tag der Infektion eine Sekundärinfektion verursacht wird. Nun möchte ich gemäß diesem $ R_0 (y) $ den Infektiositätsintensitätsparameter $ \ theta $ bestimmen, dh den Zeitpunkt, zu dem die Infektiosität maximiert ist $ N \ theta $, aber ich werde mit der folgenden Strategie fortfahren.

  1. Bestimmen Sie $ \ theta $ entsprechend.
  2. Finden Sie $ r_0 $ aus der Formel von $ R_0 (y) $ und den tatsächlichen Daten.
  3. Ermitteln Sie den Durchschnittswert der Verteilung von $ r_0 $.
  4. Wiederholen Sie die Schritte 1 bis 3, um $ \ theta $ zu schätzen, wobei $ E [r_0; \ theta] $ als wahrer Wert 1,49 Tagen am nächsten kommt.

In Schritt 4 könnte, wenn die Verteilung der Clustergruppe numerische Daten sind, eine Methode wie das Berechnen des Abstands zwischen den Wahrscheinlichkeitsverteilungen und deren Optimierung in Betracht gezogen werden, da das Bild jedoch nur Daten enthält ** Ich gab auf…. Ich möchte, dass Sie es auf CSV veröffentlichen. (Chilla | д ゚)

Zu analysierende Daten

Karte der Anzahl der durch die Präfektur infizierten neuen Koronaviren (bereitgestellt von Jag Japan Co., Ltd.) haben wir die öffentlich verfügbaren CSV-Daten verwendet. Es war. Ich finde es wunderbar, dass sich private Unternehmen freiwillig melden, um solche Daten zu sammeln und zu veröffentlichen.

Versuchen Sie mit Python & Ergebnis zu berechnen

Dieses Mal möchte ich die Ergebnisse gleichzeitig bei der Berechnung sehen.

1. Vorbereitung

Stellen Sie die Bibliothek und die Schriftart ein.

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import datetime
import locale
#
from scipy.special import comb

font = {'family' : 'IPAexGothic'}
plt.rc('font', **font)

Es ist eine Funktion, die die Anzahl der Infizierten nach Präfektur aus den Daten von Jag Japan zählt.

def readCsvOfJapanPref(pref : None):
    #Download von der unten stehenden URL
    # https://jag-japan.com/covid19map-readme/
    fcsv = u'COVID-19.csv'
    df = pd.read_csv(fcsv, header=0, encoding='utf8', parse_dates=[u'Festes Datum'])
    #Festes Datum,Extrahieren Sie nur die Präfektur Beratung
    df1 = df.loc[:,[u'Festes Datum',u'Beratungspräfektur']]
    df1.columns = ['date','pref']
    #Extrahiert durch Konsultationspräfektur
    if pref is None or pref == u'In Japan':
        df1 = df1
    else:
        df1 = df1[df1.pref == pref]
    df1 = df1.loc[:,'date']
    #Auf festes Datum zählen
    df2 = pd.DataFrame( df1.value_counts() ).reset_index()
    df2.columns = ['date','P']
    df2 = df2.sort_values('date').reset_index(drop = True)
    #
    return df2

Es ist eine Funktion, die Grundreproduktionszahl unter Berücksichtigung der Infektionsintensität zu berechnen. Wir haben Null-Prozent-Maßnahmen ergriffen.

def binomi(y, N, th):
    c = comb(N, y)
    p = c * pow(th, y) * pow(1. - th, N - y)
    return p

def calcR0(df, keys):
    #Binäre Verteilung
    N  = keys['N']
    th = keys['th']
    bcoef = [binomi(y, N, th) for y in range(N+1) ]
    #
    nrow = len(df)
    getP  = lambda s: df.loc[s, 'P' ] if (s >= 0 and s < nrow) else np.NaN
    for t in range(1, nrow):
        df.loc[t, 'Ppre' ] = sum([ getP(t + y) * bcoef[N - y] for y in range(0, N + 1)])
        df.loc[t, 'Pat'  ] = getP(t + N )
        if df.loc[t, 'Ppre'] > 0.1: #Null Prozent Maßnahmen
            df.loc[t, 'R0'  ] = df.loc[t, 'Pat'] / df.loc[t, 'Ppre']
        else:
            df.loc[t, 'R0'  ] = np.NaN
    return df

Diese Funktion berechnet die Grundanzahl der Reproduktionen nach Präfektur.

def makeCalcFrame(days):
    t_1 = pd.Timestamp(2020,1,24) #Startdatum der Berechnung
    td = pd.Timedelta('1 days')
    #
    npd = [[t_1 + td * i, 0, 0, 0 ] for i in range(0,days)]
    df1 = pd.DataFrame(npd)
    df1.columns = ['date', 'Ppre','Pat', 'R0']
    #
    return df1

def mergeCalcFrame(df1, df2):
    return pd.merge(df1, df2, on='date', how='left').fillna(0)

def R0inJapanPref(pref, keys):
    #
    df1 = makeCalcFrame(100)
    df2 = readCsvOfJapanPref(pref)
    df = mergeCalcFrame(df1, df2)
    #
    df = calcR0(df, keys)
    #
    return df

2. Beziehung zwischen dem binären Verteilungsparameter & thgr; und dem Durchschnittswert der Grundreproduktionszahl R0

Berechnen wir nun die Grundreproduktionszahl für jeden Parameter $ \ theta $, der in der Infektionsintensität $ R_0 (y) $ nach Präfektur enthalten ist, und sehen wir seine Verteilung. Eine Funktion zur Berechnung. Die Kandidaten für den Parameter $ \ theta $ werden im Raster berechnet.

def calcDfMean(dflist):
    mlist = []
    for df, pref in dflist:
        R0list = df[(df.R0 >= 0)]['R0']
        m = np.mean(R0list)
        mlist.append(m)
    return np.mean(mlist)

def calcThToDfMean():
    preflist = [u'In Japan', u'Tokio', u'Präfektur Osaka', u'Präfektur Aichi', u'Präfektur Fukuoka', u'Hokkaido']

    keys = {'N':13}
    dc = {}
    for y in np.linspace(0, 13, 14):
        keys['th'] = y / keys['N']
        dflist = [[R0inJapanPref(pref, keys), pref] for pref in preflist]
        dm = calcDfMean(dflist)
        dc[y] = dm
    #
    return dc

Dies ist der Teil, der berechnet und angezeigt werden soll. Es wird einige Minuten dauern.

dc = calcThToDfMean()

fig = plt.figure(figsize=(5,5))
ax1 = fig.add_subplot(1,1,1)
ax1.plot(list(dc.keys()), list(dc.values()))
ax1.set_xlabel('Nθ=E[y]')
ax1.set_ylabel('E[R0(y)]')
ax1.set_xticks(np.linspace(0,13,14))
ax1.set_xlim(0,)
ax1.set_ylim(0,)
ax1.grid()
ax1.set_title('The peak day vs the expected R0')
plt.show()

Sehen wir uns das Berechnungsergebnis an. R0_COVID-19_BinEst_THvsER0.png Die horizontale Achse repräsentiert $ N \ theta $, dh den Durchschnittswert der Binomialverteilung, und die vertikale Achse repräsentiert den Durchschnittswert der Grundreproduktionszahl $ r_0 $. In der Grafik der ** Cluster-Gegenmaßnahmengruppe zuvor betrug die durchschnittliche Anzahl der Grundreproduktionen 1,49. ** ** ** Wenn Sie sich in diesem Diagramm die Schnittposition ansehen, an der die vertikale Achse 1,49 beträgt, sehen Sie, dass $ N \ theta = 5 $ ist. Nehmen wir daher an, dass der Parameter $ \ theta $ einen geschätzten Wert von $ 5 / N = 0,385 $ hat. ** ** **

3. Infektionsintensität und Grundreproduktionszahl bei Verwendung des geschätzten Parameters θ

Als nächstes betrachten wir die Verteilung der grundlegenden Reproduktionszahlen unter Verwendung des geschätzten Parameters $ \ theta = 0,385 $. Eine Funktion zur Berechnung der Verteilung.

def makeR0frame(dflist):
    dc = {}
    for df, pref in dflist:
        R0list = df[(df.R0 >= 0)]['R0']
        dc[pref] = R0list
    return pd.DataFrame(dc)

def showR0bar(ax, df):
    color = dict(boxes="Gray",whiskers="DarkOrange",medians="Black",caps="Gray")
    df.plot.box(color=color, ax = ax)

def showBCoef(ax, keys):
    N = keys['N']
    th = keys['th']
    ylist = [y for y in range(N+1) ]
    bcoef = [binomi(y, N, th) for y in ylist ]
    ax.plot(ylist, bcoef)
    ax.set_xticks(np.linspace(0,N,N+1))
    ax.grid()
    ax.set_ylim(0,)
    ax.set_xlim(0,)

Dies ist der Teil, der die Verteilung berechnet und anzeigt.

preflist = [u'In Japan', u'Tokio', u'Präfektur Osaka', u'Präfektur Aichi', u'Präfektur Fukuoka', u'Hokkaido']

keys = {'N':13, 'th':5./13. } 
dflist = [[R0inJapanPref(pref, keys), pref] for pref in preflist]

fig = plt.figure(figsize=(10,5))
plt.rcParams["font.size"] = 10
ax1 = fig.add_subplot(1,2,1)
ax2 = fig.add_subplot(1,2,2)
#
df1 = makeR0frame(dflist)
showR0bar(ax1, df1)
showBCoef(ax2, keys)
ax1.legend()
ax1.set_title("R0")
ax2.set_xlabel('Nθ=E[y]')
ax2.set_ylabel('P(y;θ)')
ax2.set_title('binomi(y;θ)')
    
plt.show()

Sehen wir uns das Berechnungsergebnis an. R0_COVID-19_BinEst_R0prefs.png Die linke Seite zeigt die Verteilung der Grundreproduktionszahlen nach Präfekturen und die rechte Seite die Binomialverteilung der Infektionsintensität. Wenn Sie sich die Abbildung links ansehen, sehen Sie, dass die Verteilung einen ziemlich langen Saum hat. Darüber hinaus liegt der maximale Ausreißer in Hokkaido bei 17,5. Wie Sie durch Ändern der Parameter sehen können, scheint es kaum einen Unterschied zwischen Präfekturen mit diesem Parameter zu geben. Wenn ich mir die Abbildung rechts ansehe, habe ich das Gefühl, dass sie der Gammaverteilung im Bericht des Imperial College London ähnlich ist. Die Spitzenposition ist am 5. Tag, also liegt dies etwas zurück.

4. Ordnen Sie die Antworten dem Histogramm der Basisreproduktionsnummer zu

Erstellen Sie abschließend ein Histogramm der Anzahl der Grundreproduktionen und versuchen Sie, die Antwort mit dem Histogramm der Cluster-Gegenmaßnahmengruppe abzugleichen. Der zu berechnende Code.

def showR0hist(ax, df, pref):
    R0list = df[df.R0 >= 0]['R0']
    R0list = R0list / R0list.sum() * 100
    R0list.hist( bins=30, label=pref, ax=ax)

fig = plt.figure(figsize=(5,5))
ax1 = fig.add_subplot(1,1,1)
for df, pref in dflist:
    showR0hist(ax1, df, pref)
ax1.legend()
#
plt.show()

Sehen wir uns das Berechnungsergebnis an. R0_COVID-19_BinEst_R0allhist_比較用.png Das linke ist R0, geschätzt aus den Daten der Anzahl der infizierten Personen, und das rechte ist R0, das durch die Umfrage des Cluster-Gegenmaßnahmen-Teams aggregiert wurde. Die Form ist ziemlich gut. Es ist eine Form, die durch eine Exponentialverteilung angenähert werden kann. Die Durchschnittswerte sind die gleichen, also Yoshi! Sagen wir.

Erwägung

Aus dem Obigen können die folgenden Trends aus den Berechnungsergebnissen hinsichtlich der Schätzung der maximalen Infektiosität basierend auf den Daten infizierter Personen in jeder Präfektur in Japan abgeleitet werden.

Außerdem ...

Referenzlink

Ich habe auf die folgende Seite verwiesen.

  1. Berechnen Sie den Übergang der Grundreproduktionsnummer des neuen Koronavirus nach Präfektur
  2. Neuer Corona Cluster Countermeasure Expert (2)
  3. "Definition von Begriffen für neue Corona-Cluster-Gegenmaßnahmen", berichtet von Experten für neue Corona-Cluster-Gegenmaßnahmen
  4. Report 13 - Estimating the number of infections and the impact of non-pharmaceutical interventions on COVID-19 in 11 European countries
  5. New Study on COVID-19 Estimates 5.1 Days for Incubation Period
  6. [Python] Beschleunigungskombination (nCr) berechnen
  7. Karte der Anzahl der von der Präfektur infizierten neuen Koronaviren (bereitgestellt von Jag Japan Co., Ltd.)

Recommended Posts

Schätzen Sie die maximale Infektiosität des neuen Coronavirus ab
Zeichnen Sie die Ausbreitung des neuen Koronavirus
GUI-Simulation des neuen Koronavirus (SEIR-Modell)
Lassen Sie uns die medizinische Kollapshypothese des neuen Koronavirus testen
Quantifizieren Sie den Grad der Selbstbeherrschung, der erforderlich ist, um das neue Koronavirus einzudämmen
Analysieren Sie den altersspezifischen Schweregrad des Coronavirus
(Jetzt) Ich habe versucht, das neue Koronavirus (COVID-19) zu analysieren.
Hat die Anzahl der Ladenschließungen aufgrund des Einflusses des neuen Koronavirus zugenommen?
Die Geschichte des Studenten, der die neue Website für Gegenmaßnahmen gegen Koronaviren entwickelt hat (Ishikawa-Version)
Berechnen wir den Übergang der Grundreproduktionszahl des neuen Koronavirus nach Präfektur
Ich habe versucht, das Verhalten des neuen Koronavirus mit dem SEIR-Modell vorherzusagen.
Folding @ Home unter Linux Mint soll zur Analyse des neuen Corona-Virus beitragen
Ich habe einige der neuen Funktionen von Python 3.8 touched angesprochen
Die epidemische Vorhersage des neuen Koronavirus wurde mit explosiver Geschwindigkeit im Internet veröffentlicht
Ich habe versucht, die Literatur des neuen Corona-Virus mit Python automatisch an LINE zu senden
Die Theorie, dass der Schlüssel zur Kontrolle der Infektion des neuen Coronavirus die Hyperdispersion der Anfälligkeit ist.
Ich habe versucht, die Eigenschaften der neuen Informationen über mit dem Corona-Virus infizierte Personen mit Wordcloud zu visualisieren
Lassen Sie uns eine Rangfolge der Anzahl der wirksamen Reproduktionen des neuen Koronavirus nach Präfektur erstellen
Versuchen Sie, die Anzahl der Likes auf Twitter zu schätzen
Aufgaben zu Beginn eines neuen Python-Projekts
Schätzen Sie die Gesamtspeicherauslastung eines Objekts grob ab
Der Beginn von cif2cell
Verwenden Sie Hash, um das Kollisionsurteil von etwa 1000 Bällen in Python zu erleichtern (im Zusammenhang mit dem neuen Corona-Virus).
Die Bedeutung des Selbst
Ich habe versucht, die Anzahl der Todesfälle pro Kopf von COVID-19 (neues Koronavirus) nach Ländern zu tabellieren
der Zen von Python
Die Geschichte von sys.path.append ()
Simulieren wir den Effekt der Einführung einer Kontaktverfolgungs-App als Gegenmaßnahme gegen den neuen Koronavirus
Bedeutung der Eingrenzung des Testziels des PCR-Tests auf neues Koronavirus nach dem Bayes-Theorem
Rache der Typen: Rache der Typen
Ich habe die Tweets über den neuen Corona-Virus analysiert, die auf Twitter veröffentlicht wurden
Stellen wir uns die Anzahl der mit Matplotlib mit dem Coronavirus infizierten Personen vor
Schätzen Sie die durchschnittliche Punktzahl der Prüflinge an der Sapporo Medical University
Schätzen Sie die Haltung des AR-Markers mit Python + OpenCV + Drohne
Hypothese, warum das neue Koronavirus in städtischen Gebieten wie Tokio nicht so häufig vorkommt
Ich habe versucht, PDF-Daten der medizinischen Online-Versorgung zu verwenden, die auf der Ausbreitung einer neuen Coronavirus-Infektion basieren