Quantifier la transmission

Dernière mise à jour le 2025-09-29 | Modifier cette page

Vue d'ensemble

Questions

  • Comment puis-je estimer le nombre de reproduction variable dans le temps (\(Rt\)) et le taux de croissance à partir d’une série chronologique de données de cas ?
  • Comment quantifier l’hétérogénéité géographique à partir de ces paramètres de transmission ?

Objectifs

  • Apprenez à estimer les paramètres de transmission à partir d’une série chronologique de données sur les cas à l’aide du package EpiNow2.

Conditions préalables

Les étudiants doivent se familiariser avec les concepts suivants avant de suivre ce tutoriel :

Statistiques: distributions de probabilités, principe de l’analyse bayésienne.

Théorie des épidémies: Nombre de reproduction effectif.

Science des données: la transformation et la visualisation des données. Vous pouvez revoir l’épisode sur Agréger et visualiser les données d’incidence.

Rappel : le nombre de reproduction effectif, \(R_t\)

Le nombre de reproduction de base, \(R_0\) est le nombre moyen de cas causés par un individu infectieux dans une population entièrement susceptible.

Mais dans une épidémie en cours, la population ne reste pas entièrement susceptible, car les personnes qui se remettent de l’infection sont généralement immunisées. En outre, il peut y avoir des changements de comportement ou d’autres facteurs qui affectent la transmission. Lorsque nous voulons surveiller les changements dans la transmission, nous nous intéressons donc davantage à la valeur du nombre de reproduction effectif, \(R_t\) qui représente le nombre moyen de cas causés par un individu infectieux dans la population au temps \(t\) compte tenu de l’état actuel de la population (y compris les niveaux d’immunité et les mesures de contrôle).

Introduction


L’intensité de la transmission d’une épidémie est quantifiée à l’aide de deux paramètres clés : le nombre de reproduction, qui renseigne sur la force de la transmission en indiquant le nombre de nouveaux cas attendus pour chaque cas existant, et le nombre de décès. taux de croissance qui renseigne sur la vitesse de transmission en indiquant la rapidité avec laquelle l’épidémie se propage ou décline (temps de doublement/dédoublement) au sein d’une population. Pour plus de détails sur la distinction entre la vitesse et la force de la transmission et les implications pour la lutte, consultez le site Dushoff & Park, 2021.

Pour estimer ces paramètres clés à l’aide des données relatives aux cas, nous devons tenir compte des délais entre les dates d’infections et les dates de cas déclarés. Lors d’une épidémie, les données ne sont généralement disponibles qu’à partir des dates déclarées. Nous devons donc utiliser des méthodes d’estimation pour tenir compte de ces retards lorsque nous essayons de comprendre les changements dans la transmission au fil du temps.

Dans les prochains tutoriels, nous nous concentrerons sur la manière d’utiliser les fonctions de EpiNow2 pour estimer les paramètres de transmission des données de cas. Nous ne couvrirons pas le contexte théorique des modèles ou du cadre d’inférence, pour plus de détails sur ces concepts, consultez la vignette..

Dans ce tutoriel, nous allons apprendre à utiliser le package EpiNow2 pour estimer le nombre de reproduction variable dans le temps. Nous obtiendrons les données d’entrée de incidence2. Nous utiliserons le package tidyr et dplyr pour organiser certains de ses résultats, ggplot2 pour visualiser la distribution des cas, et le tuyau %>% pour relier certaines de leurs fonctions, alors appelons aussi le package tidyverse :

R

library(EpiNow2)
library(incidence2)
library(tidyverse)

Le double point-virgule

Le double deux-points :: dans R vous permet d’appeler une fonction spécifique d’un package sans charger l’ensemble du package dans l’environnement actuel.

Par exemple, vous pouvez appeler une fonction spécifique d’un package sans charger le package entier dans l’environnement actuel, dplyr::filter(data, condition) utilise filter() à partir du package dplyr.

Cela nous permet de nous souvenir des fonctions du package et d’éviter les conflits d’espace de noms.

Inférence bayésienne

Le package R EpiNow2 utilise une méthode d’inférence bayésienne inférence bayésienne pour estimer les nombres de reproduction et les durées d’infection sur la base des dates déclarées. En d’autres termes, il estime la transmission en fonction de la date à laquelle les personnes ont été effectivement infectées (plutôt que de l’apparition des symptômes), en tenant compte des retards dans les données observées. En revanche, l’approche EpiEstim permet une estimation en temps réel plus rapide et plus simple du nombre de reproductions en utilisant uniquement les données de cas au fil du temps, reflétant la façon dont la transmission change en fonction du moment où les symptômes apparaissent.

Dans l’inférence bayésienne, nous utilisons les connaissances a priori (distributions a priori) et les données (via une fonction de vraisemblance) pour obtenir la probabilité a posteriori :

\(\text{Probabilité a posteriori} \propto \text{vraisemblance} \times \text{probabilité a priori}\)

Distributions de délais et données de cas


Données de cas

Pour illustrer les fonctions des EpiNow2 nous utiliserons les données relatives au début de la pandémie de COVID-19 au Royaume-Uni, mais uniquement pour les 90 premiers jours observés. Les données sont disponibles dans le package R incidence2.

R

dplyr::as_tibble(incidence2::covidregionaldataUK)

SORTIE

# A tibble: 6,370 × 13
   date       region   region_code cases_new cases_total deaths_new deaths_total
   <date>     <chr>    <chr>           <dbl>       <dbl>      <dbl>        <dbl>
 1 2020-01-30 East Mi… E12000004          NA          NA         NA           NA
 2 2020-01-30 East of… E12000006          NA          NA         NA           NA
 3 2020-01-30 England  E92000001           2           2         NA           NA
 4 2020-01-30 London   E12000007          NA          NA         NA           NA
 5 2020-01-30 North E… E12000001          NA          NA         NA           NA
 6 2020-01-30 North W… E12000002          NA          NA         NA           NA
 7 2020-01-30 Norther… N92000002          NA          NA         NA           NA
 8 2020-01-30 Scotland S92000003          NA          NA         NA           NA
 9 2020-01-30 South E… E12000008          NA          NA         NA           NA
10 2020-01-30 South W… E12000009          NA          NA         NA           NA
# ℹ 6,360 more rows
# ℹ 6 more variables: recovered_new <dbl>, recovered_total <dbl>,
#   hosp_new <dbl>, hosp_total <dbl>, tested_new <dbl>, tested_total <dbl>

Pour utiliser les données, nous devons les formater de manière à ce qu’elles comportent deux colonnes :

  • date la date (en tant qu’objet date, voir ?is.Date()),
  • confirm: nombre de cas déclarés (confirmés) à cette date.

Utilisons tidyr et incidence2 pour cela :

R

cases_sliced <- incidence2::covidregionaldataUK %>%
  dplyr::as_tibble() %>%
  # Preprocess missing values
  tidyr::replace_na(base::list(cases_new = 0)) %>%
  # Compute the daily incidence
  incidence2::incidence(
    date_index = "date",
    counts = "cases_new",
    count_values_to = "confirm",
    date_names_to = "date",
    complete_dates = TRUE
  ) %>%
  # Keep the first 90 dates
  dplyr::slice_head(n = 90)

Avec incidence2::incidence() nous agrégeons des cas sur différentes périodes de temps (intervalles, c’est-à-dire des jours, des semaines ou des mois) ou par groupe. Nous pouvons également obtenir les dates complètes pour tous les intervalles de dates par catégorie de groupe à l’aide de la fonction complete_dates = TRUE Explorez plus tard les incidence2::incidence() manuel de référence

Pouvons-nous reproduire {incidence2} avec {dplyr}?

Nous pouvons obtenir un objet similaire à cases à partir de l’objet incidence2::covidregionaldataUK à l’aide du package dplyr.

R

incidence2::covidregionaldataUK %>%
  dplyr::select(date, cases_new) %>%
  dplyr::group_by(date) %>%
  dplyr::summarise(confirm = sum(cases_new, na.rm = TRUE)) %>%
  dplyr::ungroup() %>%
  dplyr::slice_head(n = 90)

Cependant, incidence2::incidence() contient des arguments pratiques comme complete_dates qui facilitent l’obtention d’un objet d’incidence avec le même intervalle de dates pour chaque groupe sans nécessiter de lignes de code supplémentaires ou un package de séries temporelles.

Dans une situation d’épidémie, il est probable que nous n’ayons accès qu’au début de l’ensemble des données d’entrée. Nous supposons donc que nous ne disposons que des 90 premiers jours de ces données.

R

plot(cases_sliced)

Pour transmettre les résultats de incidence2 à EpiNow2, nous devons supprimer une colonne de l’objet cases_filter :

R

# Drop column for {EpiNow2} input format
cases <- cases_sliced %>%
  dplyr::select(-count_variable)

cases

SORTIE

# A tibble: 90 × 2
   date       confirm
   <date>       <dbl>
 1 2020-01-30       3
 2 2020-01-31       0
 3 2020-02-01       0
 4 2020-02-02       0
 5 2020-02-03       0
 6 2020-02-04       0
 7 2020-02-05       2
 8 2020-02-06       0
 9 2020-02-07       0
10 2020-02-08       8
# ℹ 80 more rows

Distribution des délais

Nous supposons qu’il existe des délais entre le moment de l’infection et le moment où un cas est signalé. Nous spécifions ces délais sous forme de distributions pour tenir compte de l’incertitude des différences au niveau individuel. Le délai peut impliquer plusieurs types de processus. Un délai typique entre le moment de l’infection et la déclaration du cas peut consister en ce qui suit

le temps écoulé entre l’infection et l’apparition des symptômes (le période d’incubation) + délai entre l’apparition des symptômes et la notification du cas (délai de déclaration) .

La distribution des délais pour chacun de ces processus peut être estimée à partir de données ou obtenue à partir de la littérature. Nous pouvons exprimer l’incertitude quant aux paramètres corrects des distributions en supposant que les distributions ont fixe fixes ou qu’elles ont variables variables. Pour comprendre la différence entre fixe et variables considérons la période d’incubation.

Délais et données

Le nombre de retards et le type de retard sont des données flexibles qui dépendent des données. Les exemples ci-dessous montrent comment les délais peuvent être spécifiés pour différentes sources de données :

Source de données Délai (s)
Heure d’apparition des symptômes Période d’incubation
Date de la déclaration du cas Période d’incubation + délai entre l’apparition des symptômes et la notification du cas
Durée de l’hospitalisation Période d’incubation + temps écoulé entre l’apparition des symptômes et l’hospitalisation

Distribution de la période d’incubation

La distribution de la période d’incubation pour de nombreuses maladies peut généralement être obtenue à partir de la littérature. L’ensemble epiparameter contient une bibliothèque de paramètres épidémiologiques pour différentes maladies, obtenus à partir de la littérature.

Nous spécifions une distribution gamma (fixe) avec moyenne \(\mu = 4\) et un écart-type \(\sigma = 2\) (forme = \(4\), échelle = \(1\)) en utilisant la fonction Gamma() comme suit :

R

incubation_period_fixed <- EpiNow2::Gamma(
  mean = 4,
  sd = 2,
  max = 20
)

incubation_period_fixed

SORTIE

- gamma distribution (max: 20):
  shape:
    4
  rate:
    1

L’argument max est la valeur maximale que la distribution peut prendre ; dans cet exemple, 20 jours.

Nous pouvons tracer les distributions générées par EpiNow2 en utilisant plot().

R

plot(incubation_period_fixed)

Pourquoi une distribution gamma ?

La période d’incubation doit être une valeur positive. Nous devons donc spécifier une distribution en EpiNow2 qui ne concerne que les valeurs positives.

Gamma() prend en charge les distributions Gamma et LogNormal() les distributions log-normales, qui sont des distributions pour les valeurs positives uniquement.

Pour tous les types de retard, nous devrons utiliser des distributions pour les valeurs positives uniquement - nous ne voulons pas inclure les retards de jours négatifs dans notre analyse !

Prise en compte de l’incertitude de la distribution

Pour spécifier une distribution variable nous incluons l’incertitude autour de la moyenne \(\mu\) et de l’écart-type \(\sigma\) de notre distribution gamma. Si notre distribution de la période d’incubation a une moyenne \(\mu\) et un écart-type \(\sigma\) nous supposons que la moyenne (\(\mu\)) suit une distribution normale avec un écart type \(\sigma_{\mu}\):

\[\mbox{Normal}(\mu,\sigma_{\mu}^2)\]

et un écart-type (\(\sigma\)) suit une distribution normale avec un écart type \(\sigma_{\sigma}\):

\[\mbox{Normal}(\sigma,\sigma_{\sigma}^2).\]

Nous spécifions ceci en utilisant Normal() pour chaque argument : la moyenne (\(\mu = 4\) avec \(\sigma_{\mu} = 0.5\)) et l’écart-type (\(\sigma = 2\) avec \(\sigma_{\sigma} = 0.5\)).

R

incubation_period_variable <- EpiNow2::Gamma(
  mean = EpiNow2::Normal(mean = 4, sd = 0.5),
  sd = EpiNow2::Normal(mean = 2, sd = 0.5),
  max = 20
)

incubation_period_variable

SORTIE

- gamma distribution (max: 20):
  shape:
    - normal distribution:
      mean:
        4
      sd:
        0.61
  rate:
    - normal distribution:
      mean:
        1
      sd:
        0.31

Traçons la distribution que nous venons de configurer :

R

plot(incubation_period_variable)

Retards dans l’établissement des rapports

Après la période d’incubation, il s’écoule un délai supplémentaire entre l’apparition des symptômes et la notification du cas : le délai de déclaration. Nous pouvons le spécifier comme une distribution fixe ou variable, ou estimer une distribution à partir de données.

Lorsque vous spécifiez une distribution, il est utile de visualiser la densité de probabilité pour voir le pic et l’étendue de la distribution. Dans cet example, nous allons utiliser une distribution log normale.

Si nous voulons supposer que le délai de déclaration moyen est de 2 jours (avec une incertitude de 0,5 jour) et que l’écart type est de 1 jour (avec une incertitude de 0,5 jour), nous pouvons spécifier une distribution variable à l’aide de la commande LogNormal() comme précédemment :

R

reporting_delay_variable <- EpiNow2::LogNormal(
  meanlog = EpiNow2::Normal(mean = 2, sd = 0.5),
  sdlog = EpiNow2::Normal(mean = 1, sd = 0.5),
  max = 10
)

Visualisez une distribution log-normale en utilisant {epiparameter}

En utilisant epiparameter::epiparameter() nous pouvons créer une distribution personnalisée. La distribution normale à logarithme fixe aura l’aspect suivant :

R

library(epiparameter)

R

epiparameter::epiparameter(
  disease = "covid",
  epi_name = "reporting delay",
  prob_distribution =
    epiparameter::create_prob_distribution(
      prob_distribution = "lnorm",
      prob_distribution_params = c(
        meanlog = 2,
        sdlog = 1
      )
    )
) %>%
  plot()

Comment obtenir le délai de reporting à partir des données ?

Si l’on dispose de données sur le délai entre l’apparition des symptômes et la déclaration, on peut utiliser la fonction estimate_delay() pour estimer une distribution log-normale à partir d’un vecteur de délais. Le code ci-dessous illustre comment utiliser la fonction estimate_delay() avec des données synthétiques sur les délais.

R

library(tidyverse)

# Steps:
# - get Ebola data from package {outbreaks}
# - keep a subset of columns for this example only
# - calculate the time difference between two dates in linelist
# - extract the time difference as a vector class object
# - estimate the delay parameters using {EpiNow2}

outbreaks::ebola_sim_clean$linelist %>%
  tibble::as_tibble() %>%
  dplyr::select(case_id, date_of_onset, date_of_hospitalisation) %>%
  dplyr::mutate(reporting_delay = date_of_hospitalisation - date_of_onset) %>%
  dplyr::pull(reporting_delay) %>%
  EpiNow2::estimate_delay(
    samples = 1000,
    bootstraps = 10
  )

SORTIE

WARN [2025-09-29 19:37:51] dist_fit (chain: 1): Bulk Effective Samples Size (ESS) is too low, indicating posterior means and medians may be unreliable.
Running the chains for more iterations may help. See
https://mc-stan.org/misc/warnings.html#bulk-ess -
WARN [2025-09-29 19:37:51] dist_fit (chain: 1): Tail Effective Samples Size (ESS) is too low, indicating posterior variances and tail quantiles may be unreliable.
Running the chains for more iterations may help. See
https://mc-stan.org/misc/warnings.html#tail-ess -
WARN [2025-09-29 19:37:54] dist_fit (chain: 1): Bulk Effective Samples Size (ESS) is too low, indicating posterior means and medians may be unreliable.
Running the chains for more iterations may help. See
https://mc-stan.org/misc/warnings.html#bulk-ess -
WARN [2025-09-29 19:37:54] dist_fit (chain: 1): Tail Effective Samples Size (ESS) is too low, indicating posterior variances and tail quantiles may be unreliable.
Running the chains for more iterations may help. See
https://mc-stan.org/misc/warnings.html#tail-ess -
WARN [2025-09-29 19:37:56] dist_fit (chain: 1): The largest R-hat is 1.08, indicating chains have not mixed.
Running the chains for more iterations may help. See
https://mc-stan.org/misc/warnings.html#r-hat -
WARN [2025-09-29 19:37:56] dist_fit (chain: 1): Bulk Effective Samples Size (ESS) is too low, indicating posterior means and medians may be unreliable.
Running the chains for more iterations may help. See
https://mc-stan.org/misc/warnings.html#bulk-ess -
WARN [2025-09-29 19:37:56] dist_fit (chain: 1): Tail Effective Samples Size (ESS) is too low, indicating posterior variances and tail quantiles may be unreliable.
Running the chains for more iterations may help. See
https://mc-stan.org/misc/warnings.html#tail-ess -
WARN [2025-09-29 19:37:58] dist_fit (chain: 1): Bulk Effective Samples Size (ESS) is too low, indicating posterior means and medians may be unreliable.
Running the chains for more iterations may help. See
https://mc-stan.org/misc/warnings.html#bulk-ess -
WARN [2025-09-29 19:37:58] dist_fit (chain: 1): Tail Effective Samples Size (ESS) is too low, indicating posterior variances and tail quantiles may be unreliable.
Running the chains for more iterations may help. See
https://mc-stan.org/misc/warnings.html#tail-ess -
WARN [2025-09-29 19:38:00] dist_fit (chain: 1): The largest R-hat is 1.07, indicating chains have not mixed.
Running the chains for more iterations may help. See
https://mc-stan.org/misc/warnings.html#r-hat -
WARN [2025-09-29 19:38:00] dist_fit (chain: 1): Bulk Effective Samples Size (ESS) is too low, indicating posterior means and medians may be unreliable.
Running the chains for more iterations may help. See
https://mc-stan.org/misc/warnings.html#bulk-ess -
WARN [2025-09-29 19:38:00] dist_fit (chain: 1): Tail Effective Samples Size (ESS) is too low, indicating posterior variances and tail quantiles may be unreliable.
Running the chains for more iterations may help. See
https://mc-stan.org/misc/warnings.html#tail-ess -
WARN [2025-09-29 19:38:02] dist_fit (chain: 1): The largest R-hat is 1.11, indicating chains have not mixed.
Running the chains for more iterations may help. See
https://mc-stan.org/misc/warnings.html#r-hat -
WARN [2025-09-29 19:38:02] dist_fit (chain: 1): Bulk Effective Samples Size (ESS) is too low, indicating posterior means and medians may be unreliable.
Running the chains for more iterations may help. See
https://mc-stan.org/misc/warnings.html#bulk-ess -
WARN [2025-09-29 19:38:02] dist_fit (chain: 1): Tail Effective Samples Size (ESS) is too low, indicating posterior variances and tail quantiles may be unreliable.
Running the chains for more iterations may help. See
https://mc-stan.org/misc/warnings.html#tail-ess -
WARN [2025-09-29 19:38:04] dist_fit (chain: 1): Bulk Effective Samples Size (ESS) is too low, indicating posterior means and medians may be unreliable.
Running the chains for more iterations may help. See
https://mc-stan.org/misc/warnings.html#bulk-ess -
WARN [2025-09-29 19:38:04] dist_fit (chain: 1): Tail Effective Samples Size (ESS) is too low, indicating posterior variances and tail quantiles may be unreliable.
Running the chains for more iterations may help. See
https://mc-stan.org/misc/warnings.html#tail-ess -
WARN [2025-09-29 19:38:06] dist_fit (chain: 1): Bulk Effective Samples Size (ESS) is too low, indicating posterior means and medians may be unreliable.
Running the chains for more iterations may help. See
https://mc-stan.org/misc/warnings.html#bulk-ess -
WARN [2025-09-29 19:38:06] dist_fit (chain: 1): Tail Effective Samples Size (ESS) is too low, indicating posterior variances and tail quantiles may be unreliable.
Running the chains for more iterations may help. See
https://mc-stan.org/misc/warnings.html#tail-ess -
WARN [2025-09-29 19:38:08] dist_fit (chain: 1): Bulk Effective Samples Size (ESS) is too low, indicating posterior means and medians may be unreliable.
Running the chains for more iterations may help. See
https://mc-stan.org/misc/warnings.html#bulk-ess -
WARN [2025-09-29 19:38:08] dist_fit (chain: 1): Tail Effective Samples Size (ESS) is too low, indicating posterior variances and tail quantiles may be unreliable.
Running the chains for more iterations may help. See
https://mc-stan.org/misc/warnings.html#tail-ess -
WARN [2025-09-29 19:38:11] dist_fit (chain: 1): The largest R-hat is 1.05, indicating chains have not mixed.
Running the chains for more iterations may help. See
https://mc-stan.org/misc/warnings.html#r-hat -
WARN [2025-09-29 19:38:11] dist_fit (chain: 1): Bulk Effective Samples Size (ESS) is too low, indicating posterior means and medians may be unreliable.
Running the chains for more iterations may help. See
https://mc-stan.org/misc/warnings.html#bulk-ess -
WARN [2025-09-29 19:38:11] dist_fit (chain: 1): Tail Effective Samples Size (ESS) is too low, indicating posterior variances and tail quantiles may be unreliable.
Running the chains for more iterations may help. See
https://mc-stan.org/misc/warnings.html#tail-ess - 

SORTIE

- lognormal distribution (max: 22):
  meanlog:
    - normal distribution:
      mean:
        0.24
      sd:
        0.11
  sdlog:
    - normal distribution:
      mean:
        0.98
      sd:
        0.1

Temps de génération

Nous devons également spécifier une distribution pour le temps de génération. Nous utiliserons ici une distribution log-normale avec une moyenne de 3,6 et un écart-type de 3,1 (Ganyani et al. 2020).

R

generation_time_variable <- EpiNow2::LogNormal(
  mean = EpiNow2::Normal(mean = 3.6, sd = 0.5),
  sd = EpiNow2::Normal(mean = 3.1, sd = 0.5),
  max = 20
)

Trouver des estimations


La fonction epinow() est une “enveloppe” pour la fonction estimate_infections() utilisée pour estimer les cas par date d’infection. La distribution du temps de génération et la distribution des délais doivent être transmises à l’aide des fonctions generation_time_opts() et delay_opts() respectivement.

Il existe de nombreuses autres entrées qui peuvent être transmises à epinow() voir ?EpiNow2::epinow() pour plus de détails. Une entrée optionnelle consiste à spécifier un a priori log-normal pour le nombre de reproduction effectif \(R_t\) au début de l’épidémie. Nous spécifions une moyenne de 2 jours et un écart-type de 2 jours comme arguments de la commande prior dans rt_opts():

R

# define Rt prior distribution
rt_prior <- EpiNow2::rt_opts(prior = EpiNow2::LogNormal(mean = 2, sd = 2))

Inférence bayésienne à l’aide de Stan

L’inférence bayésienne est réalisée à l’aide de méthodes MCMC avec le programme Stan. Les fonctions Stan disposent d’un certain nombre d’entrées par défaut, notamment le nombre de chaînes et le nombre d’échantillons par chaîne (voir ?EpiNow2::stan_opts()).

Pour réduire le temps de calcul, nous pouvons exécuter les chaînes en parallèle. Pour ce faire, nous devons définir le nombre de cœurs à utiliser. Par défaut, 4 chaînes MCMC sont exécutées (voir stan_opts()$chains), nous pouvons donc définir un nombre égal de cœurs à utiliser en parallèle comme suit :

R

withr::local_options(base::list(mc.cores = 4))

Pour connaître le nombre maximal de cœurs disponibles sur votre machine, utilisez la commande parallel::detectCores().

Liste de vérification

Note : Dans le code ci-dessous _fixed les distributions sont utilisées à la place de _variable (distributions de retard avec incertitude). Cela permet d’accélérer le temps de calcul. Il est généralement recommandé d’utiliser des distributions variables qui tiennent compte d’une incertitude supplémentaire.

R

# fixed alternatives
generation_time_fixed <- EpiNow2::LogNormal(
  mean = 3.6,
  sd = 3.1,
  max = 20
)

reporting_delay_fixed <- EpiNow2::LogNormal(
  mean = 2,
  sd = 1,
  max = 10
)

Vous êtes maintenant prêt à exécuter EpiNow2::epinow() pour estimer le nombre de reproduction variable dans le temps pour les 90 premiers jours :

R

estimates <- EpiNow2::epinow(
  # reported cases
  data = cases,
  # delays
  generation_time = EpiNow2::generation_time_opts(generation_time_fixed),
  delays = EpiNow2::delay_opts(incubation_period_fixed + reporting_delay_fixed),
  # prior
  rt = rt_prior
)

SORTIE

WARN [2025-09-29 19:42:07] epinow: There were 1 divergent transitions after warmup. See
https://mc-stan.org/misc/warnings.html#divergent-transitions-after-warmup
to find out why this is a problem and how to eliminate them. -
WARN [2025-09-29 19:42:07] epinow: Examine the pairs() plot to diagnose sampling problems
 - 

N’attendez pas que cela se poursuive

Pour les besoins de ce tutoriel, nous pouvons optionnellement utiliser EpiNow2::stan_opts() pour réduire le temps de calcul. Nous pouvons spécifier un nombre fixe de samples = 1000 et chains = 2 aux stan l’argument de la EpiNow2::epinow() de la fonction. Cette opération devrait prendre environ 3 minutes.

<Nous pouvons optionnellement définir stan = stan_opts(method = "vb") pour utiliser une méthode d’échantillonnage approximative. Cela devrait prendre moins d’une minute. –>

R

# you can add the `stan` argument
EpiNow2::epinow(
  ...,
  stan = EpiNow2::stan_opts(samples = 1000, chains = 3)
)

Rappelez-vous : En utilisant un nombre approprié d’ échantillons et de chaînes est cruciale pour garantir la convergence et obtenir des estimations fiables dans les calculs bayésiens utilisant Stan. L’obtention de résultats plus précis se fait au détriment de la vitesse.

Résultats

Nous pouvons extraire et visualiser des estimations du nombre de reproductions effectives au fil du temps :

R

estimates$plots$R

L’incertitude des estimations augmente avec le temps. Cela s’explique par le fait que les estimations sont fondées sur des données antérieures, c’est-à-dire sur les périodes de retard. Cette différence d’incertitude est classée dans les catégories suivantes Estimation (vert) utilise toutes les données et Estimation basée sur des données partielles (orange) des estimations basées sur moins de données (parce que les infections qui se sont produites à l’époque sont plus susceptibles de ne pas avoir encore été observées) et qui ont donc des intervalles de plus en plus larges vers la date du dernier point de données. Enfin, les Prévision (violet) est une projection dans le temps.

Nous pouvons également visualiser l’estimation du taux de croissance dans le temps :

R

estimates$plots$growth_rate

Pour extraire un résumé des principaux paramètres de transmission à dernière date* dans les données :

R

summary(estimates)

SORTIE

                        measure                estimate
                         <char>                  <char>
1:       New infections per day    7929 (4634 -- 13046)
2:   Expected change in reports                  Stable
3:   Effective reproduction no.      0.97 (0.72 -- 1.2)
4:               Rate of growth -0.012 (-0.11 -- 0.078)
5: Doubling/halving time (days)       -58 (8.9 -- -6.5)

Ces estimations étant basées sur des données partielles, elles présentent un large intervalle d’incertitude.

  • Le résumé de notre analyse montre que le changement attendu dans les déclarations est de Stable avec l’estimation des nouvelles infections 7929 (4634 – 13046).

  • Le nombre effectif de reproduction \(R_t\) (à la dernière date des données) est de 0.97 (0.72 – 1.2).

  • Le taux de croissance exponentiel du nombre de cas est de -0.012 (-0.11 – 0.078).

  • Le temps de doublement (le temps nécessaire pour que le nombre de cas double) est de -58 (8.9 – -6.5).

Expected change in reports

Un facteur décrivant l’évolution attendue des déclarations sur la base de la probabilité a posteriori que \(R_t < 1\).

Probabilité (\(p\)) Changement attendu (\(p\))
p < 0.05$ Augmentation
0,05$ p< 0,4$ Augmentation probable
0,4$ p< 0,6$ Stable
0,6$ p < 0,95$ Vraisemblablement décroissante
0,95$ p $ Décroissante

Intervalles crédibles

En tout EpiNow2 les régions ombrées reflètent les intervalles de crédibilité de 90 %, 50 % et 20 %, du plus clair au plus foncé.

Liste de vérification

EpiNow2 peut être utilisé pour estimer les paramètres de transmission à partir des données relatives aux cas, à tout moment de l’évolution d’une épidémie. La fiabilité de ces estimations dépend de la qualité des données et du choix approprié des distributions de délais. Dans le prochain tutoriel, nous apprendrons à faire des prévisions et nous étudierons certaines des options d’inférence supplémentaires disponibles dans le logiciel EpiNow2.

Défi


Défi

Quantifier l’hétérogénéité géographique

Les données relatives au début de la pandémie de COVID-19 au Royaume-Uni proviennent du package R incidence2 comprennent la région dans laquelle les cas ont été enregistrés. Pour obtenir des estimations régionales du nombre effectif de reproductions et de cas, nous devons formater les données de manière à ce qu’elles comportent trois colonnes :

  • date la date,
  • region: la région,
  • confirm le nombre de déclarations de maladies (confirmées) pour une région à une date donnée.

Générer des estimations régionales de Rt à partir des incidence2::covidregionaldataUK à partir de la base de données :

  • utiliser incidence2 pour convertir les données agrégées en données d’incidence par la variable region,
  • conserver les 90 premières dates pour toutes les régions,
  • estimer le Rt par région en utilisant le temps de génération défini et les retards dans cet épisode.

R

regional_cases <- incidence2::covidregionaldataUK %>%
  # use {tidyr} to preprocess missing values
  tidyr::replace_na(base::list(cases_new = 0))

Pour manipuler les données, vous pouvez

R

regional_cases <- incidence2::covidregionaldataUK %>%
  # use {tidyr} to preprocess missing values
  tidyr::replace_na(base::list(cases_new = 0)) %>%
  # use {incidence2} to convert aggregated data to incidence data
  incidence2::incidence(
    date_index = "date",
    groups = "region",
    counts = "cases_new",
    count_values_to = "confirm",
    date_names_to = "date",
    complete_dates = TRUE
  ) %>%
  dplyr::select(-count_variable) %>%
  dplyr::filter(date < ymd(20200301))

Pour apprendre à faire l’estimation régionale de Rt, lisez la section de la vignette “Get started” sur regional_epinow() à l’adresse https://epiforecasts.io/EpiNow2/articles/EpiNow2.html#regional_epinow

Pour obtenir des estimations régionales, nous utilisons les mêmes arguments de epinow() dans la fonction regional_epinow():

R

estimates_regional <- EpiNow2::regional_epinow(
  # cases
  data = regional_cases,
  # delays
  generation_time = EpiNow2::generation_time_opts(generation_time_fixed),
  delays = EpiNow2::delay_opts(incubation_period_fixed + reporting_delay_fixed),
  # prior
  rt = rt_prior
)

Visualisez les résultats avec :

R

estimates_regional$summary$summarised_results$table

estimates_regional$summary$plots$R

Points clés

  • Les paramètres de transmission peuvent être estimés à partir des données du cas après prise en compte des retards.
  • L’incertitude peut être prise en compte dans la distribution des retards.