[PYTHON] Quantifier le degré d'autolimitation nécessaire pour contenir le nouveau virus corona

introduction

La nouvelle infection à coronavirus (COVID-19) est endémique dans le monde entier et des blocus urbains, appelés lock-out, sont en cours dans diverses régions telles que la Chine, l'Europe, les États-Unis et l'Asie. Au Japon également, au 4 avril, il y avait 3 360 personnes infectées au Japon et 891 personnes à Tokyo, et le gouverneur demande de s'abstenir de sortir le week-end et d'éviter des entreprises spécifiques de produits alimentaires et de boissons. En outre, il se propage non seulement dans le centre de Tokyo et Osaka, mais dans tout le pays, et on peut dire que la situation est aussi proche que possible d'une situation d'urgence où un dépassement se produit. Afin d'éviter une telle situation d'urgence, dans Réunion d'experts gouvernementaux etc., 3 espaces denses (fermés et denses) ・ Nous appelons activement à éviter (fermer). Alors, dans quelle mesure devrions-nous éviter ces trois espaces denses? Dans cet article, je voudrais quantifier ** le degré d'évitement de 3 espaces denses nécessaires pour éviter la propagation de l'infection ** en tant que valeur numérique.

3 espace dense et nombre de base de reproductions

Le nombre de base de reproductions est

Est défini comme. En d'autres termes, c'est la force avec laquelle une personne infectée peut infecter d'autres personnes avec le nouveau virus corona. De plus, si sa force est forte, elle infectera de nombreuses personnes à la fois et des grappes se produiront. Selon la National Cluster Map publiée par le ministère de la Santé, du Travail et du Bien-être social, les éléments suivants sont répertoriés comme les éléments qui composent le cluster.

Ce qu'ils ont en commun, ce sont probablement les trois espaces denses. En outre, l'équipe des contre-mesures du cluster estime les résultats de l'analyse des nombres de reproduction de base par environnement.

Q14.jpg

Cette figure suggère que la distribution de fréquence des nombres de reproduction de base diffère selon que la source de l'infection se trouve dans un environnement mal ventilé ou dans d'autres environnements. En d'autres termes, ** 3 la distribution de probabilité du nombre de reproductions de base change considérablement selon qu'il s'agit ou non d'un espace dense **. Par conséquent, je voudrais définir les paramètres qui représentent les différences dans l'environnement comme suit.

Ensuite, le code pour approximer le nombre de reproduction de base par le paramètre er ci-dessus est indiqué dans Article précédent. La figure ci-dessus est approximativement représentée en combinant une ramification conditionnelle et une distribution uniforme.

"""
 er: good environment ratio (0.-1.)
"""
def COVID19R0(er):
    if np.random.rand() < er:
        # good environment
        if np.random.rand() < 0.8:
            R0 = 0
        else:
            R0 = np.random.randint(1,4)*1.0
    else:
        # bad environment
        R0 = np.random.randint(0,12)*1.0
    return R0

Alors, quelle valeur du paramètre environnemental er peut rendre le nombre de reproduction de base inférieur à 1 (dans le sens de la convergence de l'infection)? Ci-dessous, j'aimerais envisager d'utiliser des outils statistiques.

Limitation du pôle central

Quelle est la limitation du pôle central?

  1. Les observations $ X_1, X_2, \ cdots, X_n $ sont des variables probabilistes indépendantes les unes des autres et qui suivent toutes la même distribution.
  2. Pour tout i, $ E [X_i] = \ mu, V [X_i] = \ sigma $.

Lorsque, pour l'échantillon, la moyenne $ \ bar {X} _n $ des valeurs observées,

\frac{\bar{X}_n - \mu}{\left( \frac{\sigma}{\sqrt{n}} \right)} \sim N(0,1)\  ({\rm as}\ n \rightarrow \infty) \\
\bar{X}_n = \frac{1}{n} \sum_{i=1}^n X_i

Était à tenir. Ce qui est important ici, c'est qu'il n'y a pas d'hypothèses sur la distribution de probabilité de la population autre que l'existence de valeurs vraies pour la moyenne et la variance. Par conséquent, ce théorème peut être appliqué à la distribution de probabilité du nombre de reproduction de base.

Estimation de l'intervalle de confiance de la moyenne de la population

Alors, comment estimez-vous la moyenne de la population des nombres de reproduction de base pour chaque paramètre environnemental er? Selon les manuels de statistiques, une estimation de la moyenne de la population (avec un intervalle de confiance de 1 $ \ alpha $) lorsque la variance de la population est inconnue est donnée ci-dessous.

\left[ \bar{X}_n - \frac{U}{\sqrt{n}} t_{\alpha / 2} (n-1),  \bar{X}_n + \frac{U}{\sqrt{n}} t_{\alpha / 2} (n-1) \right]\\
U^2 = \frac{1}{n-1} \sum_{i=1}^n (X_i - \bar{X}_n)^2

Ici, $ U $ est la variance non biaisée de l'échantillon, $ t_ {\ alpha} (n-1) $ est le point $ \ alpha / 2 $ de la distribution t avec $ n-1 $ de liberté (l'aire de queue de la distribution de probabilité est $). La valeur de la variable de probabilité qui est \ alpha / 2 $). À la lecture du manuel, il semble que cet intervalle de confiance résulte de l'estimation et de la combinaison de la moyenne de la population selon la distribution normale et de la variance de la population suivant la distribution $ χ ^ 2 $ basée sur la théorie de la limitation du pôle central.

Essayez de calculer avec Python

Maintenant, utilisons Python pour calculer la moyenne de la population et l'intervalle de confiance du nombre de reproduction de base R0 en fonction du paramètre d'environnement er.

Tout d'abord, importez la bibliothèque.

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

Il s'agit de la fonction de base de génération du numéro de reproduction.

"""
 er: good environment ratio (0.-1.)
"""
def COVID19R0(er):
    if np.random.rand() < er:
        # good environment
        if np.random.rand() < 0.8:
            R0 = 0
        else:
            R0 = np.random.randint(1,4)*1.0
    else:
        # bad environment
        R0 = np.random.randint(0,12)*1.0
    return R0

Une fonction qui calcule la moyenne de l'échantillon et la variance non biaisée en échantillonnant N pièces selon la distribution de probabilité donnée $ f $.

def EstFromNsample(f, N):
    #N échantillonnage selon la distribution de probabilité f
    sample = [f() for i in range(N)]
    #Moyenne de l'échantillon
    Eave = np.average(sample)
    #Dispersion des échantillons impartiale
    Esig2 = 1./(np.float(N)-1.) * np.sum([pow(s - Eave, 2) for s in sample]) 
    return Eave, Esig2

Cette fonction calcule les valeurs estimées de la moyenne de la population et de la variance de la population en gravant le paramètre d'environnement er de 0 à 1 avec un maillage et en échantillonnant chacun d'eux.

def makeERsamples(keys):
    ediv = keys['ediv']
    N = keys['N']
    #
    l = []
    #
    for e in np.linspace(0, 1, ediv):
        f = lambda : COVID19R0(e) #Fonction d'échantillonnage dans un paramètre d'environnement spécifique
        Eave, Esig2 = EstFromNsample(f, N)
        l.append([e, Eave, Esig2])
    return np.array(l)

Une fonction qui calcule l'intervalle de confiance. Notez que alpha a la signification opposée de $ \ alpha $ ci-dessus. Selon scipy.stats, "Endpoints of the range that contains alpha percent of the distribution" , T_dist.interval est une fonction qui renvoie les extrémités de l'intervalle contenant le pourcentage alpha de la distribution t.

def calcBand01(ave, sigma, N, alpha):
    t_dist = stats.t(loc=0,scale=1,df=N-1)
    b, u = t_dist.interval(alpha=alpha)
    b = ave + b * sigma / np.sqrt(N)
    u = ave + u * sigma / np.sqrt(N)
    return b, u

Une fonction qui affiche l'estimation moyenne de la population et son intervalle de confiance.

def showBandEstimation(sample, keys):
    #
    alpha = keys['alpha']
    N = keys['N']
    #
    x = sample[:,0]
    y = sample[:,1]
    s2 = sample[:,2]
    s = np.sqrt(s2)
    #
    yb, yu = calcBand01(y, s, N, alpha)
    #
    fig, ax = plt.subplots(1,1,figsize=(5,4), dpi=200)
    ax.plot([0,1],[1,1], 'r--')
    ax.plot(x, y, label='ave')
    ax.plot(x, yu, '.', label='upper')
    ax.plot(x, yb, '.', label='lower')
    ax.fill_between(x, yu, yb, facecolor='r',alpha=0.2)
    ax.set_xlabel('er')
    ax.set_ylabel('R0')
    ax.set_xticks(np.linspace(0,1,11))
    ax.grid(b=True, which='both', axis='x')
    ax.legend()
    plt.show()

Enfin, c'est la partie qui effectue l'échantillonnage et affiche la valeur estimée de la moyenne de la population et l'intervalle de confiance.

keys = {'N':100, 'ediv':100, 'alpha':0.95 }

sample = makeERsamples(keys)
fig = showBandEstimation(sample, keys)

Résultat du calcul

Jetons maintenant un œil aux résultats du calcul.

Pour le nombre d'échantillons (N = 100)

R0ave_BandEstimation_N100.png

Pour le nombre d'échantillons (N = 1000)

R0ave_BandEstimation_N1000.png

Pour le nombre d'échantillons (N = 10000)

R0ave_BandEstimation_N10000.png

Il y a beaucoup de variations à $ N = 100 $, mais à $ N = 10000 $, il semble que c'est presque convergé. Par conséquent, il semble qu'une estimation assez fiable puisse être faite avec environ 10 000 échantillons. Le point important est que cette estimation est de 1. 2. La moyenne de l'échantillon converge vers une distribution normale par la théorie de la limitation du pôle central. Cela signifie qu'il est établi en deux étapes d'estimation de l'intervalle de confiance par la distribution t. Il est donc important de déterminer combien de $ N $ est suffisant pour faire cette estimation.

Considération

De ce qui précède, les tendances suivantes peuvent être dérivées de la simulation concernant l'estimation de la moyenne de la population du nombre de reproduction de base R0 pour le paramètre environnemental er (comment éviter 3 espaces denses).

En outre ...

Lien de référence

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

Recommended Posts

Quantifier le degré d'autolimitation nécessaire pour contenir le nouveau virus corona
Tracez la propagation du nouveau virus corona
Estimer le pic d'infectivité du nouveau virus corona
Le nombre de fermetures de magasins a-t-il augmenté en raison de l'influence du nouveau virus corona?
zoom J'ai essayé de quantifier le degré d'excitation de l'histoire lors de la conférence
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
Simulation GUI du nouveau virus corona (modèle SEIR)
J'ai essayé d'envoyer automatiquement la littérature du nouveau virus corona à LINE avec Python
Testons l'hypothèse d'effondrement médical du nouveau virus corona
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
[Courses de chevaux] J'ai essayé de quantifier la force du cheval de course
Utilisez le hachage pour alléger le jugement de collision d'environ 1000 balles en Python (lié au nouveau virus corona)
J'ai essayé de classer le nombre de décès par habitant de COVID-19 (nouveau virus corona) par pays
Analyser la gravité spécifique à l'âge du coronavirus
Supplément à l'explication de vscode
Créez un bot qui publie sur Slack le nombre de personnes positives pour le nouveau virus corona à Tokyo
Calculons la transition du nombre de reproduction de base du nouveau virus corona par préfecture
L'histoire d'essayer de reconnecter le client
Script pour changer la description de fasta
10 méthodes pour améliorer la précision de BERT
Comment vérifier la version de Django
L'histoire de la mise en place de MeCab dans Ubuntu 16.04
(Maintenant) j'ai essayé d'analyser le nouveau virus corona (COVID-19)
L'histoire du changement de pep8 en pycodestyle
Convertir le PDF de la liste de produits contenant des surfactants efficaces pour le nouveau virus corona en CSV
Les prévisions épidémiques du nouveau virus corona ont été publiées sur le Web à une vitesse explosive
J'ai essayé d'afficher le degré d'infection par le virus corona sur la carte thermique Seaborn