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é.
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. 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. 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.
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. 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.
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.
À 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 | д ゚)
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.
Cette fois, j'aimerais voir les résultats en même temps lors du calcul.
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
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. 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 $. ** **
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. 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.
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. 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.
À 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.
Je me suis référé à la page suivante.
Recommended Posts