[PYTHON] Estimer le pic d'infectivité du nouveau virus corona

introduction

Une déclaration d'urgence a été faite vers la convergence de la nouvelle infection à coronavirus (COVID-19), et bien que ce ne soit pas autant que le verrouillage d'autres pays, diverses industries ont été fermées, les événements ont été annulés, le travail à distance, diverses autolimitations, etc. , Affecte la vie de nombreuses personnes. La condition pour qu'une maladie infectieuse telle que la couronne corona converge est que le nombre de reproductions efficaces (le nombre total d'infections secondaires produites par une personne infectée) est constamment inférieur à 1. Article précédent décrit la période de latence et la période d'infection comme l'une des méthodes permettant de calculer le nombre effectif de reproduction à partir des données du nombre de personnes infectées dans les séries chronologiques. J'ai montré une méthode simple pour calculer séparément. Dans cet article, ce qui se passe lorsque l'infectivité, c'est-à-dire l'intensité de la teinture des autres après l'infection, est incorporée avec l'effet qui change avec le temps, ** surtout combien de jours après l'infection le pic d'infectivité * Je voudrais estimer environ *. En particulier, peut-il être infecté même pendant la période latente par les rapports des médias? Puisque le soupçon a été signalé, je pense que ce sera aussi une vérification de son authenticité.

Connaissances préalables

Voici trois études qui sont à la base de la revue de cet article. Le premier est Enquête du Groupe de contre-mesures du cluster du ministère de la Santé, du Travail et du Bien-être social. Selon le groupe de contre-mesures de cluster, le nombre de reproductions de base (il semble que les facteurs environnementaux ne sont pas pris en compte quand il est basique, et des politiques sont également prises quand il est efficace) est échantillonné comme le montre le graphique suivant. クラスター対策班のR0.jpg Heureusement, ** la valeur moyenne est de 1,49 ** (important ici). En d'autres termes, alors que la plupart des gens n'infectent pas (0 personne), il peut infecter plusieurs personnes à la fois, comme 11 ou 12. Par conséquent, R0 doit être considéré comme une distribution à queue large. Le deuxième est le [Rapport de recherche n ° 13](https://www.imperial.ac.uk/mrc-global-infectious-disease-analysis/covid-19/report-13-europe] de l'Imperial College de Londres au Royaume-Uni. -npi-impact /). L'université a publié un rapport sur le COVID-19 très tôt et semble avoir une forte influence sur la politique britannique. Ce qu'il faut noter dans ce rapport, c'est que l'infectivité est exprimée en utilisant la distribution gamma comme indiqué dans la figure ci-dessous. ICL_Rep13_Fig7.jpg La valeur moyenne est de 6,5 [jours], mais le pic semble se situer autour du 4e au 5e jour. Le troisième est Rapport sur la période de latence du COVID-19 de l'Université Johns Hopkins aux États-Unis. estimations-5-jours-pour-la-periode-d'incubation.html). Selon cela, la période de latence médiane est de 5,1 jours **. Ceci, combiné avec le graphique de la deuxième étude, suggère qu'il peut y avoir un pic d'infectivité avant la date d'apparition **. Sur la base des trois études ci-dessus, nous examinerons le pic d'infectivité, en particulier en utilisant des données sur le nombre de personnes infectées au Japon.

Modèle de calcul

Pour calculer le nombre de reproductions de base en tenant compte de l'infectivité, considérons un modèle basé sur le modèle SEIR, qui est une version légèrement améliorée de Article précédent. J'aimerais. Voir la figure suivante. R0_calculation_with_bnomi.jpg Dans l'article précédent, il était dit que les infections secondaires surviennent avec la même intensité d'infection chez les personnes infectées pendant la période d'infection (I), mais cette fois nous adopterons les hypothèses suivantes.

  1. L'infection peut survenir même pendant la période de latence (E).
  2. L'infection secondaire résulte du nombre de personnes infectées, qui est le produit du nombre de personnes infectées et de l'intensité de l'infection.
  3. L'intensité de l'infection est donnée par une fonction qui dépend du nombre de jours depuis la date de l'infection.
  4. La somme de la période de latence (lp) et de la période d'infection (ip) est de 13.

De plus, la fonction d'intensité d'infection de 3 adopte une distribution binomiale. En effet, il est plus facile à manipuler car il ne nécessite qu'un seul paramètre par rapport à la distribution gamma. Maintenant, la formule du nombre de reproductions de base basée sur la distribution binomiale est déterminée comme suit.

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

$ r_0 $ est une constante, $ \ theta $ est un paramètre de distribution binaire, $ y $ est le nombre de jours depuis la date de l'infection et $ N $ est la somme de la période de latence et de la période d'infection (= 13). L'infection secondaire d'une personne infectée à une personne infectée est définie par convolution comme le montre l'équation suivante. $ P (t) $ est le nombre de positifs confirmés au temps $ t $.

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

Les transformer vous donne la formule pour calculer $ 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)}

Il est un peu artificiel que le dénominateur et la molécule aient tous deux $ P (t + N) $, mais le calcul inclut l'effet de provoquer une infection secondaire immédiatement le jour de l'infection. Maintenant, en fonction de ce $ R_0 (y) $, je voudrais déterminer le paramètre d'intensité d'infectivité $ \ theta $, c'est-à-dire le moment où l'infectivité est maximisée $ N \ theta $, mais j'irai avec la stratégie suivante.

  1. Déterminez $ \ theta $ de manière appropriée.
  2. Trouvez $ r_0 $ à partir de la formule de $ R_0 (y) $ et des données réelles.
  3. Trouvez la valeur moyenne de la distribution de $ r_0 $.
  4. Répétez les étapes 1 à 3 pour estimer $ \ theta $, où $ E [r_0; \ theta] $ est la plus proche de 1,49 jour, comme valeur vraie.

À l'étape 4, si la distribution du groupe de grappes est des données numériques, une méthode telle que le calcul de la distance entre les distributions de probabilité et son optimisation pourrait être envisagée, mais puisqu'il n'y a que des données dans l'image ** J'ai abandonné…. Je veux que vous le publiiez sur csv. (Chilla | д ゚)

Données à analyser

Carte du nombre de nouveaux virus corona infectés par préfecture (fournie par Jag Japan Co., Ltd.), nous avons utilisé les données csv accessibles au public. C'était. Je trouve merveilleux que des entreprises privées se portent volontaires pour collecter et publier de telles données.

Essayez de calculer avec Python et résultat

Cette fois, j'aimerais voir les résultats en même temps lors du calcul.

1. Préparation

Définissez la bibliothèque et la police.

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)

C'est une fonction qui compte le nombre de personnes infectées par préfecture à partir des données de Jag Japan.

def readCsvOfJapanPref(pref : None):
    #Téléchargez à partir de l'URL ci-dessous
    # https://jag-japan.com/covid19map-readme/
    fcsv = u'COVID-19.csv'
    df = pd.read_csv(fcsv, header=0, encoding='utf8', parse_dates=[u'Date fixe'])
    #Date fixe,Extraire uniquement la préfecture de consultation
    df1 = df.loc[:,[u'Date fixe',u'Préfecture de consultation']]
    df1.columns = ['date','pref']
    #Extrait par la préfecture de consultation
    if pref is None or pref == u'Au Japon':
        df1 = df1
    else:
        df1 = df1[df1.pref == pref]
    df1 = df1.loc[:,'date']
    #Compter à date fixe
    df2 = pd.DataFrame( df1.value_counts() ).reset_index()
    df2.columns = ['date','P']
    df2 = df2.sort_values('date').reset_index(drop = True)
    #
    return df2

C'est une fonction pour calculer le nombre de reproduction de base en tenant compte de l'intensité de l'infection. Nous avons mis des mesures à zéro pour cent.

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):
    #Distribution binaire
    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: #Mesures à zéro pour cent
            df.loc[t, 'R0'  ] = df.loc[t, 'Pat'] / df.loc[t, 'Ppre']
        else:
            df.loc[t, 'R0'  ] = np.NaN
    return df

Cette fonction calcule le nombre de base de reproductions par préfecture.

def makeCalcFrame(days):
    t_1 = pd.Timestamp(2020,1,24) #Date de début du calcul
    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. Relation entre le paramètre de distribution binaire θ et la valeur moyenne du nombre de reproduction de base R0

Maintenant, calculons le nombre de reproduction de base pour chaque paramètre $ \ theta $ inclus dans l'intensité d'infection $ R_0 (y) $ par préfecture et voyons sa distribution. Une fonction de calcul. Les candidats pour le paramètre $ \ theta $ seront calculés sur la grille.

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'Au Japon', u'Tokyo', u'Préfecture d'Osaka', u'Préfecture d'Aichi', u'Préfecture de 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

Il s'agit de la pièce à calculer et à afficher. Cela prendra quelques minutes.

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()

Voyons le résultat du calcul. R0_COVID-19_BinEst_THvsER0.png L'axe horizontal représente $ N \ theta $, c'est-à-dire la valeur moyenne de la distribution binomiale, et l'axe vertical représente la valeur moyenne du nombre de reproduction de base $ r_0 $. Dans le graphique du groupe de contre-mesures ** de cluster précédemment, le nombre moyen de reproductions de base était de 1,49. ** ** À partir de ce graphique, si vous regardez la position d'intersection où l'axe vertical est 1,49, vous pouvez voir que $ N \ theta = 5 $. Par conséquent, supposons que le paramètre $ \ theta $ a une valeur estimée de 5 $ / N = 0,385 $. ** **

3. Intensité de l'infection et nombre de reproduction de base lors de l'utilisation du paramètre estimé θ

Ensuite, regardons la distribution des nombres de reproduction de base lorsque le paramètre estimé $ \ theta = 0,385 $ est utilisé. Une fonction pour calculer la distribution.

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,)

C'est la partie qui calcule et affiche la distribution.

preflist = [u'Au Japon', u'Tokyo', u'Préfecture d'Osaka', u'Préfecture d'Aichi', u'Préfecture de 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()

Voyons le résultat du calcul. R0_COVID-19_BinEst_R0prefs.png La gauche est une boîte à moustaches de la distribution des nombres de reproduction de base par préfecture, et la droite est la partie de distribution binomiale de l'intensité de l'infection. En regardant la figure de gauche, vous pouvez voir que la distribution a un ourlet assez long. De plus, la valeur aberrante maximale est d'environ 17,5 à Hokkaido. Comme vous pouvez le voir en changeant les paramètres, il semble qu'il y ait peu de différence entre les préfectures avec ce paramètre. En regardant la figure de droite, je pense qu'elle est similaire à la distribution gamma dans le rapport de l'Imperial College de Londres. La position de pointe est le 5ème jour, donc c'est un peu en retard.

4. Faites correspondre les réponses avec l'histogramme des numéros de reproduction de base

Enfin, faites un histogramme du nombre de reproductions de base et essayez de faire correspondre la réponse avec l'histogramme du groupe de contre-mesures de cluster. Le code à calculer.

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()

Voyons le résultat du calcul. R0_COVID-19_BinEst_R0allhist_比較用.png La gauche est R0 estimée à partir des données du nombre de personnes infectées, et la droite est R0 agrégée par l'enquête de l'équipe de contre-mesures du cluster. La forme est plutôt bonne. C'est une forme qui peut être approchée par une distribution exponentielle. Les valeurs moyennes sont les mêmes, alors Yoshi! Disons.

Considération

À partir de ce qui précède, les tendances suivantes peuvent être dérivées des résultats des calculs concernant l'estimation du pic d'infectivité sur la base des données des personnes infectées dans chaque préfecture du Japon.

En outre ...

Lien de référence

Je me suis référé à la page suivante.

  1. Calculez la transition du nombre de reproduction de base du nouveau virus corona par préfecture
  2. Nouvel expert en contre-mesures du cluster Corona (2)
  3. «Définition des termes pour les nouvelles contre-mesures de cluster corona» rapportée par les nouveaux experts en contre-mesure de cluster corona
  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] Calcul de combinaison accélérée (nCr)
  7. Carte du nombre de nouveaux virus corona infectés par préfecture (fournie par Jag Japan Co., Ltd.)

Recommended Posts

Estimer le pic d'infectivité du nouveau virus corona
Tracez la propagation du nouveau virus corona
Simulation GUI du nouveau virus corona (modèle SEIR)
Testons l'hypothèse d'effondrement médical du nouveau virus corona
Quantifier le degré d'autolimitation nécessaire pour contenir le nouveau virus corona
Analyser la gravité spécifique à l'âge du coronavirus
(Maintenant) j'ai essayé d'analyser le nouveau virus corona (COVID-19)
Le nombre de fermetures de magasins a-t-il augmenté en raison de l'influence du nouveau virus corona?
L'histoire de l'étudiant qui a développé le nouveau site de contre-mesures contre le virus corona (version Ishikawa)
Calculons la transition du nombre de reproduction de base du nouveau virus corona par préfecture
J'ai essayé de prédire le comportement du nouveau virus corona avec le modèle SEIR.
Folding @ Home sur Linux Mint pour contribuer à l'analyse du nouveau virus corona
J'ai touché certaines des nouvelles fonctionnalités de Python 3.8 ①
Les prévisions épidémiques du nouveau virus corona ont été publiées sur le Web à une vitesse explosive
J'ai essayé d'envoyer automatiquement la littérature du nouveau virus corona à LINE avec Python
La théorie selon laquelle la clé du contrôle de l'infection du nouveau coronavirus est l'hyperdispersion de la sensibilité.
J'ai essayé de visualiser les caractéristiques des nouvelles informations sur les personnes infectées par le virus corona avec wordcloud
Établissons un classement du nombre de reproductions efficaces du nouveau virus corona par préfecture
Essayez d'estimer le nombre de likes sur Twitter
Tâches au démarrage d'un nouveau projet python
Estimer grossièrement l'utilisation totale de la mémoire d'un objet
Le début de cif2cell
Utilisez le hachage pour alléger le jugement de collision d'environ 1000 balles en Python (lié au nouveau virus corona)
Le sens de soi
J'ai essayé de classer le nombre de décès par habitant de COVID-19 (nouveau virus corona) par pays
le zen de Python
L'histoire de sys.path.append ()
Simulons l'effet de l'introduction d'une application de suivi des contacts comme contre-mesure contre le nouveau virus corona
Importance de la réduction de la cible de test du test PCR pour le nouveau virus corona compris par le théorème de Bayes
La vengeance des types: la vengeance des types
J'ai analysé les tweets sur le nouveau virus corona publiés sur Twitter
Visualisons le nombre de personnes infectées par le virus corona avec matplotlib
Estimer le score moyen des candidats à l'Université de médecine de Sapporo
Estimer la posture du marqueur AR avec Python + OpenCV + drone
Hypothèse pour laquelle le nouveau virus corona n'est pas si populaire dans les zones urbaines comme Tokyo
J'ai essayé d'utiliser des données PDF de soins médicaux en ligne basés sur la propagation d'une nouvelle infection à coronavirus