diff --git a/locale/fr/episodes/compare-interventions.Rmd b/locale/fr/episodes/compare-interventions.Rmd new file mode 100644 index 0000000..c71e4f9 --- /dev/null +++ b/locale/fr/episodes/compare-interventions.Rmd @@ -0,0 +1,715 @@ +--- +title: Comparer les résultats des interventions en matière de santé publique +teaching: 45 +exercises: 30 +--- + +```{r setup, echo=FALSE, message=FALSE, warning=FALSE} +webshot::install_phantomjs(force = TRUE) +library(epidemics) + +# hidden seed for stable stochastic output in lesson +set.seed(33) + +polymod <- socialmixr::polymod +contact_data <- socialmixr::contact_matrix( + polymod, + countries = "United Kingdom", + age.limits = c(0, 15, 65), + symmetric = TRUE +) + +# prepare contact matrix +contact_matrix <- t(contact_data$matrix) + +# prepare the demography vector +demography_vector <- contact_data$demography$population +names(demography_vector) <- rownames(contact_matrix) + +# initial conditions: one in every 1 million is infected +initial_i <- 1e-6 +initial_conditions <- c( + S = 1 - initial_i, E = 0, I = initial_i, R = 0, V = 0 +) + +# build for all age groups +initial_conditions <- matrix( + rep(initial_conditions, dim(contact_matrix)[1]), + ncol = 5, byrow = TRUE +) +rownames(initial_conditions) <- rownames(contact_matrix) + +# prepare the population to model as affected by the epidemic +uk_population <- epidemics::population( + name = "UK", + contact_matrix = contact_matrix, + demography_vector = demography_vector, + initial_conditions = initial_conditions +) + +close_schools <- epidemics::intervention( + name = "School closure", + type = "contacts", + time_begin = 50, + time_end = 50 + 100, + reduction = matrix(c(0.5, 0.01, 0.01)) +) + +mask_mandate <- epidemics::intervention( + name = "mask mandate", + type = "rate", + time_begin = 40, + time_end = 40 + 200, + reduction = 0.163 +) + +# time periods +preinfectious_period <- 4.0 +infectious_period <- 5.5 +basic_reproduction <- 2.7 + +# rates +infectiousness_rate <- 1.0 / preinfectious_period +recovery_rate <- 1.0 / infectious_period +transmission_rate <- basic_reproduction / infectious_period + +output_baseline <- epidemics::model_default( + population = uk_population, + transmission_rate = transmission_rate, + infectiousness_rate = infectiousness_rate, + recovery_rate = recovery_rate, + time_end = 300, increment = 1.0 +) +``` + +:::::::::::::::::::::::::::::::::::::: questions + +- Comment puis-je quantifier l'effet d'une intervention ? + +:::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::: objectives + +- Comparez les scénarios d'intervention + +:::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::: prereq + +- Compléter les tutoriels [Simuler la transmission](../episodes/simulating-transmission.md) et [Modélisation des interventions](../episodes/modelling-interventions.md) + +Les apprenants doivent se familiariser avec les dépendances conceptuelles suivantes avant de travailler sur ce didacticiel : + +**Réponse à l'épidémie** : [Types d'intervention](https://www.cdc.gov/nonpharmaceutical-interventions/). +::::::::::::::::::::::::::::::::: + +## Introduction + +Dans ce tutoriel, nous allons comparer des scénarios d'intervention les uns par rapport aux autres. Pour quantifier l'effet d'une intervention, nous devons comparer notre scénario d'intervention à un scénario contrefactuel (de référence). Le scénario *contrefactuel* est le scénario dans lequel rien ne change, souvent appelé "scénario du statu quo". Le scénario contrefactuel peut présenter les caractéristiques suivantes + +- aucune intervention, ou +- Interventions existantes (si nous étudions l'impact potentiel d'une intervention supplémentaire) + +Nous devons également définir nos *résultat d'intérêt* afin d'établir des comparaisons entre les scénarios d'intervention et les scénarios contrefactuels. Le résultat d'intérêt peut être + +- les résultats directs du modèle (par exemple, le nombre d'infections, d'hospitalisations) +- Mesures épidémiologiques (par exemple, heure du pic épidémique, taille finale de l'épidémie) +- Mesures de l'impact sur la santé (par exemple, années de vie corrigées de la qualité [QALYs] ou les années de vie corrigées de l'incapacité [AVCI] ) +- Mesures économiques (par exemple, coûts des soins de santé, pertes de productivité) + +Dans ce tutoriel, nous allons apprendre à utiliser le paquetage R `{epidemics}` pour comparer l'effet de différentes interventions sur des trajectoires de maladies simulées. Nous utiliserons `{socialmixr}` pour les données sur les contacts sociaux et `{tidyverse}` (y compris les `{dplyr}`, `{ggplot2}` et le tuyau `%>%`) pour la manipulation et la visualisation des données. + +```{r, message=FALSE, warning=FALSE} +library(epidemics) +library(socialmixr) +library(tidyverse) +``` + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: instructor + +Dans ce tutoriel, nous introduisons le concept de contre-factuel et la manière de comparer des scénarios (contre-factuel versus intervention) les uns par rapport aux autres. + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +## Visualiser l'effet des interventions + +Pour comparer le scénario de base aux scénarios d'intervention, nous pouvons visualiser le résultat qui nous intéresse. Ce résultat peut être simplement la sortie du modèle ou une mesure agrégée de la sortie du modèle. + +Si nous voulons étudier l'évolution du pic épidémique après l'application d'une intervention, nous pouvons tracer les trajectoires du modèle dans le temps : + +```{r} +output_baseline <- epidemics::model_default( + population = uk_population, + transmission_rate = transmission_rate, + infectiousness_rate = infectiousness_rate, + recovery_rate = recovery_rate, + time_end = 300, increment = 1.0 +) + +output_school <- epidemics::model_default( + # population + population = uk_population, + # rate + transmission_rate = transmission_rate, + infectiousness_rate = infectiousness_rate, + recovery_rate = recovery_rate, + # intervention + intervention = list(contacts = close_schools), + # time + time_end = 300, increment = 1.0 +) + +# create intervention_type column for plotting +output_school$intervention_type <- "school closure" +output_baseline$intervention_type <- "baseline" +output <- rbind(output_school, output_baseline) + +output %>% + filter(compartment == "infectious") %>% + ggplot() + + aes( + x = time, + y = value, + color = intervention_type, + linetype = intervention_type + ) + + stat_summary( + fun = "sum", + geom = "line", + linewidth = 1 + ) + + scale_y_continuous( + labels = scales::comma + ) + + geom_vline( + xintercept = c( + close_schools$time_begin, + close_schools$time_end + ), + linetype = 2 + ) + + theme_bw() + + labs( + x = "Simulation time (days)", + y = "Individuals" + ) +``` + +Si nous voulons quantifier l'impact de l'intervention sur les résultats du modèle dans le temps, nous pouvons considérer le nombre cumulé de personnes infectieuses dans le scénario de base par rapport au scénario d'intervention : + +```{r} +output %>% + filter(compartment == "infectious") %>% + group_by(time, intervention_type) %>% + summarise(value_total = sum(value)) %>% + group_by(intervention_type) %>% + mutate(cum_value = cumsum(value_total)) %>% + ggplot() + + geom_line( + aes( + x = time, + y = cum_value, + color = intervention_type, + linetype = intervention_type + ), + linewidth = 1.2 + ) + + scale_y_continuous( + labels = scales::comma + ) + + geom_vline( + xintercept = c( + close_schools$time_begin, + close_schools$time_end + ), + linetype = 2 + ) + + theme_bw() + + labs( + x = "Simulation time (days)", + y = "Cumulative number of infectious individuals" + ) +``` + +### Modèle Vacamole + +Le modèle Vacamole est un modèle déterministe basé sur un système d'équations différentielles ordinaires (ODE) développé par [Ainslie et al. (2022)](https://doi.org/10.2807/1560-7917.ES.2022.27.44.2101090) pour décrire l'effet de la vaccination sur la dynamique de COVID-19. Le modèle se compose de 11 compartiments, dans lesquels les individus sont classés comme suit : + +- Susceptibles ($S$) +- Partiellement vacciné ($V_1$) +- Totalement vacciné ($V_2$) +- Exposé ($E$) et exposé alors qu'il est vacciné ($E_V$) +- Infectieux ($I$) et infectieux en cas de vaccination ($I_V$) +- Hospitalisé ($H$) et hospitalisé alors qu'il était vacciné ($H_V$) +- Mort ($D$) +- Récupéré ($R$) + +Le schéma ci-dessous décrit le flux d'individus à travers les différents compartiments. + +```{r, echo=FALSE, message=FALSE, out.width="80%"} +DiagrammeR::grViz("digraph{ + # graph statement + ################# + graph [layout = dot, + rankdir = LR, + overlap = true, + fontsize = 8] + + # nodes + ####### + node [shape = square, + fixedsize = true + width = 1.3] + + S + E + Ev [label = 'E@_{V}', style = filled, fillcolour = 'gray'] + I + Iv [label = 'I@_{V}', style = filled, fillcolour = 'gray'] + H + Hv [label = 'H@_{V}', style = filled, fillcolour = 'gray'] + D + R + V1 [label = 'V@_{1}', style = filled, fillcolour = 'gray'] + V2 [label = 'V@_{2}', style = filled, fillcolour = 'gray'] + + + # edges + ####### + S -> E [label = ' infection (β) '] + S -> V1 [xlabel = ' vaccination \n(ν1)'] + V1 -> E [xlabel = ' infection (β)'] + V1 -> V2 [xlabel = ' vaccination\n(2nd dose) (ν2)'] + V2 -> Ev [label = ' infection (β)'] + Ev -> Iv [label = ' onset of \ninfectiousness (α) '] + E -> I [label = ' onset of \ninfectiousness (α) '] + I -> H [label = ' hospitalisation (η)'] + Iv -> Hv [label = ' hospitalisation (η@_{V})'] + I -> D [label = ' death (ω)'] + I -> R [label = ' recovery (γ)'] + Iv -> D [label = ' death (ω@_{V})'] + Iv -> R [label = ' recovery (γ)'] + Hv -> D [label = ' death (ω@_{V})'] + Hv -> R [label = ' recovery (γ)'] + H -> D [label = ' death (ω)'] + H -> R [label = ' recovery (γ)'] + + subgraph { + rank = same; S; V1;V2; + } +}") +``` + +::::::::::::::::::::::::::::::::::::: challenge + +## Exécution d'un scénario contrefactuel à l'aide du modèle Vacamole + +1. Exécutez le modèle avec les valeurs de paramètres par défaut pour la population britannique en supposant que : + +- un individu sur un million (0,0001 %) est contagieux (et non vacciné) au début de la simulation. +- La matrice des contacts pour le Royaume-Uni comporte les tranches d'âge suivantes : + - 0-20 ans + - 20-40 ans + - 40 ans et plus + +Pour les scénarios suivants : + +- Scénario de base : Programme de vaccination à deux doses + - La dose 1 (taux de vaccination 0,01) commence à partir du jour 30. + - La dose 2 (taux de vaccination 0,01) est administrée à partir du 60e jour. + - Les deux programmes durent 300 jours +- Intervention : Mandat de masque + - Commence à partir du jour 60 + - Durée de 100 jours + - Réduit le taux de transmission de 16,3 % (d'après des études empiriques sur l'efficacité des masques) + +Il n'y a pas de programme de vaccination en place + +2. À l'aide du résultat, tracez le nombre cumulé de décès au fil du temps. + +::::::::::::::::: hint + +### CONSEIL : Exécuter le modèle avec des valeurs de paramètres par défaut + +Nous pouvons exécuter le modèle Vacamole avec [valeurs de paramètres par défaut](https://epiverse-trace.github.io/epidemics/articles/model_vacamole.html#model-epidemic-using-vacamole) en spécifiant simplement l'objet de la population et le nombre de pas de temps pour lesquels le modèle doit être exécuté : + +```{r, eval=FALSE} +output <- epidemics::model_vacamole( + population = uk_population, + time_end = 300 +) +``` + +:::::::::::::::::::::: + +::::::::::::::::: solution + +1. Exécutez le modèle + +```{r} +polymod <- socialmixr::polymod +contact_data <- socialmixr::contact_matrix( + survey = polymod, + countries = "United Kingdom", + age.limits = c(0, 20, 40), + symmetric = TRUE +) +# prepare contact matrix +contact_matrix <- t(contact_data$matrix) + +# extract demography vector +demography_vector <- contact_data$demography$population +names(demography_vector) <- rownames(contact_matrix) + +# prepare initial conditions +initial_i <- 1e-6 + +initial_conditions_vacamole <- c( + S = 1 - initial_i, + V1 = 0, V2 = 0, + E = 0, EV = 0, + I = initial_i, IV = 0, + H = 0, HV = 0, D = 0, R = 0 +) + +initial_conditions_vacamole <- rbind( + initial_conditions_vacamole, + initial_conditions_vacamole, + initial_conditions_vacamole +) +rownames(initial_conditions_vacamole) <- rownames(contact_matrix) + +# prepare population object +uk_population_vacamole <- epidemics::population( + name = "UK", + contact_matrix = contact_matrix, + demography_vector = demography_vector, + initial_conditions = initial_conditions_vacamole +) + +# prepare two vaccination objects +# dose 1 vaccination +dose_1 <- epidemics::vaccination( + name = "two-dose vaccination", # name given to first dose + nu = matrix(0.01, nrow = 3), + time_begin = matrix(30, nrow = 3), + time_end = matrix(300, nrow = 3) +) + +# prepare the second dose with a 30 day interval in start date +dose_2 <- epidemics::vaccination( + name = "two-dose vaccination", # name given to first dose + nu = matrix(0.01, nrow = 3), + time_begin = matrix(30 + 30, nrow = 3), + time_end = matrix(300, nrow = 3) +) + +# use `c()` to combine the two doses +double_vaccination <- c(dose_1, dose_2) + +# run baseline model +output_baseline_vc <- epidemics::model_vacamole( + population = uk_population_vacamole, + vaccination = double_vaccination, + time_end = 300 +) + +# create mask intervention +mask_mandate <- epidemics::intervention( + name = "mask mandate", + type = "rate", + time_begin = 60, + time_end = 60 + 100, + reduction = 0.163 +) + +# run intervention model +output_intervention_vc <- epidemics::model_vacamole( + population = uk_population_vacamole, + vaccination = double_vaccination, + intervention = list( + transmission_rate = mask_mandate + ), + time_end = 300 +) + +``` + +2. Tracez le nombre cumulé de décès au fil du temps + +```{r} +# create intervention_type column for plotting +output_intervention_vc$intervention_type <- "mask mandate" +output_baseline_vc$intervention_type <- "baseline" +output_vacamole <- rbind(output_intervention_vc, output_baseline_vc) + +output_vacamole %>% + filter(compartment == "dead") %>% + group_by(time, intervention_type) %>% + summarise(value_total = sum(value)) %>% + group_by(intervention_type) %>% + mutate(cum_value = cumsum(value_total)) %>% + ggplot() + + geom_line( + aes( + x = time, + y = cum_value, + color = intervention_type, + linetype = intervention_type + ), + linewidth = 1.2 + ) + + scale_y_continuous( + labels = scales::comma + ) + + theme_bw() + + labs( + x = "Simulation time (days)", + y = "Cumulative number of deaths" + ) + +``` + +::::::::::::::::::::::::::: + +:::::::::::::::::::::::::::::::::::::::::::::::: + +## Calcul des résultats évités + +Si les visualisations sont utiles pour comparer les scénarios d'intervention dans le temps, nous avons également besoin de mesures quantitatives de l'impact de l'intervention. L'une de ces mesures est le nombre d'infections évitées, qui nous aide à comprendre la différence entre les scénarios d'intervention. + +Le paquetage R `{epidemics}` fournit l'outil `outcomes_averted()` pour calculer les infections évitées en tenant compte de l'incertitude des paramètres. Étendons notre exemple COVID-19 de [Modélisation des interventions](../episodes/modelling-interventions.md) pour tenir compte de l'incertitude concernant le nombre de reproduction de base ($R_0$). + +```{r} +# time periods +preinfectious_period <- 4.0 +infectious_period <- 5.5 + +# specify the mean and standard deviation of R0 +r_estimate_mean <- 2.7 +r_estimate_sd <- 0.05 + +# generate 100 R samples +r_samples <- withr::with_seed( + seed = 1, + rnorm( + n = 100, mean = r_estimate_mean, sd = r_estimate_sd + ) +) + +beta <- r_samples / infectious_period + +# rates +infectiousness_rate <- 1.0 / preinfectious_period +recovery_rate <- 1.0 / infectious_period +``` + +Nous utilisons ces valeurs de paramètres en même temps que la structure de la population et la matrice de contact utilisées dans le cadre de l [Modélisation des interventions](../episodes/modelling-interventions.md) afin d'exécuter le modèle pour le scénario de base : + +```{r} +output_baseline <- epidemics::model_default( + population = uk_population, + transmission_rate = beta, + infectiousness_rate = infectiousness_rate, + recovery_rate = recovery_rate, + time_end = 300, increment = 1.0 +) +``` + +Ensuite, nous dressons une liste de toutes les interventions que nous voulons inclure dans notre comparaison. Nous définissons nos scénarios comme suit : + +- scénario 1 : fermer les écoles +- scénario 2 : mandat de masquage +- scénario 3 : fermeture des écoles et mandat de masquage. + +Dans R, nous spécifions ceci comme : + +```{r} +intervention_scenarios <- list( + scenario_1 = list( + contacts = close_schools + ), + scenario_2 = list( + transmission_rate = mask_mandate + ), + scenario_3 = list( + contacts = close_schools, + transmission_rate = mask_mandate + ) +) +``` + +Nous utilisons cette liste comme entrée pour `intervention` dans `model_default` + +```{r} +output <- epidemics::model_default( + uk_population, + transmission_rate = beta, + infectiousness_rate = infectiousness_rate, + recovery_rate = recovery_rate, + time_end = 300, increment = 1.0, + intervention = intervention_scenarios +) +head(output) +``` + +Maintenant que nous disposons des résultats de notre modèle pour tous nos scénarios, nous voulons comparer les résultats des interventions à notre base de référence. + +Nous pouvons le faire en utilisant `outcomes_averted()` dans `{epidemics}`. Cette fonction calcule la taille finale de l'épidémie pour chaque scénario, puis le nombre d'infections évitées dans chaque scénario par rapport à la ligne de base. Pour utiliser cette fonction, il faut spécifier le paramètre : + +- le résultat du scénario de base +- les résultats du ou des scénarios d'intervention. + +```{r} +intervention_effect <- epidemics::outcomes_averted( + baseline = output_baseline, scenarios = output +) +intervention_effect +``` + +Le résultat nous donne les infections évitées dans chaque scénario par rapport à la ligne de base. Pour obtenir le nombre total d'infections évitées, nous spécifions `by_group = FALSE`: + +```{r} +intervention_effect <- epidemics::outcomes_averted( + baseline = output_baseline, scenarios = output, + by_group = FALSE +) +intervention_effect +``` + +::::::::::::::::::::::::::: testimonial + +### Vignettes de paquets + +Nous vous recommandons de lire la vignette sur [Modélisation des réponses à une épidémie stochastique de virus Ebola](https://epiverse-trace.github.io/epidemics/articles/model_ebola.html) d'utiliser un modèle compartimental stochastique à temps discret d'Ebola utilisé lors de l'épidémie de MVE de 2014 en Afrique de l'Ouest. + +::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::: challenge + +## Défi : Analyse de l'épidémie d'Ebola + +Vous avez été chargé d'étudier l'impact potentiel d'une intervention sur une épidémie d'Ebola en Guinée (par exemple, une réduction des contacts à risque avec les cas). En utilisant `model_ebola()` et les informations détaillées ci-dessous, trouvez le nombre d'infections évitées lorsque : + +- une intervention est appliquée pour réduire le taux de transmission de 50 % à partir du jour 60 et, +- une intervention est appliquée pour réduire la transmission de 10 % à partir du 30e jour. + +Pour les deux interventions, nous supposons qu'il existe une certaine incertitude quant au taux de transmission de base. Nous capturons cette incertitude en la tirant d'une distribution normale avec une moyenne = 1,1 / 12 (c.-à-d. $R_0=1.1$ et la période infectieuse = 12 jours) et un écart-type = 0,01. + +*Remarque : selon le nombre de réplicats utilisés, l'exécution de cette simulation peut prendre plusieurs minutes.* + +- Taille de la population : 14 millions +- Nombre initial d'individus exposés : 10 +- Nombre initial de personnes infectieuses : 5 +- Durée de la simulation : 120 jours +- Valeurs des paramètres : + - $R_0$ (`r0`) = 1.1, + - $p^I$ (`infectious_period`) = 12, + - $p^E$ (`preinfectious_period`) = 5, + - $k^E=k^I = 2$, + - $1-p_{hosp}$ (`prop_community`) = 0.9, + - $p_{ETU}$ (`etu_risk`) = 0.7, + - $p_{funeral}$ (`funeral_risk`) = 0.5 + +:::::::::::::::::::::::: solution + +```{r} +population_size <- 14e6 + +E0 <- 10 +I0 <- 5 +# prepare initial conditions as proportions +initial_conditions <- c( + S = population_size - (E0 + I0), E = E0, I = I0, H = 0, F = 0, R = 0 +) / population_size + +# set up population object +guinea_population <- population( + name = "Guinea", + contact_matrix = matrix(1), # note dummy value + demography_vector = population_size, # 14 million, no age groups + initial_conditions = matrix( + initial_conditions, + nrow = 1 + ) +) + +# generate 100 beta samples +beta <- withr::with_seed( + seed = 1, + rnorm( + n = 100, mean = 1.1 / 12, sd = 0.01 + ) +) + +# run the baseline +output_baseline <- epidemics::model_ebola( + population = guinea_population, + transmission_rate = beta, + infectiousness_rate = 2.0 / 5, + removal_rate = 2.0 / 12, + prop_community = 0.9, + etu_risk = 0.7, + funeral_risk = 0.5, + time_end = 100, + replicates = 100 # replicates argument +) + +# create intervention objects +reduce_transmission_1 <- epidemics::intervention( + type = "rate", + time_begin = 60, time_end = 100, reduction = 0.5 +) + +reduce_transmission_2 <- epidemics::intervention( + type = "rate", + time_begin = 30, time_end = 100, reduction = 0.1 +) + +# create intervention list +intervention_scenarios <- list( + scenario_1 = list( + transmission_rate = reduce_transmission_1 + ), + scenario_2 = list( + transmission_rate = reduce_transmission_2 + ) +) + +# run model +output_intervention <- epidemics::model_ebola( + population = guinea_population, + transmission_rate = beta, + infectiousness_rate = 2.0 / 5, + removal_rate = 2.0 / 12, + prop_community = 0.9, + etu_risk = 0.7, + funeral_risk = 0.5, + time_end = 100, + replicates = 100, # replicates argument, + intervention = intervention_scenarios +) + +# calculate outcomes averted +intervention_effect <- epidemics::outcomes_averted( + baseline = output_baseline, scenarios = output_intervention, + by_group = FALSE +) +intervention_effect +``` + +**Note : Le nombre d'infections évitées peut être négatif. Cela est dû à la variation stochastique des trajectoires de la maladie pour un taux de transmission donné, qui peut entraîner une épidémie de taille différente.** + +::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::: keypoints + +- Un scénario contrefactuel (de référence) doit être clairement défini pour permettre des comparaisons significatives. +- Les scénarios peuvent être comparés à l'aide de visualisations et de mesures quantitatives. +- La fonction outcomes\_averted() permet de quantifier les effets de l'intervention. +- L'incertitude des paramètres doit être prise en compte dans l'analyse des interventions + +:::::::::::::::::::::::::::::::::::::::::::::::: + + diff --git a/locale/fr/episodes/contact-matrices.Rmd b/locale/fr/episodes/contact-matrices.Rmd new file mode 100644 index 0000000..10a7052 --- /dev/null +++ b/locale/fr/episodes/contact-matrices.Rmd @@ -0,0 +1,307 @@ +--- +title: Matrices de contact +teaching: 40 +exercises: 10 +--- + +```{r setup, echo=FALSE, message=FALSE, warning=FALSE} +# we need {webshot} to print {DiagrammeR} outputs +webshot::install_phantomjs(force = TRUE) +``` + +:::::::::::::::::::::::::::::::::::::: questions + +- Qu'est-ce qu'une matrice de contact ? +- Comment les matrices de contact sont-elles estimées ? +- Comment les matrices de contact sont-elles utilisées dans l'analyse épidémiologique ? + +:::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::: objectives + +- Utilisez le paquetage R `socialmixr` pour estimer une matrice de contact +- Comprendre les différents types d'analyse pour lesquels les matrices de contact peuvent être utilisées + :::::::::::::::::::::::::::::::::::::::::::::::: + + + + + + + +## Introduction + +Certains groupes d'individus ont plus de contacts que d'autres ; l'écolier moyen a beaucoup plus de contacts quotidiens que la personne âgée moyenne, par exemple. Cette hétérogénéité des schémas de contact entre les différents groupes peut affecter la transmission des maladies, car certains groupes sont plus susceptibles de transmettre la maladie à d'autres membres de ce groupe, ainsi qu'à d'autres groupes. La vitesse à laquelle les individus d'un même groupe et d'un groupe à l'autre entrent en contact avec d'autres personnes peut être résumée dans une matrice de contact. Dans ce tutoriel, nous allons apprendre comment les matrices de contact peuvent être utilisées dans différentes analyses et comment la matrice de contact peut être utilisée. `{socialmixr}` peut être utilisé pour estimer les matrices de contact. + +```{r, message=FALSE, warning=FALSE} +library(socialmixr) +``` + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: instructor + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +## La matrice de contact + +La matrice de contact de base représente la quantité de contacts ou de mélanges au sein de différents sous-groupes d'une population et entre ces sous-groupes. Les sous-groupes sont souvent des catégories d'âge, mais peuvent aussi être.. : + +- des zones géographiques (par exemple, différentes régions ou différents pays) +- Groupes à risque (par exemple, professions à haut/faible risque) +- Milieux sociaux (ménage, lieu de travail, école, etc.) + +Par exemple, une matrice de contact hypothétique représentant le nombre moyen de contacts par jour entre les enfants et les adultes pourrait être la suivante : + +$$ +\begin{bmatrix} +2 & 2\ +1 & 3 +\end{bmatrix} +$$ +Dans cet exemple, cela signifie que les enfants rencontrent en moyenne 2 autres enfants et 2 adultes par jour (première ligne), et que les adultes rencontrent en moyenne 1 enfant et 3 autres adultes par jour (deuxième ligne). Nous pouvons utiliser ce type d'information pour rendre compte du rôle que joue l'hétérogénéité des contacts dans la transmission des maladies infectieuses. + +::::::::::::::::::::::::::::::::::::: callout + +### Note sur la notation + +Pour une matrice de contact avec des lignes $i$ et des colonnes $j$: + +- $C [i,j] $ représente le nombre moyen de contacts que les individus du groupe $i$ ont avec les individus du groupe $j$ +- Cette moyenne est calculée comme le nombre total de contacts entre les groupes. $i$ et $j$ divisé par le nombre d'individus dans le groupe $i$ + :::::::::::::::::::::::::::::::::::::::::::::::: + +## L'utilisation `socialmixr` + +Les matrices de contact sont généralement estimées à partir d'études utilisant des journaux pour enregistrer les interactions. Par exemple, l'enquête POLYMOD a mesuré les schémas de contact dans 8 pays européens en utilisant des données sur le lieu et la durée des contacts rapportés par les participants à l'étude. [(Mossong et al. 2008)](https://doi.org/10.1371/journal.pmed.0050074). + +Le paquetage R `{socialmixr}` contient des fonctions permettant d'estimer les matrices de contact à partir de POLYMOD et d'autres enquêtes. Nous pouvons charger les données de l'enquête POLYMOD : + +```{r polymod_, echo=TRUE} +polymod <- socialmixr::polymod +``` + +Nous pouvons alors obtenir la matrice de contact pour les catégories d'âge souhaitées en spécifiant `age.limits`. + +```{r polymod_uk, echo=TRUE} +contact_data <- contact_matrix( + survey = polymod, + countries = "United Kingdom", + age.limits = c(0, 20, 40), + symmetric = TRUE +) +contact_data +``` + +**Remarque : bien que la matrice de contact `contact_data$matrix` ne soit pas elle-même mathématiquement symétrique, elle satisfait à la condition selon laquelle le nombre total de contacts d'un groupe avec un autre est le même que l'inverse. En d'autres termes : +`contact_data$matrix[j,i]*contact_data$demography$proportion[j] = contact_data$matrix[i,j]*contact_data$demography$proportion[i]`. +Pour l'explication mathématique, voir [la section correspondante dans la documentation de socialmixr](https://epiforecasts.io/socialmixr/articles/socialmixr.html#symmetric-contact-matrices).** + +::::::::::::::::::::::::::::::::::::: callout + +### Pourquoi une matrice de contact serait-elle non symétrique ? + +L'un des arguments que nous avons donné à la fonction `contact_matrix()` est `symmetric=TRUE`. Cela garantit que le nombre total de contacts d'un groupe à l'autre est égal au nombre total de contacts du second groupe au premier (voir la section `socialmixr` [vignette](https://cran.r-project.org/web/packages/socialmixr/vignettes/socialmixr.html) pour plus de détails). + +Cependant, lorsque les matrices de contact sont estimées à partir d'enquêtes ou d'autres sources, la méthode des *rapportées* le nombre de contacts rapportés peut différer selon le groupe d'âge, et ce pour plusieurs raisons : + +- Biais de mémorisation : Les différents groupes d'âge peuvent avoir des capacités différentes à se souvenir des contacts et à les rapporter avec précision. +- Biais de déclaration : certains groupes peuvent systématiquement surestimer ou sous-estimer leurs contacts. +- Incertitude de l'échantillonnage : La taille limitée des échantillons peut entraîner des variations statistiques + [(Prem et al 2021)](https://doi.org/10.1371/journal.pcbi.1009098) + +Si `symmetric` est réglé sur VRAI, le `contact_matrix()` utilisera en interne une moyenne des contacts signalés pour s'assurer que le nombre total de contacts obtenu est symétrique. + +:::::::::::::::::::::::::::::::::::::::::::::::: + +L'exemple ci-dessus utilise l'enquête POLYMOD. Il existe un certain nombre d'enquêtes disponibles dans `socialmixr` Pour obtenir la liste des enquêtes disponibles, utilisez `list_surveys()`. Pour télécharger une enquête, vous pouvez utiliser `get_survey()` + +```{r, message=FALSE, warning=FALSE} +zambia_sa_survey <- get_survey("https://doi.org/10.5281/zenodo.3874675") +``` + +::::::::::::::::::::::::::::::::::::: challenge + +## Matrice des contacts en Zambie + +Après avoir téléchargé l'enquête, générez une matrice de contact symétrique pour la Zambie en utilisant les tranches d'âge suivantes : + +- \[0,20) +- 20+ + +:::::::::::::::::::::::: solution + +```{r polymod_poland} +contact_data_zambia <- contact_matrix( + survey = zambia_sa_survey, + age.limits = c(0, 20), + symmetric = TRUE +) +contact_data_zambia +``` + +::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::: callout + +## Matrices de contact synthétiques + +Les matrices de contact peuvent être estimées à partir de données obtenues à partir d'agendas (tels que POLYMOD), d'enquêtes ou de données de contact, ou des matrices synthétiques peuvent être utilisées. [Prem et al. 2021](https://doi.org/10.1371/journal.pcbi.1009098) ont utilisé les données POLYMOD dans le cadre d'un modèle hiérarchique bayésien pour projeter les matrices de contact de 177 autres pays. + +:::::::::::::::::::::::::::::::::::::::::::::::: + +## Analyses avec des matrices de contact + +Les matrices de contact peuvent être utilisées dans un large éventail d'analyses épidémiologiques : + +- pour calculer le nombre de reproduction de base tout en tenant compte des différents taux de contacts entre les groupes d'âge [(Funk et al. 2019)](https://doi.org/10.1186/s12916-019-1413-7), +- pour calculer la taille finale d'une épidémie, comme dans le package R `{finalsize}`, +- pour évaluer l'impact des interventions en déterminant le changement relatif entre les matrices de contact avant et après l'intervention pour calculer la différence relative dans le nombre de cas. $R_0$ [(Jarvis et al. 2020)](https://doi.org/10.1186/s12916-020-01597-8), +- et dans les modèles mathématiques de transmission au sein d'une population, afin de tenir compte des schémas de contact propres à chaque groupe. + +Cependant, toutes ces applications nous obligent à effectuer des calculs supplémentaires à l'aide de la matrice de contact. Plus précisément, nous devons souvent effectuer deux calculs principaux : + +1. **Convertir la matrice de contact en nombre attendu de cas secondaires** + +Si les contacts varient entre les groupes, le nombre moyen de cas secondaires ne sera pas simplement égal au nombre moyen de contacts multiplié par la probabilité de transmission par contact. En effet, la quantité moyenne de transmission dans chaque génération d'infection ne dépend pas seulement des personnes avec lesquelles un groupe est entré en contact, mais aussi des personnes avec lesquelles il est entré en contact. *leurs contacts* contactés par la suite. La fonction `r_eff` dans le paquet `{finalsize}` peut effectuer cette conversion, en prenant une matrice de contact, la démographie et la proportion de personnes sensibles et en la convertissant en une estimation du nombre moyen de cas secondaires générés par un individu infectieux typique (c'est-à-dire le nombre de reproduction effectif). + +2. **Convertir la matrice des contacts en taux de contact** + +Alors qu'une matrice de contacts donne le nombre moyen de contacts qu'un groupe établit avec un autre, la dynamique épidémique dans différents groupes dépend du taux auquel un groupe en infecte un autre. Nous devons donc mettre à l'échelle le taux d'interaction entre les différents groupes (c'est-à-dire le nombre de contacts par unité de temps) pour obtenir le taux de transmission. Cependant, nous devons veiller à définir correctement la transmission vers et depuis chaque groupe dans n'importe quel modèle. Plus précisément, l'entrée $(i,j)$ dans la matrice des contacts d'un modèle mathématique représente les contacts du groupe $i$ avec le groupe $j$. Mais si nous voulons connaître le taux auquel un groupe $i$ est infecté, nous devons multiplier le nombre de contacts des personnes sensibles dans le groupe $i$ ($S_i$) avec le groupe $j$ ( $C [i,j] $) avec la proportion de ces contacts qui sont infectieux ($I_j/N_j$) et le risque de transmission par contact ($\beta$). + +### Dans les modèles mathématiques + +Considérons le modèle SIR dans lequel les individus sont catégorisés comme étant soit sensibles $S$ infectés mais pas encore infectieux $E$ contagieux $I$ ou guéri $R$. Le schéma ci-dessous montre les processus qui décrivent le flux d'individus entre les différents états pathologiques. $S$, $I$ et $R$ et les paramètres clés de chaque processus. + +```{r diagram, echo=FALSE, message=FALSE} +DiagrammeR::grViz("digraph { + + # graph statement + ################# + graph [layout = dot, + rankdir = LR, + overlap = true, + fontsize = 10] + + # nodes + ####### + node [shape = square, + fixedsize = true + width = 1.3] + + S + I + R + + # edges + ####### + S -> I [label = ' infection \n(transmission rate β)'] + I -> R [label = ' recovery \n(recovery rate γ)'] + +}") +``` + +Les [équations différentielles](../learners/reference.md#ordinary) ci-dessous décrivent comment les individus passent d'un état à un autre [(Bjørnstad et al. 2020)](https://doi.org/10.1038/s41592-020-0822-z). + +$$ +\begin{aligned} +\frac{dS}{dt} & = - \beta S I /N \ +\frac{dI}{dt} &= \beta S I /N - \gamma I \ +\frac{dR}{dt} &=\gamma I \ +\end{aligned} +$$ +Pour ajouter une structure d'âge à notre modèle, nous devons ajouter des équations supplémentaires pour les états d'infection $S$, $I$ et $R$ pour chaque groupe d'âge $i$. Si nous voulons supposer qu'il existe une hétérogénéité dans les contacts entre les groupes d'âge, nous devons adapter le terme de transmission $\beta SI$ pour inclure la matrice de contact $C$ comme suit : + +$$ \beta S_i \sum_j C_{i,j} I_j/N_j. $$ + +Individus sensibles dans le groupe d'âge $i$ sont infectés en fonction de leur taux de contact avec les individus de chaque groupe d'âge. Pour chaque état pathologique ($S$, $E$, $I$ et $R$) et le groupe d'âge ($i$), nous avons une équation différentielle décrivant le taux de changement par rapport au temps. + +$$ +\begin{aligned} +\frac{dS_i}{dt} & = - \beta S_i \sum_j C_{i,j} I_j/N_j \ +\frac{dI_i}{dt} &= \beta S_i\sum_j C_{i,j} I_j/N_j - \gamma I_i \ +\frac{dR_i}{dt} &=\gamma I_i \ +\end{aligned} +$$ + +### La normalisation de la matrice des contacts pour garantir la valeur correcte de $R_0$ + +Lors de la simulation d'une épidémie, nous voulons souvent nous assurer que le nombre moyen de cas secondaires générés par un individu infectieux typique (c'est-à-dire $R_0$) soit cohérent avec les valeurs connues pour l'agent pathogène que nous analysons. Dans le modèle ci-dessus, nous mettons à l'échelle la matrice des contacts par le facteur $\beta$ pour convertir les données brutes d'interaction en taux de transmission. Mais comment définir la valeur de $\beta$ pour garantir une certaine valeur de $R_0$? + +Plutôt que d'utiliser le nombre brut de contacts, nous pouvons normaliser la matrice des contacts afin de faciliter le travail en termes de $R_0$. En particulier, nous normalisons la matrice en la mettant à l'échelle de sorte que si nous devions calculer le nombre moyen de cas secondaires sur la base de cette matrice normalisée, le résultat serait 1 (en termes mathématiques, nous mettons la matrice à l'échelle de sorte que la plus grande valeur propre soit 1). Cette transformation met à l'échelle les entrées mais préserve leurs valeurs relatives. + +Dans le cas du modèle ci-dessus, nous voulons définir $\beta C_{i,j}$ afin que le modèle ait une valeur spécifiée de $R_0$. Si l'entrée de la matrice de contact $C [i,j] $ représente les contacts de la population $i$ avec $j$ il est équivalent à `contact_data$matrix[i,j]` et la valeur propre maximale de cette matrice représente l'ampleur typique des contacts, et non l'ampleur typique de la transmission. Nous devons donc normaliser la matrice $C$ de manière à ce que la valeur propre maximale soit égale à un ; nous appelons cette matrice $C_{normalised}$. Comme le taux de récupération est $\gamma$ les individus seront infectieux en moyenne pendant $1/\gamma$ jours. Ainsi, le taux de guérison est de $\beta$ en tant qu'entrée du modèle est calculée à partir de $R_0$ le facteur d'échelle et la valeur de $\gamma$ (c'est-à-dire que, mathématiquement, nous utilisons le fait que la valeur propre dominante de la matrice $R_0 \times C_{normalised}$ est égale à $\beta / \gamma$). + +```{r} +contact_matrix <- t(contact_data$matrix) +scaling_factor <- 1 / max(eigen(contact_matrix)$values) +normalised_matrix <- contact_matrix * scaling_factor +``` + +Par conséquent, si nous multiplions la matrice mise à l'échelle par $R_0$ puis en la convertissant en nombre de cas secondaires attendus, nous obtenons $R_0$, comme requis. + +```{r} +infectious_period <- 7.0 +basic_reproduction <- 1.46 +transmission_rate <- basic_reproduction * scaling_factor / infectious_period +# check the dominant eigenvalue of R0 x C_normalised is R0 +max(eigen(basic_reproduction * normalised_matrix)$values) +``` + +::::::::::::::::::::::::::::::::::::: callout + +### Normalisation à l'aide de `socialmixr` + +La normalisation peut être effectuée par la fonction `contact_matrix()` dans `{socialmixr}`. Pour obtenir la matrice normalisée, nous devons spécifier que nous voulons séparer les différentes composantes de la matrice de contact à l'aide de l'argument `split = TRUE`. Nous pouvons alors obtenir la matrice normalisée de la manière suivante : + +```{r, message=FALSE} +contact_data_split <- contact_matrix( + survey = polymod, + countries = "United Kingdom", + age.limits = c(0, 20, 40), + symmetric = TRUE, + split = TRUE +) + +# extract components of the contact matrix +contacts_d <- contact_data_split$contacts +matrix_a <- contact_data_split$matrix +demography_n <- contact_data_split$demography$proportion + +# calculate normalised matrix +normalised_matrix_split <- contacts_d * matrix_a * demography_n +``` + +Pour plus de détails sur les différentes composantes de la matrice de contact, voir [la vignette du paquet sur la division des matrices de contact.](https://cran.r-project.org/web/packages/socialmixr/vignettes/socialmixr.html#splitting-contact-matrices) + +:::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::: callout + +### Vérifiez la dimension de $\beta$ + +Dans le modèle SIR sans structure d'âge, le taux de contact fait partie du taux de transmission. $\beta$ alors que dans le modèle avec structure d'âge, nous avons séparé le taux de contact, et donc le taux de transmission. $\beta$ dans le modèle structuré par âge aura une valeur différente. + +:::::::::::::::::::::::::::::::::::::::::::::::: + +Nous pouvons utiliser les matrices de contact de `socialmixr` avec des modèles mathématiques dans le paquetage R `{epidemics}`. Voir le tutoriel [Simuler la transmission](../episodes/simulating-transmission.md) pour des exemples et une introduction à `epidemics`. + +### Groupes de contact + +Dans l'exemple ci-dessus, la dimension de la matrice de contact sera la même que le nombre de groupes d'âge, c'est-à-dire que s'il y a 3 groupes d'âge, la matrice de contact aura 3 lignes et 3 colonnes. Les matrices de contact peuvent être utilisées pour d'autres groupes, à condition que la dimension de la matrice corresponde au nombre de groupes. + +Par exemple, nous pourrions avoir un méta-modèle de population avec deux zones géographiques. Notre matrice de contact serait alors une matrice 2 x 2 dont les entrées représenteraient les contacts entre les zones géographiques et à l'intérieur de celles-ci. + +## Résumé + +Dans ce tutoriel, nous avons appris la définition de la matrice de contact, comment elle est estimée et comment accéder aux données de contact social à partir de `socialmixr`. Dans le prochain tutoriel, nous apprendrons à utiliser le paquetage R `{epidemics}` pour générer des trajectoires de maladies à partir de modèles mathématiques avec des matrices de contact provenant de `socialmixr`. + +::::::::::::::::::::::::::::::::::::: keypoints + +- Les matrices de contact quantifient les schémas de mélange entre différents groupes de population. +- `socialmixr` fournit des outils pour estimer les matrices de contact à partir de données d'enquête +- Les matrices de contact peuvent être utilisées dans diverses analyses épidémiologiques, qu'il s'agisse du calcul de l'indice de masse corporelle ou de l'indice de masse corporelle. $R_0$ à la modélisation des interventions +- Une normalisation adéquate est cruciale lors de l'utilisation des matrices de contact dans les modèles de transmission. + +:::::::::::::::::::::::::::::::::::::::::::::::: + + diff --git a/locale/fr/episodes/disease-burden.Rmd b/locale/fr/episodes/disease-burden.Rmd new file mode 100644 index 0000000..e1f4793 --- /dev/null +++ b/locale/fr/episodes/disease-burden.Rmd @@ -0,0 +1,348 @@ +--- +title: Modélisation de la charge de morbidité +teaching: 40 +exercises: 10 +--- + +:::::::::::::::::::::::::::::::::::::: questions + +- Comment modéliser la charge de morbidité et la demande de soins de santé ? + +:::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::: objectives + +- Comprendre quand les modèles mathématiques de transmission peuvent être séparés des modèles de charge de morbidité +- Produire des estimations de la charge de morbidité et de la demande de soins de santé à l'aide d'un modèle de charge de morbidité + +:::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::: prereq + +- Tutoriel complet sur [Simuler la transmission](../episodes/simulating-transmission.md) + +::::::::::::::::::::::::::::::::: + +## Introduction + +Dans les tutoriels précédents, nous avons utilisé des modèles mathématiques pour générer des trajectoires d'infections, mais nous pouvons également être intéressés par des mesures de la charge de morbidité. Ces mesures peuvent inclure + +- les résultats sanitaires dans la population (par exemple, les infections légères par rapport aux infections graves) +- Impacts sur le système de santé (par exemple, hospitalisations, admissions en soins intensifs) +- Impacts économiques (perte de productivité, coûts des soins de santé) + +Dans les modèles mathématiques, nous pouvons suivre la charge de morbidité de différentes manières : + +1. **Approche intégrée** Approche intégrée : Inclure les compartiments de la charge directement dans le modèle de transmission (par exemple, les compartiments hospitaliers dans les modèles ODE). +2. **Approche séparée** Approche séparée : Simuler d'abord la transmission, puis utiliser les résultats pour estimer la charge. + +Le choix entre ces approches dépend de l'influence de la charge sur la transmission. Par exemple, le choix entre ces deux approches dépend de l'influence de la charge sur la transmission : + +- Dans le cas d'Ebola, les hospitalisations sont importantes pour la transmission en raison des établissements de santé à haut risque. +- Pour de nombreuses infections respiratoires, la maladie grave survient généralement après la période infectieuse, de sorte que la charge peut être modélisée séparément. + +Dans ce tutoriel, nous nous concentrerons sur l'approche séparée, dans laquelle nous exécutons d'abord un modèle épidémique pour simuler les infections, puis nous utilisons ces valeurs pour estimer la charge de morbidité dans le cadre d'une analyse complémentaire. Nous utiliserons `{epidemics}` pour simuler les trajectoires des maladies, `{socialmixr}` pour les données sur les contacts sociaux, et `{tidyverse}` pour la manipulation et la représentation graphique des données. + +```{r, warning=FALSE, message=FALSE} +library(epiparameter) +library(epidemics) +library(socialmixr) +library(tidyverse) +``` + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: instructor + +Les notes de l'instructeur en ligne peuvent aider à informer les instructeurs des difficultés de synchronisation. +associés aux leçons. Elles apparaissent dans la "Vue instructeur". + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +## Un modèle de charge + +Nous allons étendre l'exemple de la grippe de la [Simulation de la transmission](../episodes/simulating-transmission.md) pour calculer les hospitalisations au fil du temps. Notre approche se compose de deux éléments principaux : + +1. **Le modèle de transmission** Modèle de transmission : Un modèle SEIR qui génère de nouvelles infections au fil du temps. +2. **Modèle de charge** Convertit les nouvelles infections en hospitalisations en tenant compte des délais entre l'infection et l'hospitalisation. + +Pour convertir les infections en hospitalisations, nous devons prendre en compte les éléments suivants : + +- la probabilité qu'une infection conduise à une hospitalisation (ratio infection-hospitalisation, RHI) +- Le délai entre l'infection et l'admission à l'hôpital +- Le temps passé à l'hôpital avant la sortie + +Nous utiliserons `{epiparameter}` pour définir ces distributions de délais. La distribution Gamma est couramment utilisée pour ces délais car : + +- elle est flexible et peut modéliser différentes formes +- Il est limité à zéro (les retards négatifs n'ont pas de sens) +- Elle est étayée par des données empiriques pour de nombreuses maladies infectieuses. + +```{r, echo=FALSE, message=FALSE} +# load contact and population data from socialmixr::polymod +polymod <- socialmixr::polymod +contact_data <- socialmixr::contact_matrix( + polymod, + countries = "United Kingdom", + age.limits = c(0, 20, 40), + symmetric = TRUE +) + +# prepare contact matrix +contact_matrix <- t(contact_data$matrix) + +# prepare the demography vector +demography_vector <- contact_data$demography$population +names(demography_vector) <- rownames(contact_matrix) + +# initial conditions: one in every 1 million is infected +initial_i <- 1e-6 +initial_conditions_inf <- c( + S = 1 - initial_i, E = 0, I = initial_i, R = 0, V = 0 +) + +initial_conditions_free <- c( + S = 1, E = 0, I = 0, R = 0, V = 0 +) + +# build for all age groups +initial_conditions <- rbind( + initial_conditions_inf, + initial_conditions_free, + initial_conditions_free +) +rownames(initial_conditions) <- rownames(contact_matrix) + +# prepare the population to model as affected by the epidemic +uk_population <- epidemics::population( + name = "UK", + contact_matrix = contact_matrix, + demography_vector = demography_vector, + initial_conditions = initial_conditions +) + +# time periods +preinfectious_period <- 3.0 +infectious_period <- 7.0 +basic_reproduction <- 1.46 + +# rates +infectiousness_rate <- 1.0 / preinfectious_period +recovery_rate <- 1.0 / infectious_period +transmission_rate <- basic_reproduction / infectious_period + +# run an epidemic model using `epidemic()` +output_plot <- epidemics::model_default( + population = uk_population, + transmission_rate = transmission_rate, + infectiousness_rate = infectiousness_rate, + recovery_rate = recovery_rate, + time_end = 600, increment = 1.0 +) + +``` + +```{r} +new_cases <- new_infections(output_plot, by_group = FALSE) +head(new_cases) +``` + +Pour convertir les nouvelles infections en hospitalisations, nous avons besoin de distributions de paramètres pour décrire les processus suivants : + +- le temps écoulé entre l'infection et l'admission à l'hôpital, + +- le délai entre l'admission et la sortie de l'hôpital. + +Nous utiliserons la fonction `epiparameter()` de `{epiparameter}` pour définir et stocker les distributions de paramètres pour ces processus. + +```{r, message=FALSE} +# define delay parameters +infection_to_admission <- epiparameter( + disease = "COVID-19", + epi_name = "infection to admission", + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 5, scale = 4), + discretise = TRUE + ) +) + +# The shape and scale parameters were chosen based on data from COVID-19 studies +# showing a median time from infection to hospitalization of around 10 days +# with right-skewed distribution reflecting variability in disease progression +``` + +Pour visualiser cette distribution, nous pouvons créer un graphique de densité : + +```{r} +x_range <- seq(0, 60, by = 0.1) +density_df <- data.frame(days = x_range, + density_admission = density(infection_to_admission, + x_range)) + +ggplot(data = density_df, aes(x = days, y = density_admission)) + + geom_line(linewidth = 1.2) + + theme_bw() + + labs( + x = "infection to admission (days)", + y = "pdf" + ) + +``` + +::::::::::::::::::::::::::::::::::::: challenge + +## Définir la distribution de l'admission à la sortie + +En utilisant la fonction `epiparameter()` définissez la distribution pour l'admission à la sortie comme une distribution Gamma avec forme = 10 et échelle = 2 et tracez la densité de cette distribution. + +:::::::::::::::::::::::: solution + +```{r, message=FALSE} +admission_to_discharge <- epiparameter( + disease = "COVID-19", + epi_name = "admission to discharge", + prob_distribution = create_prob_distribution( + prob_distribution = "gamma", + prob_distribution_params = c(shape = 10, scale = 2), + discretise = TRUE + ) +) + +x_range <- seq(0, 60, by = 0.1) +density_df <- data.frame(days = x_range, + density_discharge = density(admission_to_discharge, + x_range)) + + +ggplot(data = density_df, aes(x = days, y = density_discharge)) + + geom_line(linewidth = 1.2) + + theme_bw() + + labs( + x = "admission to discharge (days)", + y = "pdf" + ) + +``` + +::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::: + +Pour convertir les nouvelles infections en nombre d'hospitalisations au fil du temps, nous procéderons comme suit : + +1. Calculez le nombre attendu de nouvelles infections qui seront hospitalisées en utilisant le ratio d'hospitalisation pour cause d'infection (RSI). +2. Calculez le nombre estimé de nouvelles hospitalisations à chaque moment en utilisant la distribution des infections par rapport aux admissions. +3. Calculez le nombre estimé de sorties à chaque moment en utilisant la distribution entre les admissions et les sorties. +4. Calculez le nombre de personnes hospitalisées à chaque moment en faisant la différence entre la somme cumulée des admissions à l'hôpital et la somme cumulée des sorties jusqu'à présent. + +#### 1\. Calculez le nombre attendu de nouvelles hospitalisations à l'aide du ratio d'hospitalisation pour cause d'infection (RSI). + +```{r} +ihr <- 0.1 # infection-hospitalisation ratio +# This value is based on estimates from early COVID-19 data +# and represents the proportion of infections that require hospitalization + +# calculate expected numbers with convolution: +hosp <- new_cases$new_infections * ihr +``` + +#### 2\. Calculer le nombre estimé de nouvelles hospitalisations à l'aide de la distribution entre l'infection et l'admission. + +Pour estimer le nombre de nouvelles hospitalisations, nous utilisons une méthode appelée convolution. + +::::::::::::::::::::::::::::::::::::: callout + +### Qu'est-ce que la convolution ? + +Si nous voulons savoir comment les personnes sont admises à l'hôpital le jour de l'hospitalisation, nous devons savoir comment les personnes sont admises à l'hôpital le jour de l'hospitalisation. $t$ nous devons additionner le nombre de personnes admises le jour $t$ mais infectées le jour $t-1$ jour $t-2$ jour $t-3$ etc. Nous devons donc faire la somme de la distribution des délais entre l'infection et l'admission. Si $f_j$ est la probabilité qu'une personne infectée qui sera hospitalisée soit admise à l'hôpital $j$ jours plus tard, et $I_{t-j}$ est le nombre de personnes infectées le jour $t-j$ alors le nombre total d'admissions le jour $t$ est égal à $\sum_j I_{t-j} f_j$. Ce type de calcul de roulement est connu sous le nom de convolution (voir cette [article de Wolfram](https://mathworld.wolfram.com/Convolution.html) pour plus de détails mathématiques). Il existe différentes méthodes pour calculer les convolutions, mais nous utiliserons la fonction intégrée de R `convolve()`pour effectuer efficacement la sommation à partir du nombre d'infections et de la distribution des délais. + +:::::::::::::::::::::::::::::::::::::::::::::::: + +La fonction `convolve()` nécessite en entrée deux vecteurs qui seront convolués et `type`. Nous spécifierons ici `type = "open"`, ce qui remplit les vecteurs avec des 0 pour s'assurer qu'ils sont de la même longueur. + +Les entrées à combiner sont le nombre attendu d'infections qui aboutiront à une hospitalisation (`hosp`) et les valeurs de densité de la distribution des délais entre l'infection et l'admission. Nous calculerons la densité pour la valeur minimale possible (0 jour) jusqu'à la queue de la distribution (définie ici comme le 99,9e quantile, c'est-à-dire qu'il est très peu probable qu'un cas soit hospitalisé après un délai aussi long). + +La convolution nécessite l'inversion de l'une des entrées. Dans notre cas, nous inverserons la distribution de la densité des temps d'infection et d'admission. En effet, si des personnes infectées plus tôt sont admises aujourd'hui, cela signifie qu'elles ont eu un délai plus long entre l'infection et l'admission qu'une personne infectée plus récemment. En fait, le délai entre l'infection et l'admission nous indique jusqu'où nous devons "remonter" le temps pour trouver les nouvelles infections qui se manifestent aujourd'hui par des admissions à l'hôpital. + +```{r} +# define tail of the delay distribution +tail_value_admission <- quantile(infection_to_admission, 0.999) + +hospitalisations <- convolve(hosp, + rev(density(infection_to_admission, + 0:tail_value_admission)), + type = "open")[seq_along(hosp)] +``` + +#### 3\. Calculez le nombre estimé de sorties + +En utilisant la même approche que ci-dessus, nous convolons les hospitalisations avec la distribution des temps d'admission à la sortie pour obtenir le nombre estimé de nouvelles sorties. + +```{r} +tail_value_discharge <- quantile(admission_to_discharge, 0.999) +discharges <- convolve(hospitalisations, rev(density(admission_to_discharge, + 0:tail_value_discharge)), + type = "open")[seq_along(hospitalisations)] +``` + +#### 4\. Calculez le nombre d'hospitalisations comme la différence entre la somme cumulée des hospitalisations et la somme cumulée des sorties. + +Nous pouvons utiliser la fonction R `cumsum()` pour calculer le nombre cumulé d'hospitalisations et de sorties. La différence entre ces deux quantités nous donne le nombre actuel de personnes hospitalisées à chaque point dans le temps. + +```{r} +# calculate the current number in hospital +in_hospital <- cumsum(hospitalisations) - cumsum(discharges) +``` + +Nous créons un cadre de données pour représenter nos résultats à l'aide de `pivot_longer()`: + +```{r} +# create data frame +hosp_df <- cbind(new_cases, in_hospital = in_hospital, + hospitalisations = hospitalisations) +# pivot longer for plotting +hosp_df_long <- pivot_longer(hosp_df, cols = new_infections:hospitalisations, + names_to = "outcome", values_to = "value") + + +ggplot(data = hosp_df_long) + + geom_line( + aes( + x = time, + y = value, + colour = outcome + ), + linewidth = 1.2 + ) + + theme_bw() + + labs( + x = "Time (days)", + y = "Individuals" + ) +``` + +## Résumé + +Dans ce tutoriel, nous avons appris à estimer les hospitalisations sur la base des nouvelles infections quotidiennes à partir d'un modèle de transmission. Cette approche peut être étendue à d'autres mesures de la charge de morbidité, telles que : + +- les admissions en USI +- Décès +- Années de vie corrigées de l'incapacité (AVCI) +- Coût des soins de santé + +Ces estimations de la charge de morbidité sont précieuses pour : + +- la planification des systèmes de santé +- Analyses économiques de la santé +- Prise de décision politique + +Dans la foulée, vous pourriez être intéressé par [ce guide pratique](https://epiverse-trace.github.io/howto/analyses/reconstruct_transmission/estimate_infections.html) qui montre comment estimer les événements d'infection initiale à partir des hospitalisations ou des décès déclarés au fil du temps. + +::::::::::::::::::::::::::::::::::::: keypoints + +- Les modèles de transmission devraient inclure la charge de morbidité lorsqu'elle affecte la transmission ultérieure. +- Les résultats des modèles de transmission peuvent être utilisés pour les modèles de charge de morbidité. +- La distribution Gamma est couramment utilisée pour modéliser les retards dans la progression de la maladie. +- La convolution est un outil puissant pour estimer la charge de morbidité à partir des résultats des modèles de transmission. + +:::::::::::::::::::::::::::::::::::::::::::::::: + + diff --git a/locale/fr/episodes/model-choices.Rmd b/locale/fr/episodes/model-choices.Rmd new file mode 100644 index 0000000..4730818 --- /dev/null +++ b/locale/fr/episodes/model-choices.Rmd @@ -0,0 +1,407 @@ +--- +title: Choisir un modèle approprié +teaching: 10 +exercises: 20 +--- + +```{r setup, echo=FALSE, message=FALSE, warning=FALSE} +library(epidemics) +library(dplyr) +library(ggplot2) + +# hidden seed for stable stochastic output in lesson +set.seed(33) +``` + +:::::::::::::::::::::::::::::::::::::: questions + +- Comment choisir un modèle mathématique approprié pour mener à bien ma tâche d'analyse ? + +:::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::: objectives + +- Comprendre les exigences du modèle pour une question de recherche spécifique + +:::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::: prereq + +- Compléter le tutoriel [Simuler la transmission](../episodes/simulating-transmission.md) + ::::::::::::::::::::::::::::::::: + +## Introduction + +Il existe des modèles mathématiques pour différentes infections, interventions et schémas de transmission qui peuvent être utilisés pour répondre à de nouvelles questions. Dans ce tutoriel, nous apprendrons à choisir un modèle existant pour accomplir une tâche donnée. + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: instructor + +L'objectif de ce tutoriel est de comprendre les modèles existants afin de décider s'ils sont appropriés pour une question donnée. + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::: discussion + +### Choisir un modèle + +Lorsqu'il s'agit de choisir le modèle mathématique à utiliser, un certain nombre de questions se posent : + +::::::::::::::::::::::::::::::::::::::::::::::::::: + +:::::::::::::::: solution + +### Quelle est l'infection ou la maladie en question ? + +Il se peut qu'un modèle existe déjà pour la maladie que vous étudiez, ou qu'il existe un modèle pour une infection dont les voies de transmission et les caractéristiques épidémiologiques sont similaires et qui peut être adapté. Par exemple, les maladies ayant des voies de transmission similaires (par exemple, transmission par voie aérienne, par gouttelettes ou par contact) et une histoire naturelle similaire (par exemple, période d'incubation, période infectieuse) peuvent utiliser des structures de modèle similaires. + +::::::::::::::::::::::::: + +:::::::::::::::: solution + +### Avons-nous besoin d'un [déterministe](../learners/reference.md#deterministic) ou [stochastique](../learners/reference.md#stochastic) stochastique ? + +Les structures des modèles diffèrent en fonction de l'ampleur et de la nature de l'épidémie. Lorsque le nombre d'infections simulées est faible, la variation stochastique (c'est-à-dire le caractère aléatoire que nous pouvons définir mathématiquement) des résultats peut avoir une incidence significative sur le déclenchement ou non d'une épidémie. Les épidémies, qui sont généralement des événements localisés, peuvent être mieux modélisées à l'aide d'approches stochastiques afin de saisir l'incertitude de la dynamique de transmission précoce. Les épidémies, qui sont des événements à plus grande échelle, peuvent souvent être modélisées efficacement à l'aide d'approches déterministes, car la variation stochastique devient moins importante par rapport à la dynamique globale. Il est important de noter que les termes "flambée" et "épidémie" peuvent parfois être utilisés de manière interchangeable en fonction du contexte, les flambées étant parfois considérées comme des épidémies localisées. + +::::::::::::::::::::::::: + +:::::::::::::::: solution + +## Quel est le résultat qui vous intéresse ? + +Le résultat d'intérêt est généralement une quantité mesurable dérivée du modèle mathématique. Il peut s'agir de + +- le nombre d'infections au fil du temps +- Le nombre maximal d'hospitalisations +- Le nombre total de cas de maladies graves +- L'ampleur finale de l'épidémie +- Le moment des pics épidémiques + +::::::::::::::::::::::::: + +:::::::::::::::: solution + +## Comment la transmission est-elle modélisée ? + +Par exemple, [directes](../learners/reference.md#direct) ou [indirecte](../learners/reference.md#indirect), [aérien](../learners/reference.md#airborne) ou [à transmission vectorielle](../learners/reference.md#vectorborne). +::::::::::::::::::::::::: + +:::::::::::::::: solution + +## Comment les différents processus (par exemple la transmission) sont-ils formulés dans les équations ? + +Pour une même infection ou un même type d'épidémie, il peut y avoir des différences subtiles dans les structures des modèles, qui peuvent passer inaperçues si l'on n'étudie pas les équations. Par exemple, les paramètres de transmissibilité peuvent être spécifiés sous forme de taux ou de probabilités. Si vous souhaitez utiliser les valeurs des paramètres d'autres modèles publiés, vous devez vérifier que la transmission est formulée de la même manière. +::::::::::::::::::::::::: + +:::::::::::::::: solution + +## Des interventions seront-elles modélisées ? + +Enfin, les interventions telles que la vaccination, la distanciation sociale ou les programmes de traitement peuvent présenter un intérêt. Les capacités d'intégration des interventions varient d'un modèle à l'autre : + +- Certains modèles peuvent simuler des interventions continues (par exemple, des programmes de vaccination continus). +- D'autres traitent les interventions discrètes (par exemple, les fermetures ponctuelles d'écoles). +- Certains modèles n'intègrent pas du tout de capacités d'intervention + +Nous discutons des interventions en détail dans le tutoriel [Modélisation des interventions](../episodes/modelling-interventions.md). + +::::::::::::::::::::::::: + +## Modèles disponibles en `{epidemics}` + +Le paquet R `{epidemics}` contient des fonctions permettant d'exécuter les modèles existants. +Pour plus de détails sur les modèles disponibles, consultez le package [Guide de référence des "Fonctions de modèle"](https://epiverse-trace.github.io/epidemics/reference/index.html#model-functions). Tous les noms des fonctions des modèles commencent par `model_*()`. Pour savoir comment exécuter les modèles dans R, lisez le document suivant [Vignettes sur les "Guides pour les modèles de la bibliothèque"](https://epiverse-trace.github.io/epidemics/articles/#guides-to-library-models). + +::::::::::::::::::::::::::::::::::::: challenge + +## Quel modèle ? + +On vous a demandé d'étudier la variation du nombre de personnes infectieuses dans les premières phases d'une épidémie d'Ebola. + +Parmi les modèles suivants, lequel serait le plus approprié pour cette tâche ? + +- `model_default()` + +- `model_ebola()` + +::::::::::::::::: hint + +Réfléchissez aux questions suivantes : + +::::::::::::::::::::::::::::::::::::: checklist + +- Quelle est l'infection ou la maladie en question ? +- Avons-nous besoin d'un modèle déterministe ou stochastique ? +- Quel est le résultat qui nous intéresse ? +- Des interventions seront-elles modélisées ? + +:::::::::::::::::::::::::::::::::::::::::::::::: + +:::::::::::::::::::::: + +::::::::::::::::: solution + +- Quelle est l'infection ou la maladie concernée ? **Ebola** +- Faut-il un modèle déterministe ou stochastique ? **Un modèle stochastique nous permettrait d'explorer les variations aux premiers stades de l'épidémie** +- Quel est le résultat qui vous intéresse ? **Nombre d'infections** +- Des interventions seront-elles modélisées ? **Non** + +#### `model_default()` + +Un modèle SEIR déterministe avec une transmission directe spécifique à l'âge. + +```{r diagram, echo=FALSE, message=FALSE} +DiagrammeR::grViz("digraph { + + # graph statement + ################# + graph [layout = dot, + rankdir = LR, + overlap = true, + fontsize = 10] + + # nodes + ####### + node [shape = square, + fixedsize = true + width = 1.3] + + S + E + I + R + + # edges + ####### + S -> E [label = ' infection \n(transmissibility β)'] + E -> I [label = ' onset of infectiousness \n(infectiousness rate α)'] + I -> R [label = ' recovery \n(recovery rate γ)'] + +}") +``` + +Le modèle est capable de simuler une épidémie de type Ebola, mais comme il est déterministe, nous ne sommes pas en mesure d'explorer les variations stochastiques dans les premières phases de l'épidémie. + +#### `model_ebola()` + +Un modèle stochastique SEIHFR (Susceptible, Exposed, Infectious, Hospitalised, Funeral, Removed) développé spécifiquement pour la maladie à virus Ebola. Le modèle comprend des compartiments uniques pour les états Hospitalisé et Funéraire, qui sont essentiels pour comprendre la dynamique de transmission du virus Ebola en raison du risque élevé de transmission dans les établissements de soins de santé et pendant les pratiques funéraires traditionnelles. Le modèle présente une stochasticité dans les temps de passage entre les états, qui sont modélisés comme des distributions d'Erlang. + +Les paramètres clés affectant la transition entre les états sont les suivants : + +- $R_0$ le nombre de reproduction de base, +- $\rho^I$ la période infectieuse moyenne, +- $\rho^E$ la période préinfectieuse moyenne, +- $p_{hosp}$ la probabilité d'être transféré dans le compartiment hospitalisé. + +\*\*Note : la relation fonctionnelle entre la période préinfectieuse ($\rho^E$) et le taux de transition entre exposé et infectieux ($\gamma^E$) est la suivante $\rho^E = k^E/\gamma^E$ où $k^E$ est la forme de la distribution d'Erlang. De même, pour la période infectieuse $\rho^I = k^I/\gamma^I$. Pour plus de détails sur la formulation du modèle stochastique, reportez-vous à la section sur les [Modèle à temps discret de la maladie à virus Ebola](https://epiverse-trace.github.io/epidemics/articles/model_ebola.html#details-discrete-time-ebola-virus-disease-model) dans la vignette "Modélisation des réponses à une épidémie stochastique de virus Ebola". \*\* + +```{r, echo=FALSE, message=FALSE} +DiagrammeR::grViz("digraph { + + # graph statement + ################# + graph [layout = dot, + rankdir = LR, + overlap = true, + fontsize = 10] + + # nodes + ####### + node [shape = square, + fixedsize = true + width = 1.3] + + S + E + I + H + F + R + + # edges + ####### + S -> E [label = ' infection (β)'] + E -> I [label = ' onset of \ninfectiousness (γ E)'] + I -> F [label = ' death (funeral) \n(γ I)'] + F -> R [label = ' safe burial (one timestep) '] + I -> H [label = ' hospitalisation (p hosp)'] + H -> R [label = ' recovery or safe burial \n (γ I)'] + + subgraph { + rank = same; I; F; + } + subgraph { + rank = same; H; R; + } +}") +``` + +Le modèle comporte des paramètres supplémentaires décrivant le risque de transmission dans les hôpitaux et les établissements funéraires : + +- $p_{ETU}$ la proportion de cas hospitalisés contribuant à l'infection de personnes sensibles (ETU = unités de traitement du virus Ebola), +- $p_{funeral}$ la proportion de funérailles au cours desquelles le risque de transmission est le même que pour les personnes infectieuses dans la communauté. + +Ce modèle étant stochastique, il constitue le choix le plus approprié pour étudier la variation du nombre de personnes infectées au cours des premières phases d'une épidémie d'Ebola. + +::::::::::::::::::::::::::: + +:::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::: callout + +### Dois-je utiliser un modèle mathématique ? + +Les modèles mathématiques peuvent être utilisés pour générer des trajectoires de maladie, qui peuvent ensuite être utilisées pour calculer la taille finale de l'épidémie. Si seule la taille finale vous intéresse, il est possible d'utiliser la théorie mathématique pour calculer directement cette quantité, sans avoir à simuler le modèle complet et à déterminer le nombre d'individus infectés. Ces calculs mathématiques sont effectués à l'aide de fonctions R dans le paquetage `{finalsize}`. + +L'avantage d'utiliser `finalsize` est que moins de paramètres sont nécessaires. Il vous suffit de définir la transmissibilité et la sensibilité de la population, ainsi qu'une matrice de contacts sociaux le cas échéant, plutôt que des paramètres tels que la période infectieuse, qui sont nécessaires dans le cadre de l {epidemics} pour simuler la dynamique dans le temps. Consultez la page [vignettes du paquet](https://epiverse-trace.github.io/finalsize/articles/finalsize.html) pour plus d'informations sur l'utilisation de `finalsize` pour calculer la taille de l'épidémie. + +:::::::::::::::::::::::::::::::::::::::::::::::: + +## Défi : Analyse de l'épidémie d'Ebola + +::::::::::::::::::::::::::::::::::::: challenge + +## Exécution du modèle + +Vous avez été chargé de générer les trajectoires initiales d'une épidémie d'Ebola en Guinée. En utilisant `model_ebola()` et les informations détaillées ci-dessous, effectuez les tâches suivantes : + +1. Exécutez le modèle une fois et représentez graphiquement le nombre d'individus infectieux au fil du temps. +2. Exécutez le modèle 100 fois et représentez la moyenne, les quantiles supérieurs et inférieurs à 95 % du nombre d'individus infectieux en fonction du temps. + +- Taille de la population : 14 millions +- Nombre initial d'individus exposés : 10 +- Nombre initial de personnes infectieuses : 5 +- Durée de la simulation : 120 jours +- Valeurs des paramètres : + - $R_0$ (`r0`) = 1.1, + - $p^I$ (`infectious_period`) = 12, + - $p^E$ (`preinfectious_period`) = 5, + - $k^E=k^I = 2$, + - $1-p_{hosp}$ (`prop_community`) = 0.9, + - $p_{ETU}$ (`etu_risk`) = 0.7, + - $p_{funeral}$ (`funeral_risk`) = 0.5 + +::::::::::::::::: hint + +### Code pour les conditions initiales + +```{r} +# set population size +population_size <- 14e6 + +E0 <- 10 +I0 <- 5 +# prepare initial conditions as proportions +initial_conditions <- c( + S = population_size - (E0 + I0), E = E0, I = I0, H = 0, F = 0, R = 0 +) / population_size + +guinea_population <- population( + name = "Guinea", + contact_matrix = matrix(1), # note dummy value + demography_vector = population_size, # 14 million, no age groups + initial_conditions = matrix( + initial_conditions, + nrow = 1 + ) +) +``` + +:::::::::::::::::::::: + +::::::::::::::::: hint + +### Indice : simulations de modèles multiples + +Adaptez le code de la [la prise en compte de l'incertitude](../episodes/simulating-transmission.md#accounting-for-uncertainty) de l'incertitude + +:::::::::::::::::::::: + +::::::::::::::::: solution + +1. Exécutez le modèle une fois et représentez le nombre d'individus infectieux en fonction du temps. + +```{r} +output <- model_ebola( + population = guinea_population, + transmission_rate = 1.1 / 12, + infectiousness_rate = 2.0 / 5, + removal_rate = 2.0 / 12, + prop_community = 0.9, + etu_risk = 0.7, + funeral_risk = 0.5, + time_end = 100, + replicates = 1 # replicates argument +) + +output %>% + filter(compartment == "infectious") %>% + ggplot() + + geom_line( + aes(time, value), + linewidth = 1.2 + ) + + scale_y_continuous( + labels = scales::comma + ) + + labs( + x = "Simulation time (days)", + y = "Individuals" + ) + + theme_bw( + base_size = 15 + ) +``` + +2. Exécutez le modèle 100 fois et représentez la moyenne, les quantiles supérieurs et inférieurs à 95 % du nombre d'individus infectieux en fonction du temps. + +Nous exécutons le modèle 100 fois avec l'option *même* valeurs des paramètres. + +```{r} +output_replicates <- model_ebola( + population = guinea_population, + transmission_rate = 1.1 / 12, + infectiousness_rate = 2.0 / 5, + removal_rate = 2.0 / 12, + prop_community = 0.9, + etu_risk = 0.7, + funeral_risk = 0.5, + time_end = 100, + replicates = 100 # replicates argument +) + +output_replicates %>% + filter(compartment == "infectious") %>% + ggplot( + aes(time, value) + ) + + stat_summary(geom = "line", fun = mean) + + stat_summary( + geom = "ribbon", + fun.min = function(z) { + quantile(z, 0.025) + }, + fun.max = function(z) { + quantile(z, 0.975) + }, + alpha = 0.3 + ) + + labs( + x = "Simulation time (days)", + y = "Individuals" + ) + + theme_bw( + base_size = 15 + ) +``` + +::::::::::::::::::::::::::: + +:::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::: keypoints + +- Les modèles mathématiques existants doivent être sélectionnés en fonction de la question de recherche. +- Il est important de vérifier qu'un modèle repose sur des hypothèses appropriées concernant la transmission, le potentiel épidémique, les résultats et les interventions. + :::::::::::::::::::::::::::::::::::::::::::::::: + + diff --git a/locale/fr/episodes/modelling-interventions.Rmd b/locale/fr/episodes/modelling-interventions.Rmd new file mode 100644 index 0000000..5e66dd2 --- /dev/null +++ b/locale/fr/episodes/modelling-interventions.Rmd @@ -0,0 +1,453 @@ +--- +title: Modélisation des interventions +teaching: 45 +exercises: 30 +--- + +```{r setup, echo=FALSE, message=FALSE, warning=FALSE} +library(ggplot2) +library(epidemics) +``` + +:::::::::::::::::::::::::::::::::::::: questions + +- Comment étudier l'effet des interventions sur les trajectoires des maladies ? + +:::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::: objectives + +- Ajoutez les interventions pharmaceutiques et non pharmaceutiques à la liste des interventions de l'UE. `{epidemics}` modèle + +:::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::: prereq + +- Compléter le tutoriel sur [La simulation de la transmission](../episodes/simulating-transmission.md). + +Les apprenants doivent également se familiariser avec les dépendances des concepts suivants avant de travailler sur ce tutoriel : + +**Réponse à l'épidémie** : [Types d'intervention](https://www.cdc.gov/nonpharmaceutical-interventions/). +::::::::::::::::::::::::::::::::: + +## Introduction + +Les modèles mathématiques peuvent être utilisés pour générer des trajectoires de propagation de maladies dans le cadre de la mise en œuvre d'interventions à différents stades d'une épidémie. Ces trajectoires peuvent être utilisées pour prendre des décisions sur les interventions à mettre en œuvre pour ralentir la propagation des maladies. + +Les interventions sont généralement incorporées dans les modèles mathématiques en manipulant les valeurs des paramètres pertinents, par exemple la réduction de la transmission, ou en introduisant un nouvel état de la maladie, par exemple la classe vaccinée, où nous supposons que les individus qui appartiennent à cette classe ne sont plus susceptibles d'être infectés. + +Dans ce tutoriel, nous apprendrons à utiliser les outils suivants `{epidemics}` pour modéliser les interventions et l'accès aux données de contact social avec `{socialmixr}`. Nous utiliserons `{dplyr}`, `{ggplot2}` et le tuyau `%>%` pour relier certaines de leurs fonctions, alors appelons aussi `{tidyverse}`: + +```{r, message=FALSE, warning=FALSE} +library(epidemics) +library(socialmixr) +library(tidyverse) +``` + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: instructor + +Dans ce tutoriel, différents types d'intervention et la manière dont ils peuvent être modélisés sont présentés. Les apprenants devraient être en mesure de comprendre le mécanisme sous-jacent de ces interventions (par exemple, réduire le taux de contact) ainsi que la manière d'implémenter le code pour inclure de telles interventions. + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +## Interventions non pharmaceutiques + +[Interventions non pharmaceutiques](../learners/reference.md#NPIs) Les interventions non pharmaceutiques (INP) sont des mesures mises en place pour réduire la transmission qui n'incluent pas l'administration de médicaments ou de vaccins. Les IPN visent à réduire les contacts entre les personnes infectieuses et les personnes sensibles en fermant les écoles et les lieux de travail et en prenant d'autres mesures pour empêcher la propagation de la maladie, par exemple en se lavant les mains et en portant des masques. + +Nous étudierons l'effet des interventions sur une épidémie de COVID-19 à l'aide d'un modèle SEIR (`model_default()` dans le paquetage R `{epidemics}`). Le modèle SEIR divise la population en quatre compartiments : Susceptible (S), Exposé (E), Infectieux (I) et Rétabli (R). Nous définirons les paramètres suivants pour notre modèle : $R_0 = 2.7$ (nombre de reproduction de base), période de latence ou période pré-infectieuse $= 4$ jours, et la période infectieuse $= 5.5$ jours (paramètres adaptés de [Davies et al. (2020)](https://doi.org/10.1016/S2468-2667\(20\)30133-X)). Nous adoptons une matrice de contact avec des tranches d'âge 0-18, 18-65, 65 ans et plus en utilisant `{socialmixr}` et supposons qu'un individu sur un million dans chaque groupe d'âge est contagieux au début de l'épidémie. + +```{r model_setup, echo=TRUE, message=FALSE} +polymod <- socialmixr::polymod +contact_data <- socialmixr::contact_matrix( + polymod, + countries = "United Kingdom", + age.limits = c(0, 15, 65), + symmetric = TRUE +) + +# prepare contact matrix +contact_matrix <- t(contact_data$matrix) + +# prepare the demography vector +demography_vector <- contact_data$demography$population +names(demography_vector) <- rownames(contact_matrix) + +# initial conditions: one in every 1 million is infected +initial_i <- 1e-6 +initial_conditions <- c( + S = 1 - initial_i, E = 0, I = initial_i, R = 0, V = 0 +) + +# build for all age groups +initial_conditions <- matrix( + rep(initial_conditions, dim(contact_matrix)[1]), + ncol = 5, byrow = TRUE +) +rownames(initial_conditions) <- rownames(contact_matrix) + +# prepare the population to model as affected by the epidemic +uk_population <- epidemics::population( + name = "UK", + contact_matrix = contact_matrix, + demography_vector = demography_vector, + initial_conditions = initial_conditions +) +``` + +#### Effet des fermetures d'écoles sur la propagation de COVID-19 + +Le premier IPN que nous examinerons est l'effet des fermetures d'écoles sur la réduction du nombre de personnes infectées par COVID-19 au fil du temps. Nous supposons qu'une fermeture d'école réduit la fréquence des contacts au sein des différents groupes d'âge et entre eux. Sur la base d'études empiriques, nous supposons que les fermetures d'écoles réduiront de 50 % les contacts entre enfants d'âge scolaire (0-15 ans) et entraîneront une faible réduction (1 %) des contacts entre adultes (15 ans et plus). + +Pour inclure une intervention dans notre modèle, nous devons créer un `intervention` objet. Les données d'entrée sont le nom de l'intervention (`name`), le type d'intervention (`contacts` ou `rate`), l'heure de début (`time_begin`), l'heure de fin (`time_end`) et la réduction (`reduction`). Les valeurs de la matrice de réduction sont spécifiées dans le même ordre que les groupes d'âge dans la matrice de contact. + +```{r} +rownames(contact_matrix) +``` + +Par conséquent, nous spécifions ` reduction = matrix(c(0.5, 0.01, 0.01))`. Nous supposons que les fermetures d'écoles commencent le 50e jour et se poursuivent pendant 100 jours supplémentaires. Notre objet d'intervention est donc : + +```{r intervention} +close_schools <- intervention( + name = "School closure", + type = "contacts", + time_begin = 50, + time_end = 50 + 100, + reduction = matrix(c(0.5, 0.01, 0.01)) +) +``` + +::::::::::::::::::::::::::::::::::::: callout + +### Effet des interventions sur les contacts + +Dans le cadre de `{epidemics}` la matrice des contacts est réduite par des proportions pour la période pendant laquelle l'intervention est en place. Pour comprendre comment la réduction est calculée dans les fonctions du modèle, considérons une matrice de contacts pour deux groupes d'âge avec un nombre égal de contacts : + +```{r, echo=FALSE} +reduction <- matrix(c(0.5, 0.1)) +contact_matrix_example <- matrix(c(1, 1, 1, 1), nrow = 2) +contact_matrix_example +``` + +Si la réduction est de 50 % dans le groupe 1 et de 10 % dans le groupe 2, la matrice des contacts pendant l'intervention sera la suivante : + +```{r, echo=FALSE} +contact_matrix_example[1, ] <- contact_matrix_example[1, ] * (1 - reduction[1]) +contact_matrix_example[, 1] <- contact_matrix_example[, 1] * (1 - reduction[1]) +contact_matrix_example[2, ] <- contact_matrix_example[2, ] * (1 - reduction[2]) +contact_matrix_example[, 2] <- contact_matrix_example[, 2] * (1 - reduction[2]) +contact_matrix_example +``` + +Les contacts au sein du groupe 1 sont réduits de 50 % deux fois pour tenir compte d'une réduction de 50 % des contacts sortants et entrants ($1\times 0.5 \times 0.5 = 0.25$). De même, les contacts au sein du groupe 2 sont réduits deux fois de 10 %. Les contacts entre le groupe 1 et le groupe 2 sont réduits de 50 %, puis de 10 % ($1 \times 0.5 \times 0.9= 0.45$). + +:::::::::::::::::::::::::::::::::::::::::::::::: + +En utilisant le taux de transmission $= 2.7/5.5$ (rappelez-vous que [taux de transmission = $R_0$/ période infectieuse](../episodes/simulating-transmission.md#the-basic-reproduction-number-r_0)), taux d'infectiosité $1/= 4$ et le taux de guérison $= 1/5.5$ nous exécutons le modèle avec ` intervention = list(contacts = close_schools)` comme suit : + +```{r} +# time periods +preinfectious_period <- 4.0 +infectious_period <- 5.5 +basic_reproduction <- 2.7 + +# rates +infectiousness_rate <- 1.0 / preinfectious_period +recovery_rate <- 1.0 / infectious_period +transmission_rate <- basic_reproduction / infectious_period +``` + +```{r school} +output_school <- model_default( + # population + population = uk_population, + # rate + transmission_rate = transmission_rate, + infectiousness_rate = infectiousness_rate, + recovery_rate = recovery_rate, + # intervention + intervention = list(contacts = close_schools), + # time + time_end = 300, increment = 1.0 +) +``` + +Pour être en mesure de voir l'effet de notre intervention, nous exécutons également une variante de base du modèle, c'est-à-dire sans intervention, nous combinons les deux résultats dans un seul cadre de données et nous traçons ensuite le résultat. Ici, nous représentons le nombre total d'individus infectieux dans tous les groupes d'âge en utilisant les données suivantes `ggplot2::stat_summary()` fonction : + +```{r baseline, echo=TRUE, fig.width=10} +# run baseline simulation with no intervention +output_baseline <- model_default( + population = uk_population, + transmission_rate = transmission_rate, + infectiousness_rate = infectiousness_rate, + recovery_rate = recovery_rate, + time_end = 300, increment = 1.0 +) + +# create intervention_type column for plotting +output_school$intervention_type <- "school closure" +output_baseline$intervention_type <- "baseline" +output <- rbind(output_school, output_baseline) + +library(tidyverse) + +output %>% + filter(compartment == "infectious") %>% + ggplot() + + aes( + x = time, + y = value, + color = intervention_type, + linetype = intervention_type + ) + + stat_summary( + fun = "sum", + geom = "line", + linewidth = 1 + ) + + scale_y_continuous( + labels = scales::comma + ) + + geom_vline( + xintercept = c( + close_schools$time_begin, + close_schools$time_end + ), + linetype = 2 + ) + + theme_bw() + + labs( + x = "Simulation time (days)", + y = "Individuals" + ) +``` + +Nous pouvons constater qu'avec l'intervention en place, l'infection se propage toujours dans la population et que l'accumulation de l'immunité contribue à l'éventuel pic et déclin. Toutefois, le nombre maximal de personnes infectées est inférieur (ligne pointillée verte) à la ligne de base sans intervention (ligne continue rouge), ce qui montre une réduction du nombre absolu de cas. + +#### Effet du port du masque sur la propagation de COVID-19 + +Nous pouvons également modéliser l'effet d'autres IPN en réduisant la valeur des paramètres pertinents. Par exemple, étudier l'effet du port du masque sur le nombre de personnes infectées par COVID-19 au fil du temps. + +Nous nous attendons à ce que le port d'un masque réduise la contagiosité d'un individu, sur la base de nombreuses études montrant l'efficacité des masques dans la réduction de la transmission. Comme nous utilisons un modèle basé sur la population, nous ne pouvons pas modifier les comportements individuels et nous supposons donc que le taux de transmission $\beta$ est réduit par une proportion due au port du masque dans la population. Nous spécifions cette proportion, $\theta$ comme le produit de la proportion de personnes portant un masque multiplié par la proportion de réduction du taux de transmission (adapté de [Li et al. 2020](https://doi.org/10.1371/journal.pone.0237691)). + +Nous créons un objet d'intervention avec `type = rate` et `reduction = 0.161`. En utilisant des paramètres adaptés de [Li et al. 2020](https://doi.org/10.1371/journal.pone.0237691) nous avons la proportion de personnes portant des masques = couverture $\times$ disponibilité = $0.54 \times 0.525 = 0.2835$ et la proportion de réduction du taux de transmission = $0.575$. Par conséquent, $\theta = 0.2835 \times 0.575 = 0.163$. Nous supposons que l'obligation de porter un masque commence au 40e jour et reste en vigueur pendant 200 jours. + +```{r masks} +mask_mandate <- intervention( + name = "mask mandate", + type = "rate", + time_begin = 40, + time_end = 40 + 200, + reduction = 0.163 +) +``` + +Pour mettre en œuvre cette intervention sur le taux de transmission $\beta$ nous spécifions `intervention = list(transmission_rate = mask_mandate)`. + +```{r output_masks} +output_masks <- model_default( + # population + population = uk_population, + # rate + transmission_rate = transmission_rate, + infectiousness_rate = infectiousness_rate, + recovery_rate = recovery_rate, + # intervention + intervention = list(transmission_rate = mask_mandate), + # time + time_end = 300, increment = 1.0 +) +``` + +```{r plot_masks, echo=TRUE, message=FALSE, fig.width=10} +# create intervention_type column for plotting +output_masks$intervention_type <- "mask mandate" +output_baseline$intervention_type <- "baseline" +output <- rbind(output_masks, output_baseline) + +output %>% + filter(compartment == "infectious") %>% + ggplot() + + aes( + x = time, + y = value, + color = intervention_type, + linetype = intervention_type + ) + + stat_summary( + fun = "sum", + geom = "line", + linewidth = 1 + ) + + scale_y_continuous( + labels = scales::comma + ) + + geom_vline( + xintercept = c( + mask_mandate$time_begin, + mask_mandate$time_end + ), + linetype = 2 + ) + + theme_bw() + + labs( + x = "Simulation time (days)", + y = "Individuals" + ) +``` + +::::::::::::::::::::::::::::::::::::: callout + +### Types d'intervention + +Il existe deux types d'intervention pour `model_default()`. Interventions sur les paramètres du modèle (`transmission_rate` $\beta$, `infectiousness_rate` $\sigma$ et `recovery_rate` $\gamma$) et les réductions des matrices de contact (`contacts`). + +Pour mettre en œuvre les interventions sur les contacts et les taux dans la même simulation, elles doivent être transmises sous la forme d'une liste, par exemple, `intervention = list(transmission_rate = mask_mandate, contacts = close_schools)`. Toutefois, si plusieurs interventions ciblent les taux de contact, elles doivent être transmises sous la forme d'une seule liste. `contacts` entrée. Voir le [vignette sur la modélisation des interventions qui se chevauchent](https://epiverse-trace.github.io/epidemics/articles/modelling_multiple_interventions.html) pour plus de détails. + +:::::::::::::::::::::::::::::::::::::::::::::::: + +## Interventions pharmaceutiques + +Les interventions pharmaceutiques (IP) sont des mesures telles que les programmes de vaccination et de traitement de masse. Dans la section précédente, nous avons intégré les interventions dans le modèle en réduisant les valeurs des paramètres pendant une période spécifique de la fenêtre temporelle au cours de laquelle ces interventions doivent avoir lieu. Dans le cas de la vaccination, nous supposons qu'après l'intervention, les individus ne sont plus sensibles et doivent être classés dans un état pathologique différent. Par conséquent, nous spécifions le taux auquel les individus sont vaccinés et suivons le nombre d'individus vaccinés au fil du temps. + +Le diagramme ci-dessous montre le modèle SEIRV mis en œuvre à l'aide de `model_default()` où les individus sensibles sont vaccinés et passent ensuite à l'étape de la vaccination. $V$ classe. + +```{r diagram_SEIRV, echo=FALSE, message=FALSE} +DiagrammeR::grViz("digraph { + + # graph statement + ################# + graph [layout = dot, + rankdir = LR, + overlap = true, + fontsize = 10] + + # nodes + ####### + node [shape = square, + fixedsize = true + width = 1.3] + + S + E + I + R + V + + # edges + ####### + S -> E [label = ' infection (β)'] + S -> V [label = ' vaccination (ν)'] + E -> I [label = ' onset of \ninfectiousness (α)'] + I -> R [label = ' recovery (γ)'] + +}") +``` + +Les équations décrivant ce modèle sont les suivantes : + +$$ +\begin{aligned} +\frac{dS_i}{dt} & = - \beta S_i \sum_j C_{i,j} I_j/N_j -\nu_{t} S_i \ +\frac{dE_i}{dt} &= \beta S_i\sum_j C_{i,j} I_j/N_j - \alpha E_i \ +\frac{dI_i}{dt} &= \alpha E_i - \gamma I_i \ +\frac{dR_i}{dt} &=\gamma I_i \ +\frac{dV_i}{dt} & =\nu_{i,t} S_i\ +\end{aligned} +$$ +Les individus de la tranche d'âge ($i$) à un moment spécifique dépendant ($t$) sont vaccinés à un taux ($\nu_{i,t}$). Les autres composantes SEIR de ces équations sont décrites dans le tutoriel [simuler la transmission](../episodes/simulating-transmission.md#simulating-disease-spread). + +Pour étudier l'effet de la vaccination, nous devons créer un objet de vaccination que nous transmettrons en tant qu'entrée à la fonction `model_default()` qui comprend le taux de vaccination spécifique à chaque groupe d'âge `nu` et les heures de début et de fin du programme de vaccination spécifiques aux groupes d'âge (`time_begin` et `time_end`). + +Nous supposerons ici que tous les groupes d'âge sont vaccinés au même taux (0,01) et que le programme de vaccination commence au 40e jour et se poursuit pendant 150 jours. + +```{r vaccinate} +# prepare a vaccination object +vaccinate <- vaccination( + name = "vaccinate all", + time_begin = matrix(40, nrow(contact_matrix)), + time_end = matrix(40 + 150, nrow(contact_matrix)), + nu = matrix(c(0.01, 0.01, 0.01)) +) +``` + +Nous passons notre objet de vaccination dans le modèle en utilisant l'argument `vaccination = vaccinate`: + +```{r output_vaccinate} +output_vaccinate <- model_default( + # population + population = uk_population, + # rate + transmission_rate = transmission_rate, + infectiousness_rate = infectiousness_rate, + recovery_rate = recovery_rate, + # intervention + vaccination = vaccinate, + # time + time_end = 300, increment = 1.0 +) +``` + +::::::::::::::::::::::::::::::::::::: challenge + +## Comparez les interventions + +Représentez sur un même graphique les trois interventions (vaccination, fermeture des écoles et obligation de porter un masque) et la simulation de référence. Quelle intervention réduit le plus le nombre maximal de personnes infectieuses ? + +:::::::::::::::::::::::: solution + +```{r plot_vaccinate, echo=TRUE, message=FALSE, fig.width=10} +# create intervention_type column for plotting +output_vaccinate$intervention_type <- "vaccination" +output <- rbind(output_school, output_masks, output_vaccinate, output_baseline) + +output %>% + filter(compartment == "infectious") %>% + ggplot() + + aes( + x = time, + y = value, + color = intervention_type, + linetype = intervention_type + ) + + stat_summary( + fun = "sum", + geom = "line", + linewidth = 1 + ) + + scale_y_continuous( + labels = scales::comma + ) + + theme_bw() + + labs( + x = "Simulation time (days)", + y = "Individuals" + ) +``` + +Le graphique montre que le pic du nombre total d'individus infectieux en cas de vaccination est beaucoup plus faible que lors des fermetures d'écoles et des interventions avec port de masques. + +::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::: + +## Résumé + +Différents types d'intervention peuvent être mis en œuvre à l'aide de la modélisation mathématique. La modélisation des interventions nécessite des hypothèses sur les paramètres du modèle qui sont affectés (par exemple, les matrices de contact, le taux de transmission), ainsi que sur l'ampleur et le moment de la simulation d'une épidémie. + +L'étape suivante consiste à quantifier l'effet d'une intervention. Si vous souhaitez apprendre à comparer les interventions, veuillez suivre le didacticiel suivant [Comparer les résultats des interventions en matière de santé publique](../episodes/compare-interventions.md). + +::::::::::::::::::::::::::::::::::::: keypoints + +- L'effet des NPI peut être modélisé comme une réduction des taux de contact entre les groupes d'âge ou une réduction du taux de transmission de l'infection. +- La vaccination peut être modélisée en supposant que les individus passent à un état pathologique différent. $V$ + +:::::::::::::::::::::::::::::::::::::::::::::::: + +## Références + +1. Davies, N. G., Klepac, P., Liu, Y., Prem, K., Jit, M. et Eggo, R. M. (2020). Age-dependent effects in the transmission and control of COVID-19 epidemics (Effets dépendants de l'âge dans la transmission et le contrôle des épidémies de COVID-19). Nature Medicine, 26(8), 1205-1211. + +2. Li, Y., Liang, M., Gao, L., Ahmed, M. A., Uy, J. P., Cheng, C., ... \& Sun, C. (2020). Masques de protection pour prévenir la transmission du COVID-19 : A systematic review and meta-analysis. American Journal of Infection Control, 49(7), 900-906. + +3. Mossong, J., Hens, N., Jit, M., Beutels, P., Auranen, K., Mikolajczyk, R., ... \& Edmunds, W. J. (2008). Social contacts and mixing patterns relevant to the spread of infectious diseases (contacts sociaux et modèles de mélange pertinents pour la propagation des maladies infectieuses). PLoS medicine, 5(3), e74. + + diff --git a/locale/fr/episodes/simulating-transmission.Rmd b/locale/fr/episodes/simulating-transmission.Rmd new file mode 100644 index 0000000..e5998e3 --- /dev/null +++ b/locale/fr/episodes/simulating-transmission.Rmd @@ -0,0 +1,545 @@ +--- +title: Simulation de la transmission +teaching: 45 +exercises: 30 +--- + +```{r setup, echo=FALSE, message=FALSE, warning=FALSE} +library(ggplot2) +library(dplyr) +library(tidyverse) +library(DiagrammeR) +library(webshot) +library(epidemics) +webshot::install_phantomjs(force = TRUE) +``` + +:::::::::::::::::::::::::::::::::::::: questions + +- Comment simuler la propagation d'une maladie à l'aide d'un modèle mathématique ? +- Quels sont les intrants nécessaires à la simulation d'un modèle ? +- Comment tenir compte de l'incertitude ? + +:::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::: objectives + +- Chargez une structure de modèle existante à partir de `{epidemics}` paquet R +- Chargez une matrice de contacts sociaux existante avec `{socialmixr}` +- Générer une simulation de modèle de propagation de maladie avec `{epidemics}` +- Générer des simulations de modèles multiples et visualiser l'incertitude + +:::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::: prereq + +Les apprenants doivent se familiariser avec les dépendances conceptuelles suivantes avant de travailler sur ce didacticiel : + +**Modélisation mathématique** : [Introduction aux modèles de maladies infectieuses](https://doi.org/10.1038/s41592-020-0856-2), [variables d'état](../learners/reference.md#state), [paramètres du modèle](../learners/reference.md#parsode), [conditions initiales](../learners/reference.md#initial), [équations différentielles](../learners/reference.md#ordinary). + +**Théorie des épidémies** : [Transmission](https://doi.org/10.1155/2011/267049), [Numéro de reproduction](https://doi.org/10.3201/eid2501.171901). +::::::::::::::::::::::::::::::::: + +## Introduction + +Les modèles mathématiques sont des outils utiles pour générer des trajectoires futures de propagation de maladies. Dans ce tutoriel, nous utiliserons le paquetage R `{epidemics}` pour générer des trajectoires de maladie d'une souche de grippe à potentiel pandémique. À la fin de ce tutoriel, vous serez en mesure de générer la trajectoire ci-dessous montrant le nombre d'individus infectieux dans différentes catégories d'âge au fil du temps. + +Dans ce tutoriel, nous allons apprendre à utiliser la fonction `{epidemics}` pour simuler des trajectoires de maladies et l'accès aux données de contacts sociaux avec le paquet `{socialmixr}`. Nous utiliserons `{dplyr}`, `{ggplot2}` et le tuyau `%>%` pour relier certaines de leurs fonctions, alors appelons aussi la fonction `{tidyverse}` paquet : + +```{r, message=FALSE, warning=FALSE} +library(epidemics) +library(socialmixr) +library(tidyverse) +``` + +```{r traj, echo=FALSE, message=FALSE, fig.width=10, eval=TRUE} +# load contact and population data from socialmixr::polymod +polymod <- socialmixr::polymod +contact_data <- socialmixr::contact_matrix( + polymod, + countries = "United Kingdom", + age.limits = c(0, 20, 40), + symmetric = TRUE +) + +# prepare contact matrix +contact_matrix <- t(contact_data$matrix) + +# prepare the demography vector +demography_vector <- contact_data$demography$population +names(demography_vector) <- rownames(contact_matrix) + +# initial conditions: one in every 1 million is infected +initial_i <- 1e-6 +initial_conditions_inf <- c( + S = 1 - initial_i, E = 0, I = initial_i, R = 0, V = 0 +) + +initial_conditions_free <- c( + S = 1, E = 0, I = 0, R = 0, V = 0 +) + +# build for all age groups +initial_conditions <- rbind( + initial_conditions_inf, + initial_conditions_free, + initial_conditions_free +) +rownames(initial_conditions) <- rownames(contact_matrix) + +# prepare the population to model as affected by the epidemic +uk_population <- epidemics::population( + name = "UK", + contact_matrix = contact_matrix, + demography_vector = demography_vector, + initial_conditions = initial_conditions +) + +# time periods +preinfectious_period <- 3.0 +infectious_period <- 7.0 +basic_reproduction <- 1.46 + +# rates +infectiousness_rate <- 1.0 / preinfectious_period +recovery_rate <- 1.0 / infectious_period +transmission_rate <- basic_reproduction / infectious_period + +# run an epidemic model using `epidemic()` +output_plot <- epidemics::model_default( + population = uk_population, + transmission_rate = transmission_rate, + infectiousness_rate = infectiousness_rate, + recovery_rate = recovery_rate, + time_end = 600, increment = 1.0 +) + +output_plot %>% + filter(compartment %in% c("exposed", "infectious")) %>% + ggplot() + + geom_line( + aes( + x = time, + y = value, + colour = demography_group, + linetype = compartment + ), + linewidth = 1.2 + ) + + scale_y_continuous( + labels = scales::comma + ) + + scale_colour_brewer( + palette = "Dark2", + name = "Age group" + ) + + theme_bw() + + labs( + x = "Simulation time (days)", + linetype = "Compartment", + y = "Individuals" + ) +``` + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: instructor + +À la fin de ce tutoriel, les apprenants devraient être en mesure de reproduire l'image ci-dessus sur leur propre ordinateur. + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +## Simuler la propagation d'une maladie + +Pour simuler les trajectoires des maladies infectieuses, il faut d'abord choisir un modèle mathématique. +Il existe une bibliothèque de modèles parmi lesquels vous pouvez choisir dans la rubrique `{epidemics}`. Ceux-ci sont préfixés par `model_*` et suffixés par le nom de l'infection (par ex. `model_ebola` pour Ebola) ou d'un identifiant différent (par ex. `model_default`). + +Dans ce tutoriel, nous utiliserons le modèle par défaut de l'application `{epidemics}` appelé `model_default()` Il s'agit d'un modèle structuré par âge qui classe les individus en fonction de leur statut infectieux. Pour chaque groupe d'âge $i$ les individus sont catégorisés comme étant soit sensibles $S$ infectés mais pas encore contagieux $E$ infectieux $I$ ou guéri $R$. Ensuite, nous devons définir le processus par lequel les individus passent d'un compartiment à l'autre. Cela peut se faire en définissant un ensemble de [équations différentielles](../learners/reference.md#ordinary) qui spécifient comment le nombre d'individus dans chaque compartiment évolue dans le temps. + +Le schéma ci-dessous montre les processus qui décrivent le flux d'individus entre les états pathologiques $S$, $E$, $I$ et $R$ et les paramètres clés de chaque processus. + +```{r diagram, echo=FALSE, message=FALSE} +DiagrammeR::grViz("digraph { + + # graph statement + ################# + graph [layout = dot, + rankdir = LR, + overlap = true, + fontsize = 10] + + # nodes + ####### + node [shape = square, + fixedsize = true + width = 1.3] + + S + E + I + R + + # edges + ####### + S -> E [label = ' infection \n(transmission rate β)'] + E -> I [label = ' onset of infectiousness \n(infectiousness rate α)'] + I -> R [label = ' recovery \n(recovery rate γ)'] + +}") +``` + +::::::::::::::::::::::::::::::::::::: callout + +### Paramètres du modèle : taux + +Dans les modèles de population définis par des équations différentielles, les paramètres du modèle sont souvent (mais pas toujours) spécifiés sous forme de taux. Le taux auquel un événement se produit est l'inverse du temps moyen jusqu'à cet événement. Par exemple, dans le modèle SEIR, le taux de récupération $\gamma$ est l'inverse de la période infectieuse moyenne. + +Les valeurs de ces taux peuvent être déterminées à partir de l'histoire naturelle de la maladie. Par exemple, si les personnes sont en moyenne infectieuses pendant 8 jours, alors dans le modèle, 1/8 des personnes actuellement infectieuses se rétablissent chaque jour (c'est-à-dire le taux de rétablissement, $\gamma=1/8=0.125$). + +:::::::::::::::::::::::::::::::::::::::::::::::: + +Pour chaque état pathologique ($S$, $E$, $I$ et $R$) et le groupe d'âge ($i$), nous avons une équation différentielle décrivant le taux de changement par rapport au temps. + +$$ +\begin{aligned} +\frac{dS_i}{dt} & = - \beta S_i \sum_j C_{i,j} I_j/N_j \ +\frac{dE_i}{dt} &= \beta S_i\sum_j C_{i,j} I_j/N_j - \alpha E_i \ +\frac{dI_i}{dt} &= \alpha E_i - \gamma I_i \ +\frac{dR_i}{dt} &=\gamma I_i \ +\end{aligned} +$$ + +Les individus de la tranche d'âge ($i$) quittent l'état sensible ($S_i$) à l'état exposé ($E_i$) par le biais de contacts spécifiques à l'âge avec des individus infectieux dans tous les groupes $\beta S_i \sum_j C_{i,j} I_j/N_j$. La matrice de contact $C$ permet de tenir compte de l'hétérogénéité des contacts entre les groupes d'âge. Ils passent ensuite à l'état infectieux à un rythme de $\alpha$ et se rétablissent à un taux $\gamma$. Notez que ce modèle suppose qu'il n'y a pas de perte d'immunité (il n'y a pas de flux sortant de l'état de guérison), ce qui peut ne pas être applicable à toutes les maladies, car certaines d'entre elles permettent une réinfection. + +Les paramètres du modèle sont les suivants + +- taux de transmission $\beta$ (dérivé du nombre de reproduction de base $R_0$ et du taux de récupération $\gamma$), +- [matrice de contact](../learners/reference.md#contact) $C$ contenant la fréquence des contacts entre les groupes d'âge (un carré) $i \times j$ carrée), +- le taux d'infectiosité $\alpha$ (période pré-infectieuse, ou [période de latence](../learners/reference.md#latent) =$1/\alpha$), et +- taux de récupération $\gamma$ (période infectieuse = $1/\gamma$). + +::::::::::::::::::::::::::::::::::::: callout + +### Exposé, infecté, infectieux + +Les termes "exposé", "infecté" et "infectieux" dans la modélisation mathématique prêtent parfois à confusion. L'infection se produit après qu'une personne a été exposée, mais en termes de modélisation, les individus "exposés" sont considérés comme déjà infectés. + +Nous utiliserons les définitions suivantes pour nos variables d'état : + +- $E$ = Exposé : infecté **mais pas encore** infectieux, +- $I$ = infectieux : infecté **et** infectieux. + :::::::::::::::::::::::::::::::::::::::::::::::: + +Pour générer des trajectoires à l'aide de notre modèle, nous devons préparer les données d'entrée suivantes : + +1. Matrice de contact +2. Conditions initiales +3. Structure de la population +4. Paramètres du modèle + +### 1\. Matrice de contact + +Une matrice de contacts représente le nombre moyen de contacts entre les individus de différents groupes d'âge. Il s'agit d'une composante essentielle des modèles structurés par âge, car elle permet de saisir la manière dont les différents groupes d'âge interagissent et transmettent potentiellement les infections. Nous utiliserons le paquetage R `{socialmixr}` pour charger une matrice de contacts estimée à partir des données de l'enquête POLYMOD [(Mossong et al. 2008)](https://doi.org/10.1371/journal.pmed.0050074). + +::::::::::::::::::::::::::::::::::::: challenge + +## Contact avec la charge et données démographiques + +Utilisation du paquet R `socialmixr` exécutez les lignes de code R suivantes pour obtenir la matrice de contact du Royaume-Uni pour les tranches d'âge d'un an : + +- âge entre 0 et 20 ans, +- âge compris entre 20 et 40 ans, +- 40 ans et plus. + +```r +polymod <- socialmixr::polymod +contact_data <- socialmixr::contact_matrix( + survey = polymod, + countries = "United Kingdom", + age.limits = c(0, 20, 40), + symmetric = TRUE +) +# prepare contact matrix +contact_matrix <- t(contact_data$matrix) +contact_matrix +``` + +:::::::::::::::::::::::: solution + +```{r polymod_uk, echo=FALSE, message=FALSE} +polymod <- socialmixr::polymod +contact_data <- socialmixr::contact_matrix( + polymod, + countries = "United Kingdom", + age.limits = c(0, 20, 40), + symmetric = TRUE +) +# prepare contact matrix +contact_matrix <- t(contact_data$matrix) +contact_matrix +``` + +::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::: + +Le résultat est une matrice carrée avec des lignes et des colonnes pour chaque groupe d'âge. Les matrices de contact peuvent être chargées à partir d'autres sources, mais elles doivent être formatées en tant que matrice pour être utilisées dans la fonction `epidemics`. + +::::::::::::::::::::::::::::::::::::: callout + +### Normalisation + +Dans le cadre de `{epidemics}` la normalisation de la matrice de contact se fait dans l'appel de la fonction, nous n'avons donc pas besoin de normaliser la matrice de contact avant de la passer à la fonction `population()` (voir section 3. Structure de la population). Pour plus de détails sur la normalisation, consultez le tutoriel sur les [matrices de contact] ([Simulation de la transmission](../episodes/contact-matrices.md)) . + +:::::::::::::::::::::::::::::::::::::::::::::::: + +### 2\. Conditions initiales + +Les conditions initiales sont la proportion d'individus dans chaque état pathologique $S$, $E$, $I$ et $R$ pour chaque groupe d'âge au temps 0. Dans cet exemple, nous avons trois groupes d'âge : âge entre 0 et 20 ans, âge entre 20 et 40 ans et plus. Supposons que dans la catégorie d'âge la plus jeune, un individu sur un million soit infectieux, et que les autres catégories d'âge soient exemptes d'infection. + +Les conditions initiales dans la première catégorie d'âge sont les suivantes $S(0)=1-\frac{1}{1,000,000}$, $E(0) =0$, $I(0)=\frac{1}{1,000,000}$, $R(0)=0$. Il est spécifié sous la forme d'un vecteur comme suit : + +```{r initial_inf} +initial_i <- 1e-6 +initial_conditions_inf <- c( + S = 1 - initial_i, E = 0, I = initial_i, R = 0, V = 0 +) +``` + +Pour les catégories d'âge exemptes d'infection, les conditions initiales sont les suivantes $S(0)=1$, $E(0) =0$, $I(0)=0$, $R(0)=0$. Nous spécifions ceci comme suit, + +```{r initial_free} +initial_conditions_free <- c( + S = 1, E = 0, I = 0, R = 0, V = 0 +) +``` + +Nous combinons les trois vecteurs de conditions initiales en une seule matrice, + +```{r initial_conditions} +# combine the initial conditions +initial_conditions <- rbind( + initial_conditions_inf, # age group 1 + initial_conditions_free, # age group 2 + initial_conditions_free # age group 3 +) + +# use contact matrix to assign age group names +rownames(initial_conditions) <- rownames(contact_matrix) +initial_conditions +``` + +### 3\. Structure de la population + +L'objet population nécessite un vecteur contenant la structure démographique de la population. Le vecteur démographique doit être un vecteur nommé contenant le nombre d'individus dans chaque groupe d'âge de notre population donnée. Dans cet exemple, nous pouvons extraire les informations démographiques du vecteur `contact_data` que nous avons obtenu à l'aide de la méthode `socialmixr` package. + +```{r demography} +demography_vector <- contact_data$demography$population +names(demography_vector) <- rownames(contact_matrix) +demography_vector +``` + +Pour créer notre objet population, à partir de l'objet `{epidemics}` nous appelons la fonction `population()` en spécifiant un nom, la matrice de contact, le vecteur démographique et les conditions initiales. + +```{r population} +library(epidemics) + +uk_population <- population( + name = "UK", + contact_matrix = contact_matrix, + demography_vector = demography_vector, + initial_conditions = initial_conditions +) +``` + +### 4\. Paramètres du modèle + +Pour exécuter notre modèle, nous devons en spécifier les paramètres : + +- le taux de transmission $\beta$, +- taux d'infectiosité $\alpha$ (période préinfectieuse=$1/\alpha$), +- taux de guérison $\gamma$ (période infectieuse=$1/\gamma$). + +En `epidemics` nous spécifions les entrées du modèle comme étant : + +- `transmission_rate` $\beta = R_0 \gamma$, +- `infectiousness_rate` = $\alpha$, +- `recovery_rate` = $\gamma$, + +Nous simulerons une souche de grippe à potentiel pandémique ayant les caractéristiques suivantes $R_0=1.46$ avec une période pré-infectieuse de 3 jours et une période infectieuse de 7 jours. Nos données d'entrée seront donc les suivantes + +```{r} +# time periods +preinfectious_period <- 3.0 +infectious_period <- 7.0 +basic_reproduction <- 1.46 +``` + +```{r} +# rates +infectiousness_rate <- 1.0 / preinfectious_period +recovery_rate <- 1.0 / infectious_period +transmission_rate <- basic_reproduction / infectious_period +``` + +::::::::::::::::::::::::::::::::::::: callout + +### Le nombre de reproduction de base $R_0$ + +Le numéro de reproduction de base, $R_0$ pour le modèle SEIR est le suivant : + +$$ R_0 = \frac{\beta}{\gamma}.$$ + +Par conséquent, nous pouvons réécrire le taux de transmission $\beta$ comme suit : + +$$ \beta = R_0 \gamma.$$ + +:::::::::::::::::::::::::::::::::::::::::::::::: + +## Exécution du modèle + +::::::::::::::::::::::::::::::::::::: callout + +### Exécution (résolution) du modèle + +Pour les modèles décrits par [équations différentielles](../learners/reference.md#ordinary) exécuter" le modèle signifie en fait prendre le système d'équations différentielles et le "résoudre" pour découvrir comment le nombre de personnes dans les compartiments sous-jacents évolue dans le temps. Étant donné que les équations différentielles décrivent le taux de changement des états pathologiques en fonction du temps, plutôt que le nombre d'individus dans chacun de ces états, nous devons généralement utiliser des méthodes numériques pour résoudre les équations. + +Un *solveur ODE* est le logiciel utilisé pour trouver des solutions numériques aux équations différentielles. Si vous souhaitez savoir comment un système d'équations différentielles est résolu en `{epidemics}` nous vous suggérons de lire la section sur [Systèmes et modèles d'EDO](https://epiverse-trace.github.io/epidemics/articles/design-principles.html#ode-systems-and-models) à la vignette "Principes de conception". +:::::::::::::::::::::::::::::::::::::::::::::::: + +Nous sommes maintenant prêts à exécuter notre modèle en utilisant `model_default()` à partir de l'outil `{epidemics}` package. + +Précisons `time_end=600` pour exécuter le modèle pendant 600 jours. + +```{r run_model} +output <- model_default( + # population + population = uk_population, + # rates + transmission_rate = transmission_rate, + infectiousness_rate = infectiousness_rate, + recovery_rate = recovery_rate, + # time + time_end = 600, increment = 1.0 +) +head(output) +``` + +*Remarque : ce modèle permet également d'inclure la vaccination et de suivre le nombre d'individus vaccinés au fil du temps. Même si nous n'avons pas spécifié de vaccination, il y a toujours un compartiment vacciné dans le résultat (ne contenant aucun individu). Nous aborderons l'utilisation de la vaccination dans les prochains tutoriels.* + +Le résultat de notre modèle est le nombre d'individus dans chaque compartiment de chaque groupe d'âge au fil du temps. Nous pouvons visualiser uniquement les individus infectieux (ceux qui se trouvent dans le compartiment vacciné). $I$ classe) au fil du temps. + +```{r visualise, fig.width=10} +library(tidyverse) + +output %>% + filter(compartment == "infectious") %>% + ggplot() + + geom_line( + aes( + x = time, + y = value, + colour = demography_group + ) + ) + + scale_y_continuous( + labels = scales::comma + ) + + theme_bw() + + labs( + x = "Simulation time (days)", + linetype = "Compartment", + y = "Individuals" + ) +``` + +::::::::::::::::::::::::::::::::::::: callout + +### Incréments de temps + +Notez qu'il existe un argument par défaut de `increment = 1`. Il s'agit du pas de temps du solveur ODE. Lorsque les paramètres sont spécifiés sur une échelle de temps quotidienne et le nombre maximum de pas de temps (`time_end`) est de jours, le pas de temps par défaut du solveur ODE est d'un jour. + +Le choix de l'incrément dépend de l'échelle de temps des paramètres et de la vitesse à laquelle les événements peuvent se produire. En général, l'incrément doit être plus petit que l'événement le plus rapide qui puisse se produire. Par exemple, l'incrément doit être plus petit que l'événement le plus rapide qui peut se produire : + +- si les paramètres se situent sur une échelle de temps quotidienne et que tous les événements sont signalés quotidiennement, l'incrément doit être égal à un jour ; +- si les paramètres se situent sur une échelle de temps mensuelle, mais que certains événements se produisent au cours d'un mois, l'incrément doit être inférieur à un mois. + +:::::::::::::::::::::::::::::::::::::::::::::::: + +## Prise en compte de l'incertitude + +Le modèle épidémique est le suivant [déterministe](../learners/reference.md#deterministic) Le modèle épidémique est déterministe, c'est-à-dire qu'il fonctionne comme une horloge : les mêmes paramètres conduiront toujours à la même trajectoire. Un modèle déterministe est un modèle dont le résultat est entièrement déterminé par les conditions et les paramètres initiaux, sans aucune variation aléatoire. Cependant, la réalité n'est pas aussi prévisible. Il y a deux raisons principales à cela : le processus de transmission peut être aléatoire et nous pouvons ne pas connaître les caractéristiques épidémiologiques exactes de l'agent pathogène qui nous intéresse. Dans le prochain épisode, nous examinerons les modèles "stochastiques" (c'est-à-dire les modèles dans lesquels nous pouvons définir le processus qui crée un caractère aléatoire dans la transmission). Entre-temps, nous pouvons inclure l'incertitude dans la valeur des paramètres qui entrent dans le modèle déterministe. Pour tenir compte de cette incertitude, nous devons exécuter notre modèle pour différentes combinaisons de paramètres. + +Nous avons exécuté notre modèle avec $R_0= 1.5$. Cependant, nous pensons que $R_0$ suit une distribution normale avec une moyenne de 1,5 et un écart-type de 0,05. Pour tenir compte de l'incertitude, nous exécuterons le modèle pour différentes valeurs de $R_0$. Les étapes à suivre pour ce faire sont les suivantes : + +1. Obtenez 100 échantillons à partir d'une distribution normale. + +```{r normal, echo=TRUE} +# specify the mean and standard deviation of R0 +r_estimate_mean <- 1.5 +r_estimate_sd <- 0.05 + +# Generate 100 R samples +r_samples <- withr::with_seed( + seed = 1, + rnorm( + n = 100, mean = r_estimate_mean, sd = r_estimate_sd + ) +) + +infectious_period <- 7 +beta <- r_samples / infectious_period +``` + +2. Exécutez le modèle 100 fois avec $R_0$ égal à un échantillon différent à chaque fois + +```{r samples} +output_samples <- model_default( + population = uk_population, + transmission_rate = beta, + infectiousness_rate = infectiousness_rate, + recovery_rate = recovery_rate, + time_end = 600, increment = 1 +) +``` + +3. Calculez la moyenne et les quantiles à 95 % du nombre d'individus infectieux pour chaque simulation du modèle et visualisez les résultats. + +```{r plot, fig.width=10} +output_samples %>% + mutate(r_value = r_samples) %>% + unnest(data) %>% + filter(compartment == "infectious") %>% + ggplot() + + geom_line( + aes(time, value, color = r_value, group = param_set), + alpha = 3 + ) + + scale_color_fermenter( + palette = "RdBu", + name = "R" + ) + + scale_y_continuous( + labels = scales::comma + ) + + facet_grid( + cols = vars(demography_group) + ) + + theme_bw() + + labs( + x = "Simulation time (days)", + y = "Individuals" + ) +``` + +Le choix des paramètres dans lesquels inclure l'incertitude dépend de plusieurs facteurs : le degré d'information sur la valeur d'un paramètre, par exemple la cohérence des estimations tirées de la littérature ; la sensibilité des résultats du modèle aux changements de valeur des paramètres ; et l'objectif de la tâche de modélisation. Voir aussi [McCabe et al. 2021](https://doi.org/10.1016%2Fj.epidem.2021.100520) pour en savoir plus sur les différents types d'incertitude dans la modélisation des maladies infectieuses. + +## Résumé + +Dans ce tutoriel, nous avons appris à simuler la propagation d'une maladie à l'aide d'un modèle mathématique. Une fois qu'un modèle a été choisi, les paramètres et autres entrées doivent être spécifiés de manière correcte pour effectuer les simulations du modèle. Dans le prochain tutoriel, nous verrons comment choisir le bon modèle pour différentes tâches. + +::::::::::::::::::::::::::::::::::::: keypoints + +- Les trajectoires de la maladie peuvent être générées à l'aide du paquetage R `epidemics` +- L'incertitude devrait être incluse dans les trajectoires du modèle en utilisant une gamme de valeurs des paramètres du modèle. + +:::::::::::::::::::::::::::::::::::::::::::::::: + + diff --git a/locale/fr/episodes/vaccine-comparisons.Rmd b/locale/fr/episodes/vaccine-comparisons.Rmd new file mode 100644 index 0000000..42f9581 --- /dev/null +++ b/locale/fr/episodes/vaccine-comparisons.Rmd @@ -0,0 +1,1148 @@ +--- +title: Comparaison des stratégies de vaccination +teaching: 50 +exercises: 20 +--- + +:::::::::::::::::::::::::::::::::::::: questions + +- Quels sont les effets directs et indirects de la vaccination ? +- Quels sont les avantages des programmes de vaccination ciblés ? +- Que se passe-t-il si nous combinons la vaccination et les NPI ? + +:::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::: objectives + +- Comprendre l'impact potentiel des programmes de vaccination +- Mettre en œuvre simultanément des programmes de vaccination et des mesures NPI à l'aide de `{epidemics}` + +:::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::: prereq + +- Des tutoriels complets [Simulation de la transmission](../episodes/simulating-transmission.md), [Modélisation des interventions](../episodes/modelling-interventions.md) et [Comparaison des résultats des interventions en matière de santé publique](../episodes/compare-interventions.md). + +Les apprenants doivent se familiariser avec les dépendances conceptuelles suivantes avant de travailler sur ce tutoriel : + +**Réponse à l'épidémie** : [Types d'intervention](https://www.cdc.gov/nonpharmaceutical-interventions/). +::::::::::::::::::::::::::::::::: + +## Introduction + +Les programmes de vaccination peuvent être utilisés pour aider à contrôler les épidémies par le biais d'une protection directe et indirecte contre l'infection. Nous pouvons utiliser des modèles mathématiques pour prédire l'impact potentiel de différentes stratégies de vaccination. + +Selon le mode de propagation des infections, la vaccination de groupes à risque spécifiques peut s'avérer plus efficace que la vaccination de tous. Lorsque les programmes de vaccination ne sont pas immédiatement disponibles, que ce soit du point de vue des capacités ou du développement, nous pourrions également vouloir savoir comment les interventions non pharmaceutiques (INP) peuvent être utilisées pour contrôler l'épidémie dans l'intervalle, ainsi qu'après le lancement d'un programme de vaccination. + +Dans ce cours, nous comparerons différentes stratégies de vaccination en utilisant des modèles de `{epidemics}`. Nous utiliserons les paquets R suivants : + +```{r, message=FALSE} +library(ggplot2) +library(epidemics) +library(dplyr) +library(purrr) +``` + +## Termes clés + +Avant de poursuivre, définissons quelques termes importants : + +- **Immunité du troupeau** L'immunité collective est une forme de protection indirecte contre les maladies infectieuses qui se produit lorsqu'une proportion suffisante d'une population est immunisée contre une infection, réduisant ainsi la probabilité d'infection pour les individus qui n'ont pas d'immunité. +- **Stratégies de vaccination** Différentes approches de l'administration des vaccins, qui peuvent inclure le ciblage de groupes d'âge ou de populations à risque spécifiques. +- **Interventions non pharmaceutiques (NPI)** Les interventions non pharmaceutiques (INP) sont des actions, autres que les vaccins et les traitements, que les personnes et les communautés peuvent entreprendre pour ralentir la propagation des maladies. + +## Effets directs et indirects de la vaccination + +Les programmes de vaccination utilisant des vaccins bloquant les infections présentent deux avantages : + +1. Réduction du risque individuel d'infection (**direct** de la vaccination) +2. Réduction de la contribution à la transmission (**indirecte** indirect de la vaccination). + +Nous illustrerons ceci en utilisant les résultats de `model_default()` en `{epidemics}`. Les `model_default()` met en œuvre un modèle SEIR (Susceptible-Exposé-Infecté-Récouvert) standard avec des compartiments de vaccination. En utilisant la matrice de contact et les paramètres de l'exemple d'épidémie COVID-19 dans la section [Modélisation des interventions](../episodes/modelling-interventions.md) nous étudierons l'impact de deux programmes de vaccination sur le nombre d'infections. Pour ce scénario hypothétique, nous supposerons que les programmes de vaccination commencent le jour 0 et se poursuivent pendant 150 jours. Nous supposerons que tous les groupes d'âge sont vaccinés au même taux dans chaque programme, comme suit : + +- programme de vaccination 01 : taux de vaccination 0,001 +- programme de vaccination 02 : taux de vaccination 0,01. + +```{r, echo=FALSE, message=FALSE} +polymod <- socialmixr::polymod +contact_data <- socialmixr::contact_matrix( + polymod, + countries = "United Kingdom", + age.limits = c(0, 15, 65), + symmetric = TRUE +) + + +# prepare contact matrix +contact_matrix <- t(contact_data$matrix) + +# prepare the demography vector +demography_vector <- contact_data$demography$population +names(demography_vector) <- rownames(contact_matrix) + +# initial conditions: one in every 1 million is infected +initial_i <- 1e-6 +initial_conditions <- c( + S = 1 - initial_i, E = 0, I = initial_i, R = 0, V = 0 +) + +# build for all age groups +initial_conditions <- matrix( + rep(initial_conditions, dim(contact_matrix)[1]), + ncol = 5, byrow = TRUE +) +rownames(initial_conditions) <- rownames(contact_matrix) + +# prepare the population to model as affected by the epidemic +uk_population <- epidemics::population( + name = "UK", + contact_matrix = contact_matrix, + demography_vector = demography_vector, + initial_conditions = initial_conditions +) + +# time periods +preinfectious_period <- 4.0 +infectious_period <- 5.5 +basic_reproduction <- 2.7 + +# rates +infectiousness_rate <- 1.0 / preinfectious_period +recovery_rate <- 1.0 / infectious_period +transmission_rate <- basic_reproduction / infectious_period +``` + +```{r} +# prepare vaccination objects +vaccinate_01 <- epidemics::vaccination( + name = "vaccinate all", + time_begin = matrix(0, nrow(contact_matrix)), + time_end = matrix(150, nrow(contact_matrix)), + nu = matrix(c(0.001, 0.001, 0.001)) +) + +vaccinate_02 <- epidemics::vaccination( + name = "vaccinate all", + time_begin = matrix(0, nrow(contact_matrix)), + time_end = matrix(150, nrow(contact_matrix)), + nu = matrix(c(0.01, 0.01, 0.01)) +) +``` + +Le résultat intuitif est que plus le taux de vaccination est élevé, plus le nombre de personnes vaccinées est important. + +::: tab + +### Sortie + +```{r, echo=FALSE, eval=TRUE} +output_baseline <- epidemics::model_default( + # population + population = uk_population, + # rate + transmission_rate = transmission_rate, + infectiousness_rate = infectiousness_rate, + recovery_rate = recovery_rate, + # time + time_end = 200, increment = 1.0 +) + +output_vaccinate_01 <- epidemics::model_default( + # population + population = uk_population, + # rate + transmission_rate = transmission_rate, + infectiousness_rate = infectiousness_rate, + recovery_rate = recovery_rate, + # intervention + vaccination = vaccinate_01, + # time + time_end = 200, increment = 1.0 +) + +output_vaccinate_02 <- epidemics::model_default( + # population + population = uk_population, + # rate + transmission_rate = transmission_rate, + infectiousness_rate = infectiousness_rate, + recovery_rate = recovery_rate, + # intervention + vaccination = vaccinate_02, + # time + time_end = 200, increment = 1.0 +) + +# create intervention_type column for plotting +output_baseline$intervention_type <- "baseline" +output_vaccinate_01$intervention_type <- "vaccinate 0.001" +output_vaccinate_02$intervention_type <- "vaccinate 0.01" +output <- rbind(output_baseline, output_vaccinate_01, output_vaccinate_02) + + +output %>% + filter(compartment == "vaccinated") %>% + ggplot() + + ggtitle("Number vaccinated") + + aes( + x = time, + y = value, + color = intervention_type, + linetype = intervention_type + ) + + stat_summary( + fun = "sum", + geom = "line", + linewidth = 1 + ) + + scale_y_continuous( + labels = scales::comma + ) + + geom_vline( + xintercept = c( + vaccinate_01$time_begin, + vaccinate_01$time_end + ), + linetype = 2 + ) + + theme_bw() + + labs( + x = "Simulation time (days)", + y = "Individuals" + ) +``` + +### Code R + +```{r, echo=TRUE, eval=FALSE} +output_baseline <- epidemics::model_default( + # population + population = uk_population, + # rate + transmission_rate = transmission_rate, + infectiousness_rate = infectiousness_rate, + recovery_rate = recovery_rate, + # time + time_end = 200, increment = 1.0 +) + +output_vaccinate_01 <- epidemics::model_default( + # population + population = uk_population, + # rate + transmission_rate = transmission_rate, + infectiousness_rate = infectiousness_rate, + recovery_rate = recovery_rate, + # intervention + vaccination = vaccinate_01, + # time + time_end = 200, increment = 1.0 +) + +output_vaccinate_02 <- epidemics::model_default( + # population + population = uk_population, + # rate + transmission_rate = transmission_rate, + infectiousness_rate = infectiousness_rate, + recovery_rate = recovery_rate, + # intervention + vaccination = vaccinate_02, + # time + time_end = 200, increment = 1.0 +) + +# create intervention_type column for plotting +output_baseline$intervention_type <- "baseline" +output_vaccinate_01$intervention_type <- "vaccinate 0.001" +output_vaccinate_02$intervention_type <- "vaccinate 0.01" +output <- rbind(output_baseline, output_vaccinate_01, output_vaccinate_02) + + +output %>% + filter(compartment == "vaccinated") %>% + ggplot() + + ggtitle("Number vaccinated") + + aes( + x = time, + y = value, + color = intervention_type, + linetype = intervention_type + ) + + stat_summary( + fun = "sum", + geom = "line", + linewidth = 1 + ) + + scale_y_continuous( + labels = scales::comma + ) + + geom_vline( + xintercept = c( + vaccinate_01$time_begin, + vaccinate_01$time_end + ), + linetype = 2 + ) + + theme_bw() + + labs( + x = "Simulation time (days)", + y = "Individuals" + ) +``` + +::: + +Pour comprendre la **indirecte** des vaccinations, nous voulons connaître l'effet de la vaccination sur la transmission, et donc le taux d'apparition de nouvelles infections. Nous utiliserons la fonction `new_infections()` dans `{epidemics}` pour calculer le nombre de nouvelles infections au fil du temps pour les différents programmes de vaccination. + +Les données requises sont : + +- `data` : la sortie du modèle, +- `compartments_from_susceptible` : il s'agit d'une entrée facultative, mais dans notre cas, elle est nécessaire. Nous ne voulons pas que le nombre de personnes vaccinées soit compté comme de nouvelles infections, c'est pourquoi nous devons spécifier le nom du compartiment du modèle dans lequel les individus passent de `susceptible` (dans cet exemple `vaccinated`), +- `by_group` Les résultats doivent être calculés pour chaque groupe démographique séparément. + +```{r} +vaccinate_01_infections <- epidemics::new_infections( + output_vaccinate_01, + compartments_from_susceptible = "vaccinated", + by_group = FALSE +) +``` + +::: tab + +### Résultats + +```{r, echo=FALSE, eval=TRUE} +# calculate new infections +baseline_infections <- epidemics::new_infections( + output_baseline, + compartments_from_susceptible = "vaccinated", + by_group = FALSE +) +vaccinate_01_infections <- epidemics::new_infections( + output_vaccinate_01, + compartments_from_susceptible = "vaccinated", + by_group = FALSE +) +vaccinate_02_infections <- epidemics::new_infections( + output_vaccinate_02, + compartments_from_susceptible = "vaccinated", + by_group = FALSE +) + +# create intervention_type column for plotting +baseline_infections$intervention_type <- "baseline" +vaccinate_01_infections$intervention_type <- "vaccinate 0.001" +vaccinate_02_infections$intervention_type <- "vaccinate 0.01" +infections <- rbind( + baseline_infections, + vaccinate_01_infections, + vaccinate_02_infections +) + + +infections %>% + ggplot() + + ggtitle("New infections") + + geom_line( + aes( + time, + new_infections, + colour = intervention_type, + linetype = intervention_type + ), + linewidth = 1 + ) + + scale_y_continuous( + labels = scales::comma + ) + + geom_vline( + xintercept = c( + vaccinate_01$time_begin, + vaccinate_01$time_end + ), + linetype = 2 + ) + + theme_bw() + + labs( + x = "Simulation time (days)", + y = "Individuals" + ) +``` + +### Code R + +```{r, echo=TRUE, eval=FALSE} +# calculate new infections +baseline_infections <- epidemics::new_infections( + output_baseline, + compartments_from_susceptible = "vaccinated", + by_group = FALSE +) +vaccinate_01_infections <- epidemics::new_infections( + output_vaccinate_01, + compartments_from_susceptible = "vaccinated", + by_group = FALSE +) +vaccinate_02_infections <- epidemics::new_infections( + output_vaccinate_02, + compartments_from_susceptible = "vaccinated", + by_group = FALSE +) + +# create intervention_type column for plotting +baseline_infections$intervention_type <- "baseline" +vaccinate_01_infections$intervention_type <- "vaccinate 0.001" +vaccinate_02_infections$intervention_type <- "vaccinate 0.01" +infections <- rbind( + baseline_infections, + vaccinate_01_infections, + vaccinate_02_infections +) + + +infections %>% + ggplot() + + ggtitle("New infections") + + geom_line( + aes( + time, + new_infections, + colour = intervention_type, + linetype = intervention_type + ), + linewidth = 1 + ) + + scale_y_continuous( + labels = scales::comma + ) + + geom_vline( + xintercept = c( + vaccinate_01$time_begin, + vaccinate_01$time_end + ), + linetype = 2 + ) + + theme_bw() + + labs( + x = "Simulation time (days)", + y = "Individuals" + ) +``` + +::: + +Nous constatons qu'après avoir pris en compte le nombre de personnes vaccinées, il y a moins de nouvelles infections lorsque le taux de vaccination est plus élevé. Cela s'explique par le fait qu'il y a moins de personnes susceptibles d'être infectées, et donc moins de personnes susceptibles d'être infectées et de contribuer à la propagation de l'infection. + +Le taux de vaccination est plus élevé que le nombre de personnes susceptibles d'être infectées. **indirecte** des programmes de vaccination est essentiel pour contrôler et éradiquer avec succès les infections. + +Pour évaluer l'impact des programmes de vaccination, nous prenons souvent en compte à la fois l'ampleur du pic, qui indique la pression exercée sur les soins de santé à un moment donné, et l'ampleur globale de l'épidémie, qui correspond au nombre cumulé d'infections. + +Nous pouvons trouver la somme cumulée à l'aide de la fonction R `cumsum()` et utiliser `purrr::map_dfr()` pour parcourir en boucle une liste de nouvelles données sur les infections. Nous pouvons constater que la différence entre les nombres d'infections est de plusieurs ordres de grandeur. + +```{r} +# create function that returns the intervention type and cumulative sum for +# given infections +find_cumsum <- function(infections) { + return(data.frame( + intervention_type = unique(infections$intervention_type), + cumulative_sum = tail(cumsum(infections$new_infections), n = 1) + )) +} + +# create list of interventions +interventions <- tibble::lst( + baseline_infections, + vaccinate_01_infections, + vaccinate_02_infections +) + +# apply function to each data frame in the list +purrr::map_dfr(interventions, find_cumsum) +``` + +::::::::::::::::::::::::::::::::::::: callout + +## Seuil d'immunité collective + +Il existe un seuil cible de vaccination basé sur le nombre de reproduction de base $R_0$ pour atteindre [l'immunité collective](../learners/reference.md#herdimmunity). + +La proportion de la population ($p$) qui doit être immunisée pour atteindre l'immunité de groupe est : + +$$p = 1- \frac{1}{R_0}. $$ + +Cette formule est dérivée du concept selon lequel, lorsqu'une proportion suffisante de la population est immunisée, chaque personne infectée transmettra l'infection à moins d'une autre personne en moyenne, ce qui entraînera une diminution du nombre de cas. Pour plus de détails sur la dérivation mathématique, consultez le site suivant [Plus Magazine](https://plus.maths.org/content/maths-minute-r0-and-herd-immunity). + +:::::::::::::::::::::::::::::::::::::::::::::::: + +## Vaccination ciblée + +Pour les infections dont la charge est plus élevée dans les différents groupes à risque, des programmes de vaccination ciblés peuvent être utilisés pour contrôler l'infection. Par exemple, s'il existe une hétérogénéité des contacts en fonction de l'âge, la vaccination ciblée de différents groupes d'âge se traduira par des trajectoires différentes de la maladie. + +Nous utiliserons la même matrice de contacts que ci-dessus à partir de [Modélisation des interventions](../episodes/modelling-interventions.md): + +```{r} +contact_matrix +``` + +Les niveaux de mixité sont plus élevés dans les groupes d'âge 0-15 ans et 15-65 ans que dans le groupe d'âge 65+, de sorte que nous nous attendons à ce que le ciblage des différents groupes d'âge entraîne des trajectoires de maladie différentes. + +Pour montrer l'effet d'une vaccination ciblée, nous comparerons les scénarios suivants : + +- la vaccination de tous les groupes d'âge à un taux de 0,001, +- la vaccination des 0-15 ans uniquement (groupe 1) à un taux de 0,003, +- la vaccination des 15-65 ans uniquement (groupe 2) à un taux de 0,003, +- la vaccination des personnes âgées de 65 ans et plus uniquement (groupe 3) à un taux de 0,003. + +::: tab + +### Résultats + +```{r, echo=FALSE} +vaccinate_group_1 <- epidemics::vaccination( + name = "vaccinate all", + time_begin = matrix(40, nrow(contact_matrix)), + time_end = matrix(40 + 150, nrow(contact_matrix)), + nu = matrix(c(0.001 * 3, 0, 0)) +) + +vaccinate_group_2 <- epidemics::vaccination( + name = "vaccinate all", + time_begin = matrix(40, nrow(contact_matrix)), + time_end = matrix(40 + 150, nrow(contact_matrix)), + nu = matrix(c(0, 0.001 * 3, 0)) +) + +vaccinate_group_3 <- epidemics::vaccination( + name = "vaccinate all", + time_begin = matrix(40, nrow(contact_matrix)), + time_end = matrix(40 + 150, nrow(contact_matrix)), + nu = matrix(c(0, 0, 0.001 * 3)) +) + +output_vaccinate_group_1 <- epidemics::model_default( + # population + population = uk_population, + # rate + transmission_rate = transmission_rate, + infectiousness_rate = infectiousness_rate, + recovery_rate = recovery_rate, + # intervention + vaccination = vaccinate_group_1, + # time + time_end = 200, + increment = 1.0 +) + +output_vaccinate_group_2 <- epidemics::model_default( + # population + population = uk_population, + # rate + transmission_rate = transmission_rate, + infectiousness_rate = infectiousness_rate, + recovery_rate = recovery_rate, + # intervention + vaccination = vaccinate_group_2, + # time + time_end = 200, + increment = 1.0 +) + + +output_vaccinate_group_3 <- epidemics::model_default( + # population + population = uk_population, + # rate + transmission_rate = transmission_rate, + infectiousness_rate = infectiousness_rate, + recovery_rate = recovery_rate, + # intervention + vaccination = vaccinate_group_3, + # time + time_end = 200, + increment = 1.0 +) + +vaccinate_group_1_infections <- epidemics::new_infections( + output_vaccinate_group_1, + compartments_from_susceptible = "vaccinated", + by_group = FALSE +) +vaccinate_group_2_infections <- epidemics::new_infections( + output_vaccinate_group_2, + compartments_from_susceptible = "vaccinated", + by_group = FALSE +) +vaccinate_group_3_infections <- epidemics::new_infections( + output_vaccinate_group_3, + compartments_from_susceptible = "vaccinated", + by_group = FALSE +) + +vaccinate_group_1_infections$intervention_type <- "vaccinate group 1" +vaccinate_group_2_infections$intervention_type <- "vaccinate group 2" +vaccinate_group_3_infections$intervention_type <- "vaccinate group 3" + +output_infections <- rbind( + baseline_infections, + vaccinate_01_infections, + vaccinate_group_1_infections, + vaccinate_group_2_infections, + vaccinate_group_3_infections +) + + +output_infections %>% + ggplot() + + geom_line( + aes( + time, + new_infections, + colour = intervention_type, + linetype = intervention_type + ), + linewidth = 1 + ) + + scale_y_continuous( + labels = scales::comma + ) + + geom_vline( + xintercept = c( + vaccinate_01$time_begin, + vaccinate_01$time_end + ), + linetype = 2 + ) + + theme_bw() + + labs( + x = "Simulation time (days)", + y = "Individuals" + ) +``` + +### Code R + +```{r, echo=TRUE, eval=FALSE} +vaccinate_group_1 <- epidemics::vaccination( + name = "vaccinate all", + time_begin = matrix(40, nrow(contact_matrix)), + time_end = matrix(40 + 150, nrow(contact_matrix)), + nu = matrix(c(0.001 * 3, 0, 0)) +) + +vaccinate_group_2 <- epidemics::vaccination( + name = "vaccinate all", + time_begin = matrix(40, nrow(contact_matrix)), + time_end = matrix(40 + 150, nrow(contact_matrix)), + nu = matrix(c(0, 0.001 * 3, 0)) +) + +vaccinate_group_3 <- epidemics::vaccination( + name = "vaccinate all", + time_begin = matrix(40, nrow(contact_matrix)), + time_end = matrix(40 + 150, nrow(contact_matrix)), + nu = matrix(c(0, 0, 0.001 * 3)) +) + +output_vaccinate_group_1 <- epidemics::model_default( + # population + population = uk_population, + # rate + transmission_rate = transmission_rate, + infectiousness_rate = infectiousness_rate, + recovery_rate = recovery_rate, + # intervention + vaccination = vaccinate_group_1, + # time + time_end = 200, + increment = 1.0 +) + +output_vaccinate_group_2 <- epidemics::model_default( + # population + population = uk_population, + # rate + transmission_rate = transmission_rate, + infectiousness_rate = infectiousness_rate, + recovery_rate = recovery_rate, + # intervention + vaccination = vaccinate_group_2, + # time + time_end = 200, + increment = 1.0 +) + + +output_vaccinate_group_3 <- epidemics::model_default( + # population + population = uk_population, + # rate + transmission_rate = transmission_rate, + infectiousness_rate = infectiousness_rate, + recovery_rate = recovery_rate, + # intervention + vaccination = vaccinate_group_3, + # time + time_end = 200, + increment = 1.0 +) + +vaccinate_group_1_infections <- epidemics::new_infections( + output_vaccinate_group_1, + compartments_from_susceptible = "vaccinated", + by_group = FALSE +) +vaccinate_group_2_infections <- epidemics::new_infections( + output_vaccinate_group_2, + compartments_from_susceptible = "vaccinated", + by_group = FALSE +) +vaccinate_group_3_infections <- epidemics::new_infections( + output_vaccinate_group_3, + compartments_from_susceptible = "vaccinated", + by_group = FALSE +) + +vaccinate_group_1_infections$intervention_type <- "vaccinate group 1" +vaccinate_group_2_infections$intervention_type <- "vaccinate group 2" +vaccinate_group_3_infections$intervention_type <- "vaccinate group 3" + +output_infections <- rbind( + baseline_infections, + vaccinate_01_infections, + vaccinate_group_1_infections, + vaccinate_group_2_infections, + vaccinate_group_3_infections +) + + +output_infections %>% + ggplot() + + geom_line( + aes( + time, + new_infections, + colour = intervention_type, + linetype = intervention_type + ), + linewidth = 1 + ) + + scale_y_continuous( + labels = scales::comma + ) + + geom_vline( + xintercept = c( + vaccinate_01$time_begin, + vaccinate_01$time_end + ), + linetype = 2 + ) + + theme_bw() + + labs( + x = "Simulation time (days)", + y = "Individuals" + ) +``` + +::: + +La vaccination du seul groupe 3 entraîne le pic épidémique le plus élevé. Le ciblage du groupe 2 entraîne le pic épidémique le plus faible. En revanche, le fait de cibler tous les groupes d'âge repousse l'heure du pic épidémique. Comme précédemment, comparons le nombre cumulé d'infections dans le cadre des différentes interventions : + +```{r} +interventions_targetted <- tibble::lst( + baseline_infections, + vaccinate_01_infections, + vaccinate_group_1_infections, + vaccinate_group_2_infections, + vaccinate_group_3_infections +) + +# apply function to each data frame in the list +purrr::map_dfr(interventions_targetted, find_cumsum) +``` + +### Risque d'infection et de mortalité par âge + +En ciblant des groupes d'âge spécifiques, on peut réduire le nombre de décès dans le groupe le plus âgé. Pour illustrer cela, nous pouvons définir un risque d'infection et de mortalité (RIF) spécifique à l'âge : + +```{r} +ifr <- c(0.00001, 0.001, 0.4) +names(ifr) <- rownames(contact_matrix) +``` + +Pour convertir les infections en décès, nous avons besoin de nouvelles infections par groupe d'âge. `new_infections()` avec `by_group = TRUE` puis nous multiplions les nouvelles infections par le TIF pour ce groupe d'âge : + +```{r} +vaccinate_group_1_age <- epidemics::new_infections( + output_vaccinate_group_1, + compartments_from_susceptible = "vaccinated", + by_group = TRUE +) + +vaccinate_group_1_deaths <- + 1:3 %>% + purrr::map_dfr( + function(x) + vaccinate_group_1_age %>% + filter(demography_group == names(ifr)[x]) %>% + mutate(deaths = new_infections * ifr[x]) + ) +``` + +```{r, echo=FALSE} + +vaccinate_01_age <- epidemics::new_infections( + output_vaccinate_01, + compartments_from_susceptible = "vaccinated", + by_group = TRUE +) + +vaccinate_01_deaths <- + 1:3 %>% + purrr::map_dfr( + function(x) + vaccinate_01_age %>% + filter(demography_group == names(ifr)[x]) %>% + mutate(deaths = new_infections * ifr[x]) + ) + +vaccinate_group_2_age <- epidemics::new_infections( + output_vaccinate_group_2, + compartments_from_susceptible = "vaccinated", + by_group = TRUE +) + +vaccinate_group_2_deaths <- + 1:3 %>% + purrr::map_dfr( + function(x) + vaccinate_group_2_age %>% + filter(demography_group == names(ifr)[x]) %>% + mutate(deaths = new_infections * ifr[x]) + ) + +vaccinate_group_3_age <- epidemics::new_infections( + output_vaccinate_group_3, + compartments_from_susceptible = "vaccinated", + by_group = TRUE +) + +vaccinate_group_3_deaths <- + 1:3 %>% + purrr::map_dfr( + function(x) + vaccinate_group_3_age %>% + filter(demography_group == names(ifr)[x]) %>% + mutate(deaths = new_infections * ifr[x]) + ) + + +baseline_age <- epidemics::new_infections( + output_baseline, + compartments_from_susceptible = "vaccinated", + by_group = TRUE +) + +baseline_deaths <- + 1:3 %>% + purrr::map_dfr( + function(x) + baseline_age %>% + filter(demography_group == names(ifr)[x]) %>% + mutate(deaths = new_infections * ifr[x]) + ) +``` + +La vaccination de tous les groupes d'âge a le plus grand impact sur les décès dans le groupe d'âge le plus élevé (plus de 65 ans), mais nous constatons également que la vaccination du groupe 2 réduit les décès dans le groupe d'âge le plus élevé. Le fait de cibler des groupes plus jeunes permet de réduire le nombre de décès dans le groupe d'âge le plus élevé (plus de 65 ans). + +```{r} +baseline_deaths$intervention_type <- "baseline" +vaccinate_01_deaths$intervention_type <- "vaccinate 0.001" +vaccinate_group_1_deaths$intervention_type <- "vaccinate group 1" +vaccinate_group_2_deaths$intervention_type <- "vaccinate group 2" +vaccinate_group_3_deaths$intervention_type <- "vaccinate group 3" + +output_deaths <- rbind(baseline_deaths, + vaccinate_01_deaths, + vaccinate_group_1_deaths, + vaccinate_group_2_deaths, + vaccinate_group_3_deaths) + +output_deaths %>% + filter(demography_group == "65+") %>% + ggplot() + + ggtitle("Deaths") + + geom_line( + aes(time, + deaths, + colour = intervention_type, + linetype = demography_group + ), + linewidth = 1) + + theme_bw() + + labs( + x = "Simulation time (days)", + y = "Individuals" + ) +``` + +## Vaccination contre NPI + +La modélisation est un outil utile pour comprendre l'impact potentiel du calendrier et des différentes combinaisons de mesures de contrôle. Dans un scénario d'épidémie, les vaccins peuvent être utilisés parallèlement à d'autres mesures de lutte. Une étude récente réalisée par [Barnsley et al. (2024)](https://doi.org/10.1016/S2214-109X\(24\)00286-9) a utilisé la modélisation pour montrer l'impact que le vaccin COVID-19 aurait pu avoir avec les IPV si le vaccin avait été développé dans les 100 jours suivant la reconnaissance de la menace pathogène. Nous nous inspirerons de cette étude pour montrer l'impact d'un vaccin par rapport à des IPV mises en œuvre à des moments différents. + +L'IPN que nous examinerons est la fermeture temporaire des écoles, une intervention qui a été utilisée comme mesure de contrôle de la grippe saisonnière [(Cowling et al. 2008)](https://doi.org/10.3201/eid1410.080646). Plus précisément, nous modéliserons une fermeture d'école qui réduira de 0,5 les contacts entre les enfants d'âge scolaire (0-15 ans) et entraînera une légère réduction (0,01) des contacts entre les adultes (15 ans et plus). Pour le programme de vaccination, nous supposons un taux de vaccination égal à 0,01 dans chaque groupe d'âge. + +Nous définissons **la mise en œuvre anticipée** comme le premier jour de la simulation (c'est-à-dire lorsqu'il y a moins de 100 infections au total), et **mise en œuvre tardive** 50 jours après le début de la simulation (c'est-à-dire lorsqu'il y a environ 50 000 infections au total). Nous supposons que les mesures de contrôle sont en place pendant 100 jours après le début de la simulation. + +Les combinaisons que nous examinerons sont les suivantes : + +- la mise en œuvre anticipée de la fermeture des écoles, +- la mise en œuvre anticipée d'un vaccin, +- la mise en œuvre tardive d'un vaccin, +- la mise en œuvre précoce de la fermeture des écoles et la mise en œuvre tardive d'un vaccin. + +Le code ci-dessous détaille la façon dont les interventions sont simulées : + +```{r} +early_start <- 0 +late_start <- 50 +duration <- 100 +time_end <- 200 + +# close schools early +close_schools_early <- epidemics::intervention( + name = "School closure", + type = "contacts", + time_begin = early_start, + time_end = early_start + duration, + reduction = matrix(c(0.5, 0.01, 0.01)) +) + +# vaccination late +vacc_late <- epidemics::vaccination( + name = "vaccinate late", + time_begin = matrix(late_start, nrow(contact_matrix)), + time_end = matrix(late_start + duration, nrow(contact_matrix)), + nu = matrix(c(0.01, 0.01, 0.01)) +) + +# npis started early + vaccination late +output_npi_early_vacc_late <- epidemics::model_default( + population = uk_population, + transmission_rate = transmission_rate, + infectiousness_rate = infectiousness_rate, + recovery_rate = recovery_rate, + vaccination = vacc_late, + intervention = list(contacts = close_schools_early), + time_end = time_end, increment = 1.0 +) +``` + +```{r, echo=FALSE} +# vaccinate early +vacc_early <- epidemics::vaccination( + name = "vaccinate early", + time_begin = matrix(early_start, nrow(contact_matrix)), + time_end = matrix(early_start + duration, nrow(contact_matrix)), + nu = matrix(c(0.01, 0.01, 0.01)) +) + +# npis only (early) +output_npi_early <- epidemics::model_default( + population = uk_population, + transmission_rate = transmission_rate, + infectiousness_rate = infectiousness_rate, + recovery_rate = recovery_rate, + intervention = list(contacts = close_schools_early), + time_end = time_end, increment = 1.0 +) + +# vaccination only (early) +output_vacc_early <- epidemics::model_default( + population = uk_population, + transmission_rate = transmission_rate, + infectiousness_rate = infectiousness_rate, + recovery_rate = recovery_rate, + vaccination = vacc_early, + time_end = time_end, increment = 1.0 +) + +# vaccination only (late) +output_vacc_late <- epidemics::model_default( + population = uk_population, + transmission_rate = transmission_rate, + infectiousness_rate = infectiousness_rate, + recovery_rate = recovery_rate, + vaccination = vacc_late, + time_end = time_end, increment = 1.0 +) + +output_npi_early_vacc_late$intervention_type <- "early npi, late vacc" +output_npi_early$intervention_type <- "early npi" +output_vacc_early$intervention_type <- "early vacc" +output_vacc_late$intervention_type <- "late vacc" + +output <- rbind(output_baseline, output_vacc_late, + output_vacc_early, output_npi_early, + output_npi_early_vacc_late) +``` + +Mise en œuvre précoce des NPI (`early npi`) retarde le moment du pic de personnes infectieuses mais ne diminue pas beaucoup l'ampleur de la maladie une fois que la mesure est levée. La mise en œuvre précoce du vaccin (`early vacc`) est la mesure la plus efficace pour réduire le nombre maximal de personnes infectées, car elle réduit la taille du groupe sensible au lieu d'éloigner temporairement les infections de ce groupe. La mise en place d'une IPV avant la mise en œuvre du vaccin (`early npi, late vacc`) est plus efficace que la mise en œuvre tardive du vaccin (`late vacc`). + +```{r, echo=FALSE} +output %>% + filter(compartment == "infectious") %>% + ggplot() + + aes( + x = time, + y = value, + color = intervention_type, + linetype = intervention_type + ) + + stat_summary( + fun = "sum", + geom = "line", + linewidth = 1 + ) + + scale_y_continuous( + labels = scales::comma + ) + + geom_vline( + xintercept = c( + early_start, + early_start + duration + ), + linetype = 2 + ) + + geom_vline( + xintercept = c( + late_start, + late_start + duration + ), + linetype = 3 + ) + + theme_bw() + + labs( + x = "Simulation time (days)", + y = "Individuals" + ) +``` + +::::::::::::::::::::::::::::::::::::: challenge + +## Lever les mesures NPI + +Étudiez l'impact de la levée de l'IPN après la mise en œuvre du vaccin. Adaptez le code ci-dessous pour relever le NPI après 20, 50 et 100 jours. + +:::::::::::::::::::::::: solution + +## Sortie + +```{r} +duration_20 <- 20 +duration_50 <- 50 + +close_schools_early_20 <- epidemics::intervention( + name = "School closure", + type = "contacts", + time_begin = early_start, + time_end = early_start + duration_20, + reduction = matrix(c(0.5, 0.01, 0.01)) +) + +close_schools_early_50 <- epidemics::intervention( + name = "School closure", + type = "contacts", + time_begin = early_start, + time_end = early_start + duration_50, + reduction = matrix(c(0.5, 0.01, 0.01)) +) + +output_npi_early_vacc_late_20 <- epidemics::model_default( + population = uk_population, + transmission_rate = transmission_rate, + infectiousness_rate = infectiousness_rate, + recovery_rate = recovery_rate, + vaccination = vacc_late, + intervention = list(contacts = close_schools_early_20), + time_end = 300, increment = 1.0 +) + +output_npi_early_vacc_late_50 <- epidemics::model_default( + population = uk_population, + transmission_rate = transmission_rate, + infectiousness_rate = infectiousness_rate, + recovery_rate = recovery_rate, + vaccination = vacc_late, + intervention = list(contacts = close_schools_early_50), + time_end = 300, increment = 1.0 +) + +output_npi_early_vacc_late_20$intervention_type <- "20 days" +output_npi_early_vacc_late_50$intervention_type <- "50 days" +output_npi_early_vacc_late$intervention_type <- "100 days" + +output_npis <- rbind(output_npi_early_vacc_late_20, + output_npi_early_vacc_late_50, + output_npi_early_vacc_late) + +output_npis %>% + filter(compartment == "infectious") %>% + ggplot() + + aes( + x = time, + y = value, + color = intervention_type, + linetype = intervention_type + ) + + stat_summary( + fun = "sum", + geom = "line", + linewidth = 1 + ) + + scale_y_continuous( + labels = scales::comma + ) + + geom_vline( + xintercept = c( + early_start, + early_start + duration + ), + linetype = 2 + ) + + geom_vline( + xintercept = c( + late_start, + late_start + duration + ), + linetype = 3 + ) + + theme_bw() + + labs( + x = "Simulation time (days)", + y = "Individuals" + ) +``` + +::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::: + +## Résumé + +En utilisant des trajectoires de maladies générées par des modèles, nous avons étudié l'impact potentiel de différentes stratégies de vaccination. Lorsque l'infection présente un risque spécifique à un groupe, les programmes de vaccination ciblés peuvent être plus efficaces pour réduire le pic épidémique. Les IPV peuvent être utilisés parallèlement au développement de vaccins pour retarder les pics épidémiques avant que les vaccins ne soient facilement disponibles. + +Nous avons utilisé un modèle SEIR avec une classe de vaccination, mais si nous modélisions l'immunité à l'infection +nous pourrions étudier l'impact d'un programme de vaccination s'il était mis en œuvre très tard dans l'épidémie (c'est-à-dire après que l'immunité post-infectieuse se soit accumulée). Voir par exemple, [Baguelin et al. 2010](https://doi.org/10.1016/j.vaccine.2010.01.002) + +Dans ce tutoriel, nous avons étudié l'effet potentiel des vaccins bloquant l'infection, mais nous pouvons utiliser des modèles pour explorer d'autres effets des vaccins, y compris les vaccins imparfaits. Les trajectoires de la maladie générées dans ce tutoriel peuvent être utilisées pour calculer des mesures telles que [les AVCI](../learners/reference.md#dalys) évitées dans le cadre d'analyses économiques de la santé. + +::::::::::::::::::::::::::::::::::::: keypoints + +- L'immunité du troupeau est un effet indirect des programmes de vaccination +- Les programmes de vaccination ciblés présentent des avantages en cas d'hétérogénéité des contacts. +- Le calendrier de mise en œuvre des programmes de vaccination et des IPV peut entraîner des trajectoires très différentes de la maladie. + +:::::::::::::::::::::::::::::::::::::::::::::::: + + diff --git a/locale/fr/learners/BF_measles.Rmd b/locale/fr/learners/BF_measles.Rmd new file mode 100644 index 0000000..09cc8a8 --- /dev/null +++ b/locale/fr/learners/BF_measles.Rmd @@ -0,0 +1,888 @@ +--- +title: Introduction à la modélisation mathématique des maladies infectieuses +fig_caption: true +code_folding: show +--- + +# Préface + +Ce document est préparé pour les participants au cours Outbreak Analytics in R, +organisé par l'équipe Epiverse-TRACE. Il a pour but de fournir une +une introduction concise à la théorie mathématique qui sous-tend la modélisation des épidémies infectieuses. +Nous utiliserons le modèle Susceptible, Exposé, Infecté et Récupéré (**SEIR**), +applicable à des maladies telles que la rougeole, les oreillons et la rubéole, par exemple. + +# Scénario + +Supposons qu'une nouvelle infection ait été détectée dans une communauté fermée de +$\mathbf{N}$ individus, l'infection ayant été diagnostiquée chez un seul d'entre eux. +individu. Les autres $\mathbf{N-1}$ individus sont tous exposés au risque de +de contracter l'infection et sont considérés comme sensibles ($\mathbf{S}$). Un +personne infectée fabrique des $k$ contacts et a une probabilité $p$ d'infecter +chacun d'entre eux s'il est sensible, et nous pouvons appeler cela $\beta$ en abrégé. Il s'agit du taux moyen auquel +un individu infecté peut transmettre l'infection à un individu sensible. +sensible. + +Selon la nature de la maladie, un individu nouvellement infecté peut prendre +un certain temps avant de présenter des symptômes, ce que l'on appelle la période d'incubation (temps écoulé entre l'infection et l'apparition des symptômes). +symptômes), et un certain temps pour devenir infectieux, appelé période de latence (temps écoulé entre l'infection et les symptômes), et un certain temps pour devenir infectieux, appelé période de latence. +l'infection à la contagiosité). La période de latence est importante pour les modèles de type SEIR. +Les personnes sensibles qui entrent en contact avec une personne infectée par le virus de l'immunodéficience humaine (VIH) ont une période de latence de trois mois. +et contractent l'infection passent d'abord par un état intermédiaire +appelé "exposé" ($\mathbf{E}$). Là, ils passent en moyenne +$\frac{1}{\alpha}$ unités de temps (la période de latence) et se déplacent ensuite vers +la classe infectée ($\mathbf{I}$) à un rythme constant $\alpha$. Les classes +sont retirés (soit par guérison, soit par mort) de la population de l $I$ à un +taux constant $\gamma$ avec $\frac{1}{\gamma}$ représentant la moyenne des +durée de récupération. Une fois rétablis, ils acquièrent une immunité à vie contre les maladies suivantes +l'infection en cours, ce qui signifie qu'ils ne seront plus jamais sensibles, et +ils passent dans la classe des personnes guéries ($\mathbf{R}$) (voir +[Figure 1](#fig-seir)). Il s'agit d'hypothèses à des fins de modélisation et +ne reflètent pas nécessairement les processus biologiques sous-jacents. + +![](fig/t0.drawio.png){ref-parent="fig-seir"} +![](fig/t1.drawio.png){ref-parent="fig-seir"} +![](fig/t2.drawio.png){ref-parent="fig-seir"} +![](fig/t3.drawio.png){ref-parent="fig-seir"} + +Les quatre classes S-E-I-R considérées dans l'étude de la $\mathbf{SEIR}$ modèle. +Le nombre d'individus dans chaque +changent au fil du temps et sont donc des fonctions du temps $t$ et +la population totale à tout moment $t$ est +$N(t)= S(t) + E(t) + I(t)+ R(t)$. Les taux de variation entre ces +Les taux de changement entre ces classes sont saisis mathématiquement par quatre équations différentielles +comme suit : + +[$$ +\begin{eqnarray} +\frac{dS}{dt} &=& -\beta \frac{S.I}{N} & & \ +\frac{dE}{dt} &=&\beta \frac{S.I}{N} &-& \alpha E\ +\frac{dI}{dt} &=& \alpha E &-& \gamma I \ +\frac{dR}{dt} &=& \gamma I & &\ +\end{eqnarray} +\qquad(1)$$]{#eq-s1} + +Au moment $t_0=0$ nous supposons qu'il y a une personne infectée ($\mathbf{I}_0 =1$) ; +aucune personne exposée ($\mathbf{E}_0 = 0$) ou de récupération ($\mathbf{R}_0 = 0$). et pendant que +tous les autres individus restent sensibles +($\mathbf{S}_0= \mathbf{N} -\mathbf{I}_0 = \mathbf{N} -1$). C'est ce que l'on appelle les valeurs initiales du système +en [Équation 1](#eq-s1). + +Comme les compartiments représentent des individus, leur +valeurs doivent toujours être non négatives. Cette caractéristique est appelée +la positivité de la solution. +Avant d'entrer dans les détails mathématiques de la résolution d'un problème de +[l'équation 1](#eq-s1) quelques observations essentielles peuvent être faites : + +1. Au début d'une épidémie, le nombre d'individus susceptibles d'être infectés par le virus de l'immunodéficience humaine (VIH) est très élevé. + commence à diminuer de manière exponentielle, tandis que le nombre d'individus exposés et de + infectieux augmente. Au fur et à mesure que l'épidémie progresse, le + la population sensible s'épuise, et les individus exposés et infectieux + infectieux atteignent leur maximum avant de commencer à décliner. + Pendant ce temps, le nombre de personnes guéries continue d'augmenter + sans diminuer. (Notez que ces observations ne sont valables que lorsque + $\mathcal{R}_0 > 1$ comme nous le verrons plus loin dans ce document). + +2. L'infection ne commencera à se propager dans la communauté que lorsque $\frac{\mathbf{dE}}{dt} > 0$ + ou $\frac{\mathbf{dI}}{dt} > 0$ et en prenant les valeurs de ces deux + de [équation 1](#eq-s1) conduit à + +[$$ +\begin{eqnarray} +\beta .\frac{S.I}{N} &-& \alpha .E > 0\ +\alpha. E &-& \gamma .I > 0. +\end{eqnarray} +\qquad(2)$$]{#eq-s2} + +En ajoutant les deux équations en [Équation 2](#eq-s2) donne +$\frac{\beta}{\gamma} > \frac{\mathbf{N}}{\mathbf{S}}$. Au moment $t=0$, +nous avons $\mathbf{S} = \mathbf{N}-1 \approx \mathbf{N}$. Par conséquent, le +décollera si $\frac{\beta}{\gamma} > 1$. Il s'agit d'une +intéressante -- Elle indique que l'épidémie augmente si les nouvelles infections +sont générées à un rythme plus élevé que les infections existantes ne se rétablissent. + +3. Le ratio $\frac{\beta}{\gamma}$ représente la reproduction de base + de base, $\mathcal{R}_0$ qui est défini comme le nombre moyen de + nouvelles infections causées par un seul individu infecté dans un pays entièrement + totalement sensible. Intuitivement, $\beta$ ne décrit à lui seul que le taux + de nouvelles infections, sans tenir compte de la durée de vie de chaque individu infecté. + contribue à la transmission. En tenant compte de la période infectieuse + $\frac{1}{\gamma}$ nous obtenons une mesure complète de chaque + l'impact de chaque individu infecté sur la transmission pendant toute la durée de la contagion. $\mathcal{R}_0$ est une mesure cruciale pour l'évaluation de l'impact de l'infection sur la transmission. + pour comprendre la transmissibilité d'une maladie infectieuse. A + valeur élevée de $\mathcal{R}_0$ indique une maladie infectieuse plus transmissible. + transmissible. + +4. La taille finale d'une épidémie, c'est-à-dire le nombre total d'individus qui seront infectés par la maladie, est déterminée en fonction de l'âge et du sexe de l'individu. + seront finalement infectés - est le nombre cumulé d'infections en tant que + prédit par le modèle. Cependant, si seul le $\mathcal{R}_0$ est connu, il + peut encore fournir des indications sur la taille finale de l'épidémie par le biais de + l'équation suivante : + +[$$ +\begin{equation} +z = 1 - e^{-\mathcal{R}_0 .z} +\end{equation} +\qquad(3)$$]{#eq-fs} + +Où : + +- $z$ est la taille finale (la fraction de la population infectée), + +- $\mathcal{R}_0$ est le nombre de reproduction de base, et + +- $e$ est la base du logarithme naturel. + +Pour une dérivation détaillée et des informations théoriques sur l'équation de la taille finale, +veuillez vous référer à [cet article](https://epiverse-trace.github.io/finalsize/articles/theoretical_background.html). + +5. En outre, le numéro de reproduction de base $\mathcal{R}_0$ est + crucial pour déterminer le seuil d'immunité du troupeau (TIS), qui + représente la proportion minimale de la population qui doit être immunisée. + être immunisée (soit par la vaccination, soit par une infection antérieure) pour + pour contenir l'épidémie et empêcher une transmission à grande échelle. Le taux d'immunité de la + formule du seuil d'immunité collective est la suivante : + [$$ HIT = 1 - \frac{1}{\mathcal{R}_0} \qquad(4)$$] {#eq-hit} + +Où : + +- HIT est la proportion de la population qui doit être immunisée contre les maladies infectieuses. + pour atteindre l'immunité de groupe, + +En tant que $\mathcal{R}_0$ augmente, le seuil d'immunité du troupeau augmente également +augmente, ce qui signifie qu'une plus grande proportion de la population doit être immunisée. +pour empêcher l'épidémie de se propager. + +Pour comprendre la logique de la formule HIT, notez qu'au fur et à mesure que le temps passe, +l'immunité se développe dans la population. Cela réduit le nombre de personnes susceptibles d'être infectées. +de personnes sensibles, ce qui diminue le nombre réel de cas secondaires qu'un pays est en droit d'attendre. +une personne infectée typique peut produire. Ce nombre est appelé le taux d'efficacité de l'infection. +nombre de reproduction efficace ($\mathcal{R}_{eff}$), et il est donné par la formule suivante + +$$ \mathcal{R}_{eff} = \mathcal{R}_0 \times \mathbf{S}.$$ + +Pour qu'une épidémie cesse de se propager, chaque personne infectée doit, en moyenne, +infecter moins d'une autre personne, ce qui signifie que nous avons besoin de $\mathcal{R}<1$. +Cette condition conduit à : + +$$\mathbf{S} < \frac{1}{\mathcal{R}_0}$$ + +Ainsi, si nous pouvons réduire la proportion sensible $\mathbf{S}$ en dessous de +$\frac{1}{\mathcal{R}_0}$ le nombre de reproduction effectif $\mathcal{R}_{eff}$ +tombe en dessous de 1, ce qui entraîne l'arrêt de la croissance moyenne de l'épidémie. + +# Épidémie de rougeole au Burkina Faso + +## Contexte + +La rougeole est une maladie virale très contagieuse qui se propage rapidement, +en particulier dans les environnements où les gens vivent ou se rassemblent à proximité les uns des autres. +comme les écoles, les établissements de santé ou les zones densément peuplées. +densément peuplées. La transmission se fait par l'intermédiaire de gouttelettes respiratoires lorsqu'un +une personne infectée tousse ou éternue, et le virus peut rester viable dans l'air ambiant. +dans l'air jusqu'à deux heures. Des vaccins efficaces sont disponibles, offrant +une efficacité de 93 % à 97 % ([À propos de la rougeole, CDC](https://www.cdc.gov/measles/about/index.html)), ce qui fait de la vaccination un outil clé dans la lutte contre la +les épidémies de rougeole. + +Compte tenu de la grande transmissibilité du virus, même un seul cas de rougeole introduit dans l'Union européenne peut être considéré comme une menace pour la santé publique. +peut déclencher d'importantes épidémies, en particulier dans les régions où le taux de vaccination est faible. +faible. La période de latence (pré-infectieuse) de la rougeole est de +est généralement d'environ 8 jours, tandis que la période infectieuse est en moyenne de 5 jours ([Masters et al, 2023](https://www.thelancet.com/journals/lanpub/article/PIIS2468-2667\(23\)00130-5/fulltext)). Le modèle SEIR en +[l'équation 1](#eq-s1) peut être utilisé pour simuler le +dynamique des épidémies de rougeole et d'évaluer les mesures de contrôle telles que les mesures de lutte contre la rougeole. +la vaccination. + +## Situation du Burkina Faso en janvier 2024 + +Le Burkina Faso est confronté à des problèmes récurrents +récurrentes de rougeole. Cette situation peut être attribuée à des facteurs tels que l'insuffisance des +l'accès aux soins de santé, une couverture vaccinale insuffisante et une +systèmes de santé fragiles. En 2023, le Burkina Faso a connu un taux de mortalité particulièrement élevé. +particulièrement grave, avec plus de 2 000 cas suspects signalés +([Crisis24, 2024](https://crisis24.garda.com/alerts/2024/02/burkina-faso-elevated-measles-activity-reported-in-multiple-areas-in-february)), +les autorités sanitaires et les organisations internationales à intensifier leur action. +campagnes de vaccination pour tenter d'enrayer la propagation de la maladie. +([Save the Children, 2024](https://www.savethechildren.net/news/burkina-faso-over-2000-children-diagnosed-suspected-measles-nationwide-outbreak); [Le Câble, 2024](https://www.thecable.ng/burkina-faso-records-2000-suspected-cases-as-country-battles-measles-outbreak/)). + +Nous simulerons l'épidémie de rougeole au Burkina Faso à l'aide du SEIR +en [Équation 1](#eq-s1). Cela nous permettra de +d'explorer la dynamique de l'épidémie avec et sans intervention. Pour ce faire, le +nous utiliserons l'outil **R** et le paquetage `{epidemics}` qui est conçu pour +pour modéliser la propagation des maladies infectieuses. Dans ces simulations, nous nous concentrerons sur +spécifiquement sur le nombre d'infections, qui représente un sous-ensemble de l'ensemble des cas suspects déclarés. + +## Modèle de base + +**Hypothèses et paramètres du modèle** + +1. **Population totale** La population du Burkina Faso est de + d'environ $N\approx 22.67$ millions d'habitants. + +2. **Structure de la population**: + + - **Pas de stratification par âge** La stratification par âge : Supposez que la population est homogène + par rapport à l'âge. Cela signifie que tous les individus, quel que soit + l'âge, ont la même susceptibilité à la rougeole et contribuent à la propagation de la maladie. + à la dynamique de transmission. + +3. **Conditions initiales**: + + - Un seul cas infectieux est introduit dans la population : + $I_0 = 1$. + - L'ensemble de la population, à l'exception de ce cas, est initialement + sensible : $S_0 = N - 1$. Ce cas + Cette hypothèse simplifie le modèle et nous permet d'explorer la propagation de l'épidémie. + l'infection en l'absence d'immunité. Bien que les populations réelles + ont une certaine immunité due à la vaccination ou à une infection antérieure. + - Aucun individu n'est au stade exposé au départ : $E_0 = 0$. + - Aucun individu ne s'est rétabli : $R_0 = 0$. + +4. **Période de latence** La période de latence moyenne de la rougeole est de + d'environ 8 jours (le temps écoulé entre l'exposition et le début de la + infectieuse), de sorte que le taux de transition entre l'exposition et l'infectiosité est d'environ 1,5 million d'euros. + est donc de : $\alpha = \frac{1}{8}$. + +5. **Période infectieuse** Période infectieuse : La période infectieuse moyenne est de 5 + jours, ce qui signifie que le taux de guérison est de : $\gamma = \frac{1}{5}$. + +6. **Numéro de reproduction de base** $\mathcal{R}_0$: + + - $\mathcal{R}_0 =15$. Pour la rougeole, cette valeur est généralement comprise entre + de 12 à 18, voire plus [Fiona, et al](https://www.thelancet.com/journals/laninf/article/PIIS1473-3099\(17\)30307-9/abstract). + - Le taux de transmission est donc de + $\beta = \mathcal{R}_0 \gamma = 3$\-- ce qui signifie que chaque individu infectieux provoque 3 nouvelles infections + par jour dans une population totalement sensible. + +En appliquant ces hypothèses et paramètres à l +[l'équation 1](#eq-s1) nous pouvons simuler le potentiel +de l'épidémie de rougeole à l'aide de la syntaxe fournie par l'Agence européenne pour la sécurité et la santé au travail. +{epidemics} comme le montre le morceau de code ci-dessous. + +```{r, warning=FALSE, message=FALSE} +# Loading libraries +library(dplyr) +library(ggplot2) +library(epidemics) +``` + +```{r} +# Define the population structure for Burkina Faso +bfaso <- epidemics::population( + name = "Burkina Faso", + contact_matrix = matrix(1), # Well-mixed population + demography_vector = 22.67e6, # Population size + # Initial conditions: Susceptible, exposed, Infectious, vaccinated, recovered + initial_conditions = matrix( + c(1 - 1 / 22.67e6, 1 / 22.67e6, 0, 0, 0), + nrow = 1, ncol = 5 + ) +) + +# Run the SEIR model simulation +output <- epidemics::model_default( + population = bfaso, + transmission_rate = 15 / 5, # R0/infectious period = 15/5 = 3 + infectiousness_rate = 1 / 8, # 1/latent period (pre-infectious phase) + recovery_rate = 1 / 5, # 1/infectious period + time_end = 120, # Simulation over 120 days + increment = 1 # Daily increments +) + +# Plot the epidemic curve for susceptible, exposed, infectious, and recovered +output %>% + filter(compartment %in% c("exposed", "infectious")) %>% + ggplot(aes( + x = time, + y = value / 10^6, # Scale to millions + col = compartment, + linetype = compartment + )) + + geom_line(linewidth = 1.5) + + theme_bw() + + theme( + legend.position = "top" + ) + + labs( + x = "Simulation Time (days)", + y = "Individuals (in millions)", + caption = expression( + paste( + "The dynamics of SEIR model with ", + italic(R)[0], "= 15, ", + "showing the trajectories of number of exposed and infected individuals" + ) + ) + ) +``` + +## Taille prévue de l'épidémie et immunité du troupeau + +L'immunité `{finalsize}` met en œuvre +[Equation 3](#eq-fs) pour calculer la proportion attendue +de la population qui sera infectée compte tenu d'un niveau de base spécifié. +de reproduction de base $(\mathcal{R}_0)$. Le calcul peut être effectué comme suit +comme suit : + +```{r} +finalsize::final_size(r0 = 10) +``` + +Pour $\mathcal{R}_0 \geq 10$ les résultats indiquent que la quasi-totalité des +devrait être infectée par la rougeole. Les $HIT$ nécessaires pour +d'endiguer l'épidémie est d'environ $93%$ en utilisant la formule donnée dans +[équation 4](#eq-hit). + +# Modèle structuré par âge + +La structure par âge du Burkina Faso est caractéristique d'un pays jeune. +avec une majorité de la population âgée de moins de 25 ans. +Selon des estimations récentes ([Nations unies, 2023](https://population.un.org/wpp/); +[Agence centrale de renseignements, 2023](https://www.cia.gov/the-world-factbook/countries/burkina-faso/); +[Banque mondiale, 2023](https://data.worldbank.org/indicator/SP.POP.TOTL?locations=BF)), la structure par âge +se décompose comme suit : + +- $[0\to15)$ ans : ~ 44 (43-45) % de la population +- $[15\to 25)$ ans : ~19.5 (19-20)% +- $[25\to 55)$ ans : ~29 (28-30)% +- $[55\to 65)$ ans : ~5 (3-5)% +- $65+$ années : ~2,5 (2-3)% + +## **Contact Matrix** + +Une matrice de contacts se compose généralement de lignes et de colonnes représentant +différents groupes d'âge, où chaque cellule indique le nombre moyen de contacts. +contacts entre les individus du groupe d'âge correspondant à cette ligne +et à la colonne. + +Bien que nous n'ayons pas d'accès direct à la matrice des contacts pour le Burkina +Faso, nous pouvons recourir à une matrice de contact hypothétique basée sur des données générales. +sur des hypothèses générales concernant des taux de contact élevés parmi les populations jeunes et des taux de contact plus faibles parmi les populations âgées. +plus faibles dans les groupes d'âge plus avancés : + +*** + +``` + **\[0-15)** **\[15-25)** **\[25-54)** **\[55-65)** **65+** +``` + +*** + +**\[0-15)** 20 10 5 2 1 + +**\[15-25)** 10 15 10 4 2 + +**\[25-55)** 5 10 15 6 3 + +**\[55-65)** 2 4 6 10 5 + +## **$65+$** 1 2 3 5 10 + + Tableau : Tableau pour un **hypothétique** moyenne des contacts entre différents âges +dans la population du Burkina Faso. + +```{r} +# Initial conditions: one in every 1 million is infected +bf_pop <- 22.67e6 +contact_matrix <- matrix( + c( + 20, 10, 5, 2, 1, # Contacts from 0-14 years + 10, 15, 10, 4, 2, # Contacts from 15-24 years + 5, 10, 15, 6, 3, # Contacts from 25-54 years + 2, 4, 6, 10, 5, # Contacts from 55-64 years + 1, 2, 3, 5, 10 + ), # Contacts from 65+ years + nrow = 5, # Number of rows + byrow = TRUE, # Fill the matrix by rows + dimnames = list( + c("[0-15)", "[15-25)", "[25-55)", "[55-65)", "65+"), + c("[0-15)", "[15-25)", "[25-55)", "[55-65)", "65+") + ) +) +# Define the demography vector for Burkina Faso +demography_vector <- c(0.44, 0.195, 0.29, 0.05, 0.025) * bf_pop +names(demography_vector) <- rownames(contact_matrix) + +demography_vector +``` + +```{r} +# scale the contact matrix so the largest eigenvalue is 1.0 +# this is to ensure that the overall epidemic dynamics correctly reflect +# the assumed value of R0 +contact_matrix <- contact_matrix / max(Re(eigen(contact_matrix)$values)) + +# divide each row of the contact matrix by the corresponding demography +# this reflects the assumption that each individual in group {j} make contacts +# at random with individuals in group {i} +contact_matrix <- contact_matrix / demography_vector + +# Print the contact matrix +# contact_matrix + +# Define the population structure for Burkina Faso +initial_i <- 1 / bf_pop +initial_conditions <- c(S = 1 - initial_i, E = 0, I = initial_i, R = 0, V = 0) + +# Replicate initial conditions for all age groups +initial_conditions_matrix <- rbind( + initial_conditions, + initial_conditions, + initial_conditions, + initial_conditions, + initial_conditions +) + +rownames(initial_conditions_matrix) <- rownames(contact_matrix) + +# Print the initial conditions +# initial_conditions_matrix + +# Create the population object +bf_population <- epidemics::population( + name = "Burkina Faso", + contact_matrix = contact_matrix, + demography_vector = demography_vector, + initial_conditions = initial_conditions_matrix +) + +# Print the population object +# bf_population +``` + +```{r} +# Run the epidemic model +output1 <- epidemics::model_default( + population = bf_population, + transmission_rate = 15 / 5, # R0/infectious period = 15/5 = 3 + infectiousness_rate = 1 / 8, # 1/latent period (pre-infectious phase) + recovery_rate = 1 / 5, # 1/infectious period + time_end = 120, # Simulation over 120 days + increment = 1 # Daily increments +) + +# Plot the epidemic curve +output1 %>% + filter(compartment %in% c("exposed", "infectious")) %>% + ggplot(aes( + x = time, + y = value, + col = demography_group, + linetype = compartment + )) + + geom_line(linewidth = 1.2) + + scale_y_continuous(labels = scales::comma) + + scale_colour_brewer(palette = "Dark2", name = "Age group") + + expand_limits(y = c(0, 500e3)) + + coord_cartesian(expand = FALSE) + + theme_bw() + + theme( + legend.position = "top", + legend.text = element_text(size = 10, hjust = 0, lineheight = 121) + ) + + labs( + x = "Simulation time (days)", + linetype = "Compartment", + y = "Individuals", + caption = + expression( + paste( + "SEIR model showing the trajectories of the number of ", + "exposed and infected individuals ", + italic(R)[0], " = 15 for different age groups." + ) + ) + ) + + guides( + color = guide_legend(nrow = 2) + ) +``` + +## Nombre effectif de reproduction ($\mathcal{R}_{eff}$) + +Les modèles structurés par âge tiennent compte des caractéristiques hétérogènes de la population. +population, telles que : + +- les différences démographiques dans les contacts sociaux, +- Variations dans la distribution démographique, et +- les différences de susceptibilité à l'infection. + +*Ces facteurs se traduisent par des différences de $.\mathcal{R}0$ values for each age +différents. Les **nombre effectif de reproduction*** $\mathcal{R}{eff}$ +représente l'indice de reproduction global pour tous les groupes d'âge, tandis que +en tenant compte de ces différences. Il est calculé à l'aide de la formule suivante +formule suivante : + +[$$ +\begin{equation} +\mathcal{R}_{eff} = \rho(C) \lambda \gamma +\end{equation} +\qquad(5)$$]{#eq-reff} + +Où : + +- $\rho(C)$ est le **la plus grande valeur propre** de la matrice de contact $C$, + qui est dérivée des schémas de contacts sociaux, échelonnée par l'indice + distribution de la population à travers différents groupes démographiques et + groupes de susceptibilité. + +- $\lambda$ est le **force de l'infection** qui mesure le taux de + les personnes sensibles sont infectées. Elle se distingue de la + le taux de transmission effectif, souvent désigné par $\beta$. + +- $\gamma$ représente le **période infectieuse** qui est la moyenne + durée moyenne pendant laquelle un individu reste infectieux. + +La durée `{finalsize}`met en œuvre +[Equation 5](#eq-reff) et nous pouvons l'utiliser pour calculer la +$\mathcal{R}_{eff}$ pour notre modèle structuré par âge, comme suit : + +```{r} +r0 <- 15 # basic reproduction number + +# define the number of age and susceptibility groups +n_demo_grps <- length(demography_vector) +n_risk_grps <- 5 + +# In this example, risk varies across groups +susceptibility <- matrix( + data = c(0.80, 0.5, 0.3, 0.2, 0.1), nrow = n_demo_grps, ncol = n_risk_grps +) + +# risk does not vary within groups +p_susceptibility <- matrix( + data = 1, nrow = n_demo_grps, ncol = n_risk_grps +) + +# p_susceptibility rows must sum to 1.0 +p_susceptibility <- p_susceptibility / rowSums(p_susceptibility) + + +reff <- finalsize::r_eff( + r0 = r0, + contact_matrix = contact_matrix, + demography_vector = demography_vector, + susceptibility = susceptibility, + p_susceptibility = p_susceptibility +) + +reff +``` + +::: {.alert .alert-secondary} + +### Question + +$\mathcal{R}_{eff}$ vs $\\mathcal{R}*0$ : Quelle est la différence entre la $\\mathcal{R}*{eff} Valeur en $ de $\mathcal{R}_0$? +::: + +$\mathcal{R}_{eff}$ reflète plus fidèlement la transmission +car elle tient compte à la fois de la transmissibilité inhérente à l'agent pathogène et de la sensibilité réelle de la population. + +# Modèles d'intervention + +Les interventions contre la rougeole comprennent la prévention, le contrôle et la lutte contre la maladie. +le traitement. Pour enrayer la propagation de la maladie, il faut combiner les mesures suivantes +de santé publique, telles que la réduction des contacts (par exemple, le couvre-feu et la fermeture des écoles dans les pays de l'Union européenne). +[Samoa](https://en.wikipedia.org/wiki/2019_Samoa_measles_outbreak)), +et la vaccination. Dans cette section, nous simulerons +le modèle SEIR avec des interventions à l'aide de la `{epidemics}` paquet. + +## Modèle de réduction des contacts + +La réduction des contacts d'un certain pourcentage a un impact sur la +taux de transmission. Cette réduction peut être obtenue par +mesures telles que la quarantaine, la limitation des rassemblements publics et l'utilisation régulière de l'ordinateur. +dépistage régulier dans les établissements de santé. L'inclusion de ces interventions dans le +modèle SEIR de base, le `{epidemics}` fournit un objet appelé +`interventions` qui est ajouté à la définition du modèle, comme le montre la figure ci-dessous. +ci-dessous. +Nous supposons qu'une fermeture d'école réduira la fréquence des contacts au sein des différents groupes d'âge et entre eux. Nous supposons que les fermetures d'écoles réduiront de 0,5 les contacts entre les enfants d'âge scolaire (âgés de 0 à 15 ans) et entraîneront une légère réduction (0,01) des contacts entre les adultes (âgés de 15 ans et plus). + +```{r} +reduced_contacts <- epidemics::intervention( + name = "school closure", + type = "contacts", + time_begin = 30, + time_end = 30 + 60, + reduction = matrix(c(0.5, 0.01, 0.01, 0.01, 0.01)) +) + +# Run the epidemic model +output2 <- epidemics::model_default( + population = bf_population, + transmission_rate = 15 / 5, # R0/infectious period = 15/5 = 3 + infectiousness_rate = 1 / 8, # 1/latent period (pre-infectious phase) + recovery_rate = 1 / 5, # 1/infectious period + intervention = list(contacts = reduced_contacts), + time_end = 120, # Number of days to simulate + increment = 1 # Daily increments +) +``` + +Examiner l'effet de la mise en œuvre d'une réduction des contacts sur +sur le nombre quotidien de nouvelles infections, nous représentons graphiquement les résultats des deux +modèles. + +```{r} +# Extract new infections data for each scenario +data_baseline <- epidemics::new_infections(output1, by_group = TRUE) +data_reduced <- epidemics::new_infections(output2, by_group = TRUE) + +# Assign scenario names +data_baseline$scenario <- "Baseline" +data_reduced$scenario <- "Reduced Contact" + +# Combine the data from both scenarios +data_combined <- bind_rows(data_baseline, data_reduced) + +# Plot new infections over time with scenario and demographic groups +ggplot(data_combined) + + geom_line( + aes( + x = time, y = new_infections, + col = demography_group, linetype = scenario + ) + ) + + # Set axis scaling and formatting + scale_y_continuous(labels = scales::comma) + + scale_linetype_manual( + name = "Scenario", + values = c( + Baseline = "dashed", + "Reduced Contact" = "solid" + ) + ) + + scale_colour_brewer( + palette = "Dark2", + name = "Age Group" + ) + + expand_limits(y = c(0, 1e3)) + + coord_cartesian(expand = FALSE) + + theme_bw() + + theme( + legend.position = "top" + ) + + labs( + x = "Simulation Time (days)", + y = "New Infections", + linetype = "Scenario", + caption = + expression( + paste( + "New infections under baseline and reduced transmission rate (", + beta, + ") for different age groups." + ) + ) + ) + + # Adjust legend display to fit in two rows + guides( + color = guide_legend(nrow = 2) + ) +``` + +## Modèle de vaccination + +Il existe un vaccin efficace contre la rougeole, connue sous le nom de rougeole, oreillons, +et la rubéole (ROR), et de nombreux pays, y compris l'Allemagne, l'Italie et la France, ont mis au point un vaccin efficace contre la rougeole. +[le Burkina Faso](https://www.unicef.org/media/155306/file/Burkina-Faso-Humanitarian-SitRep-31-March-2024.pdf), +l'incorpore dans son programme de formation. +stratégie nationale d'immunisation. L'effet de la vaccination par +ROR varie légèrement en fonction du taux de vaccination par âge auquel il est administré. +administré et du nombre de doses reçues. Par exemple, disons que le vaccin ROR à 2 doses +à 2 doses est d'environ $0.01$, $0.02$, $0.03$, $0.04$ et +$0.05$ pour les groupes d'âge $[0\to 15)$, $[15\to 25)$, $[25\to 55)$, +$[55\to 65)$ et $65+$ respectivement. Les `{epidemics}` permet à +l'incorporation des interventions de vaccination dans la modélisation, en tant que +comme le montre le morceau de code ci-dessous. + +```{r} +vaccinate_elders <- epidemics::vaccination( + name = "Vaccination compaign", + time_begin = matrix(30, nrow(contact_matrix)), + time_end = matrix(90, nrow(contact_matrix)), + nu = matrix(c(0.01, 0.02, 0.03, 0.04, 0.05)) +) + +# Run the epidemic model +output3 <- epidemics::model_default( + population = bf_population, + transmission_rate = 15 / 5, # R0/infectious period = 15/5 = 3 + infectiousness_rate = 1 / 8, # 1/latent period (pre-infectious phase) + recovery_rate = 1 / 5, # 1/infectious period + vaccination = vaccinate_elders, + time_end = 120, # Simulation over 120 days + increment = 1 # Daily increments +) + +# Plot the epidemic curve +output3 %>% + filter(compartment %in% c("exposed", "infectious")) %>% + ggplot(aes( + x = time, + y = value, + col = demography_group, + linetype = compartment + )) + + geom_line(linewidth = 1.2) + + scale_y_continuous(labels = scales::comma) + + scale_colour_brewer(palette = "Dark2", name = "Age group") + + expand_limits(y = c(0, 3e3)) + + coord_cartesian(expand = FALSE) + + theme_bw() + + theme( + legend.position = "top", + legend.text = element_text(size = 10, hjust = 0, lineheight = 121) + ) + + labs( + x = "Simulation time (days)", + linetype = "Compartment", + y = "Individuals", + caption = + expression( + paste( + "SEIR with vaccine showing the trajectories of the number of ", + "exposed and infected individuals for different age groups." + ) + ) + ) + + guides( + color = guide_legend(nrow = 2) + ) +``` + +Nous pouvons visualiser les résultats du modèle de base et du modèle de l +d'intervention vaccinale pour mettre en évidence les différences en matière d'infection. +de l'infection. Cette comparaison nous permet d'observer l'impact de la vaccination sur les +l'impact de la vaccination sur la propagation de la maladie, notamment en termes de réduction des nouvelles infections. +nouvelles infections, de modification de la courbe épidémique et de prévention potentielle de la maladie. +les épidémies dans les différents groupes d'âge. En opposant ces deux modèles, +nous pouvons mieux comprendre l'efficacité des stratégies de vaccination dans les pays en voie de développement. +contrôler l'épidémie. + +```{r} +# Load new infections data for each scenario +data_vaccine <- epidemics::new_infections( + output3, + compartments_from_susceptible = "vaccinated", + by_group = TRUE +) + +# Assign scenario names +data_vaccine$scenario <- "Vaccination" + +# Combine the data from both scenarios (baseline and vaccination) +data_combined2 <- bind_rows(data_baseline, data_vaccine) +# Plot new infections over time by scenario and demographic groups +ggplot(data_combined2) + + # Plot new infections with lines for each demographic group and scenario + geom_line( + aes( + x = time, + y = new_infections, + col = demography_group, + linetype = scenario + ) + ) + + # Scale the y-axis with comma-formatted labels + scale_y_continuous(labels = scales::comma) + + # Define custom line types for scenarios + scale_linetype_manual( + name = "Scenario", + values = c( + Baseline = "dashed", + Vaccination = "solid" + ) + ) + + # Use a color palette for age groups + scale_colour_brewer( + palette = "Dark2", + name = "Age Group" + ) + + # Set axis limits and disable automatic expansion + expand_limits(y = c(0, 1e3)) + + coord_cartesian(expand = FALSE) + + # Apply a clean white background theme + theme_bw() + + # Customize theme for better aesthetics + theme( + legend.position = "top", # Position legend at the top + legend.text = element_text(size = 10), # Adjust legend text size + plot.caption = element_text(hjust = 0.5) # Center align the caption + ) + + # Add axis labels and caption for the plot + labs( + x = "Simulation Time (days)", # x-axis label + y = "New Infections", # y-axis label + linetype = "Scenario", # Legend title for line types + caption = expression( + paste( + "New infections under baseline and vaccine-induced immunity", + "with varying efficacy (", + nu, ") across different age groups." + ) + ) + ) + + # Adjust legend display for better readability + guides( + color = guide_legend(nrow = 2) # Split legend into two rows + ) +``` + +## Combiner les interventions + +Les `{epidemics}` permet l'intégration de plusieurs +interventions, telles que la vaccination et la réduction des contacts, dans le cadre d'un programme d'éducation et de formation. +dans un seul modèle, ce qui permet des simulations plus complètes de la maladie. +de contrôle des maladies. Le morceau de code ci-dessous montre comment combiner +ensemble. + +```{r} +# Run the epidemic model +output4 <- epidemics::model_default( + population = bf_population, + transmission_rate = 15 / 5, # R0 / infectious period = 3 + infectiousness_rate = 1 / 8, # 1 / latent period (pre-infectious phase) + recovery_rate = 1 / 5, # 1 / infectious period + intervention = list(contacts = reduced_contacts), + vaccination = vaccinate_elders, + time_end = 120, # Number of days to simulate + increment = 1 # Daily increments +) + +# Plot the epidemic curve (infectious individuals) +output4 %>% + filter(compartment == "infectious") %>% # Filter for infectious individuals + ggplot(aes( + x = time, # Time on the x-axis + y = value, # Number of infectious individuals on the y-axis + col = demography_group # Color by demographic group (age) + )) + + geom_line(linewidth = 1.2) + # Line width for better visibility + # Format y-axis with commas for thousands + scale_y_continuous(labels = scales::comma) + + # Color palette for age groups + scale_colour_brewer(palette = "Dark2", name = "Age Group") + + # Ensure the y-axis starts from 0 and goes up to 500,000 + expand_limits(y = c(0, 1.5e3)) + + coord_cartesian(expand = FALSE) + # Disable axis expansion + theme_bw() + # Clean, white background theme + theme( + legend.position = "top", # Place legend at the top + # Adjust text size and line height + legend.text = element_text(size = 10, hjust = 0, lineheight = 1.1), + plot.caption = element_text(hjust = 0.5) # Center align the caption + ) + + labs( + x = "Simulation Time (Days)", # x-axis label + y = "Number of Infectious Individuals", # y-axis label + caption = "SEIR model with vaccination and contact reduction: + Number of infectious individuals by age group" + ) + + # Split the legend into two rows for compactness + guides( + color = guide_legend(nrow = 2) + ) +``` + + diff --git a/locale/fr/learners/reference.md b/locale/fr/learners/reference.md new file mode 100644 index 0000000..293d989 --- /dev/null +++ b/locale/fr/learners/reference.md @@ -0,0 +1,164 @@ +--- +title: 'Glossaire des termes : Epiverse-TRACE' +--- + +## A + +[Transmission par voie aérienne]{#airborne} + Les individus sont infectés par contact avec des particules infectieuses présentes dans l'air. Les exemples incluent la grippe et le COVID-19. Atler et al. (2023) parlent de [les facteurs et les procédures de gestion](https://www.ncbi.nlm.nih.gov/books/NBK531468/) de la transmission par voie aérienne. + +## B + +[Numéro de reproduction de base]{#basic} +: Mesure de la transmissibilité d'une maladie. Défini comme le nombre moyen de cas secondaires survenant à partir d'un cas initial infecté dans une population entièrement sensible. [Plus d'informations sur l'indice de reproduction de base](https://en.wikipedia.org/wiki/Basic_reproduction_number). + +[Inférence bayésienne]{#bayesian} + L'inférence bayésienne est un type d'inférence statistique dans lequel les croyances préalables sont mises à jour à l'aide des données observées. +[Plus d'informations sur l'inférence bayésienne](https://en.wikipedia.org/wiki/Bayesian_inference). + +## C + +[Matrice de contact]{#contact} + Matrice des contacts : La matrice des contacts est une matrice carrée composée de lignes/colonnes égales au nombre de groupes d'âge. Chaque élément représente la fréquence des contacts entre les groupes d'âge. Si nous pensons que la transmission d'une infection se fait par contact et que les taux de contact sont très différents selon les groupes d'âge, la spécification d'une matrice de contact nous permet de prendre en compte les taux de transmission spécifiques à l'âge. + +[C++]{#cplusplus} + C++ : C++ est un langage de programmation de haut niveau qui peut être utilisé dans R pour accélérer des sections de code. Pour en savoir plus sur le C++, consultez les sites suivants [tutoriels](https://cplusplus.com/doc/tutorial/) et apprenez-en plus sur l'intégration de C++ et de R [ici](https://www.rcpp.org/). + [Censure]{#censoring} +: +signifie que nous savons qu'un événement s'est produit, mais que nous ne savons pas exactement quand il s'est produit. La plupart des données épidémiologiques sont "doublement censurées" parce qu'il y a une incertitude concernant les temps des événements primaires et secondaires. Ne pas tenir compte de la censure peut conduire à des estimations biaisées de l'écart-type du délai ([Park et al.](https://github.com/parksw3/epidist-paper)). +Les différentes approches d'échantillonnage peuvent générer des biais dus à la censure à gauche et à droite dans l'estimation de l'intervalle sériel qui peut se propager à l'estimation de l'intervalle sériel. [période d'incubation](#incubation) et du temps de génération ([Chen et al., 2022](https://www.nature.com/articles/s41467-022-35496-8/figures/2)) + +## D + +[AVCI]{#dalys} + Les années de vie corrigées de l'incapacité (AVCI) sont une mesure de la charge de morbidité. Plus précisément, elles mesurent les années de vie perdues en raison de la morbidité associée à la maladie. [Plus d'informations sur les AVCI](https://www.who.int/data/gho/indicator-metadata-registry/imr-details/158). + +[Modèle déterministe]{#deterministic} + Modèles qui auront toujours la même trajectoire pour des conditions initiales et des valeurs de paramètres données. Les exemples incluent les équations différentielles ordinaires et les équations aux différences. + +[Transmission directe]{#direct} + Les personnes sont infectées par contact direct avec d'autres personnes infectées. Les infections transmises par voie aérienne sont souvent modélisées comme des infections directement transmises, car elles nécessitent un contact étroit avec des personnes infectées pour réussir à se transmettre. + +## E + +[Nombre effectif de reproduction]{#effectiverepro} + Numéro de reproduction effectif : Le numéro de reproduction effectif ou variable dans le temps ($Rt$) est similaire au [Nombre de reproduction de base](#basic) ($R0$), mais $Rt$ mesure le nombre de personnes infectées par une personne infectieuse lorsqu'une partie de la population a déjà été infectée. Pour en savoir plus sur la [étymologie de Nombre de reproduction par Sharma et al, 2023](https://wwwnc.cdc.gov/eid/article/29/8/22-1445_article). + + + +## G + +[Temps de génération]{#generationtime} + Temps écoulé entre le début de la contagiosité d'un cas index et celle d'un cas secondaire. Ce délai doit toujours être positif. +La distribution du temps de génération est généralement estimée à partir des données relatives à l'épidémie. [intervalle sériel](#serialinterval) d'une infection ([Cori et al. 2017](https://royalsocietypublishing.org/doi/10.1098/rstb.2016.0371)). + +[Taux de croissance]{#growth} + Le taux de croissance exponentiel nous indique dans quelle mesure les cas augmentent ou diminuent au début d'une épidémie. Il nous donne une mesure de la vitesse de transmission, voir [Dushoff \& Park, 2021](https://royalsocietypublishing.org/doi/full/10.1098/rspb.2020.1556). + +## H + +[Immunité des troupeaux]{#herdimmunity} +Lorsqu'une partie suffisante de la population est immunisée contre l'infection, les individus sensibles sont protégés contre l'infection. +[Plus d'informations sur l'immunité collective](https://vaccineknowledge.ox.ac.uk/herd-immunity#What-is-herd-immunity). + +## I + +[Période d'incubation]{#incubation} + La période d'incubation est le temps qui s'écoule entre le moment où l'on est infecté et l'apparition des symptômes. +[Plus d'informations sur la période d'incubation](https://en.wikipedia.org/wiki/Latent_period_\(epidemiology\)#Incubation_period). +Celle-ci peut être différente de la [période de latence](#latent) comme le montre la figure 4 de ([Xiang et al. (2021)](https://www.sciencedirect.com/science/article/pii/S2468042721000038#fig4)). +La relation entre la période d'incubation et le [intervalle sériel](#serialinterval) permet de définir le type de transmission de l'infection (symptomatique ou pré-symptomatique) ([Nishiura et al. (2020)](https://www.ijidonline.com/article/S1201-9712\(20\)30119-3/fulltext#gr2)). + +[Transmission indirecte]{#indirect} + Les infections à transmission indirecte sont transmises à l'homme par contact avec des vecteurs, des animaux ou un environnement contaminé. Les infections à transmission vectorielle, les zoonoses et les infections transmises par l'eau sont modélisées comme des infections à transmission indirecte. + +[Conditions initiales]{#initial} + In [ODEs](#ordinary) les conditions initiales sont les valeurs des variables d'état au début de la simulation du modèle (au temps 0). Par exemple, s'il y a un individu infectieux dans une population de 1000 personnes dans un modèle Susceptible-Infectieux-Récupéré, les conditions initiales sont les suivantes $S(0) = 999$, $I(0) = 1$, $R(0) = 0$. + +[Période infectieuse]{#infectiousness} +: Également connue sous le nom de durée de la contagiosité. Période de temps entre le début et la fin de la période infectieuse. [virale infectieuse](#viralshedding). +La charge virale et la détection du virus infectieux sont les deux paramètres clés pour estimer l'infectiosité ([Puhach et al., 2022](https://www.nature.com/articles/s41579-022-00822-w) et [Hakki et al, 2022](https://www.thelancet.com/journals/lanres/article/PIIS2213-2600\(22\)00226-0/fulltext)(fig/infectiousness-covid19.jpg)). + + + + + +## L + +[Période de latence]{#latent} + La période de latence est le temps qui s'écoule entre le moment où l'on est infecté et le moment où l'on commence à être contagieux. +Ce délai peut être différent du [période d'incubation](#incubation) comme le montre la figure 4 de ([Xiang et al, 2021](https://www.sciencedirect.com/science/article/pii/S2468042721000038#fig4)) + +## M + +[Paramètres du modèle (ODE)]{#parsode} + Les paramètres du modèle sont utilisés dans [l'équation différentielle ordinaire](#ordinary) pour décrire le flux entre les états pathologiques. Par exemple, un taux de transmission $\beta$ est un paramètre du modèle qui peut être utilisé pour décrire le flux entre les états sensibles et infectieux. + +## N + +[Interventions non pharmaceutiques]{#NPIs} + Interventions non pharmaceutiques : Les interventions non pharmaceutiques (INP) sont des mesures mises en place pour réduire la transmission qui n'incluent pas l'administration de médicaments ou de vaccins. [Plus d'informations sur les NPI](https://www.gov.uk/government/publications/technical-report-on-the-covid-19-pandemic-in-the-uk/chapter-8-non-pharmaceutical-interventions). + +## O + +[Equations différentielles ordinaires]{#ordinary} + Les équations différentielles ordinaires : Les équations différentielles ordinaires (EDO) peuvent être utilisées pour représenter le taux de changement d'une variable (par exemple, le nombre de personnes infectées) par rapport à une autre (par exemple, le temps). Consultez cette introduction aux [ODE](https://mathinsight.org/ordinary_differential_equation_introduction). Les EDO sont largement utilisées dans la modélisation des maladies infectieuses pour modéliser le flux d'individus entre différents états pathologiques. + [Histoire naturelle de la maladie]{#naturalhistory} +: Désigne le développement d'une maladie du début à la fin, sans aucun traitement ni intervention. En effet, compte tenu de la nocivité d'une épidémie, des mesures de traitement ou d'intervention sont inévitables. Il est donc difficile que l'histoire naturelle d'une maladie ne soit pas influencée par les différents facteurs de couplage. ([Xiang et al, 2021](https://www.sciencedirect.com/science/article/pii/S2468042721000038)) + +## O + +[Distribution de la progéniture]{#offspringdist} + Distribution du nombre de cas secondaires causés par un individu infecté donné. ([Lloyd-Smith et al, 2005](https://www.nature.com/articles/nature04153), [Endo et al, 2020](https://wellcomeopenresearch.org/articles/5-67/v3)) + +## P + +[(dynamique ou épidémique) Biais de phase]{#phasebias} +: tient compte de la sensibilité de la population au moment où les paires de transmission sont observées. +Il s'agit d'un type de biais d'échantillonnage. Il affecte les données rétrospectives et est lié à la phase de l'épidémie : pendant la phase de croissance exponentielle, les cas qui ont développé des symptômes récemment sont surreprésentés dans les données observées, tandis que pendant la phase de déclin, ces cas sont sous-représentés, ce qui conduit à l'estimation d'intervalles de délai plus courts et plus longs, respectivement. ([Park et al.](https://github.com/parksw3/epidist-paper)) + + + +## R + +[Délai d'établissement des rapports]{#reportingdelay} + Délai de déclaration : Délai ou décalage entre le moment où un événement se produit (par exemple, l'apparition d'un symptôme) et le moment où il est signalé (par exemple, l'apparition d'un symptôme).[Lawless, 1994](https://www.jstor.org/stable/3315820)). Nous pouvons le quantifier en comparant la liste de référence avec ses versions successives ou en actualisant les comptes de cas agrégés ([Cori et al. 2017](https://royalsocietypublishing.org/doi/10.1098/rstb.2016.0371)). + +## S + +[Variables d'état]{#state} + Les variables d'état d'un modèle représenté par [des équations différentielles ordinaires](#ordinary) sont les états pathologiques dans lesquels les individus peuvent se trouver, par exemple si les individus peuvent être sensibles, infectieux ou guéris, les variables d'état sont les suivantes $S$, $I$ et $R$. Il existe une équation différentielle ordinaire pour chaque variable d'état. + +[Intervalle de série]{#serialinterval} + Le délai entre l'apparition des symptômes d'un cas primaire et d'un cas secondaire. +Ce délai peut être négatif en cas d'infection pré-symptomatique. +Le plus souvent, la distribution de l'intervalle sériel d'une infection est utilisée pour estimer le délai d'apparition des symptômes. [temps de génération](#generationtime) ([(Cori et al., 2017)](https://royalsocietypublishing.org/doi/10.1098/rstb.2016.0371)). +La relation entre l'intervalle sériel et le [période d'incubation](#incubation) permet de définir le type de transmission de l'infection (symptomatique ou pré-symptomatique) ([Nishiura et al. (2020)](https://www.ijidonline.com/article/S1201-9712\(20\)30119-3/fulltext#gr2)). + +[Modèle stochastique]{#stochastic} + Modèle qui inclut un processus stochastique entraînant des variations dans les simulations du modèle pour les mêmes conditions initiales et valeurs de paramètres. Les exemples incluent les équations différentielles stochastiques et les modèles de processus de ramification. Pour plus de détails, voir [Allen (2017)](https://doi.org/10.1016/j.idm.2017.03.001). + +## T + +[(à droite) Troncature]{#truncation} + Type de biais d'échantillonnage lié au processus de collecte des données. Il est dû au fait que seuls les cas qui ont été signalés peuvent être observés. Le fait de ne pas tenir compte de la troncature à droite pendant la phase de croissance d'une épidémie peut conduire à une sous-estimation du délai moyen ([Park et al.](https://github.com/parksw3/epidist-paper)). + + + +## V + +[Transmission vectorielle]{#vectorborne} + Transmission vectorielle : La transmission vectorielle signifie qu'une infection peut être transmise d'un vecteur (par exemple, des moustiques) à l'homme. Le paludisme et la dengue sont des exemples de maladies à transmission vectorielle. L'Organisation mondiale de la santé dispose d'une [Fiche d'information sur les maladies à transmission vectorielle](https://www.who.int/news-room/fact-sheets/detail/vector-borne-diseases) avec des informations clés et une liste de ces maladies en fonction de leur vecteur. + +[Excrétion virale]{#viralshedding} + Le processus de libération d'un virus d'une cellule ou d'un corps dans l'environnement où il peut infecter d'autres personnes. ([Dictionnaire de Cambridge, 2023](https://dictionary.cambridge.org/us/dictionary/english/shedding)) + + + + + + + + + + diff --git a/locale/fr/learners/setup.md b/locale/fr/learners/setup.md new file mode 100644 index 0000000..8bd1cb0 --- /dev/null +++ b/locale/fr/learners/setup.md @@ -0,0 +1,202 @@ +--- +title: Mise en place +--- + +## Motivation + +**Éclosions** de maladies infectieuses peuvent apparaître à cause de différents agents pathogènes et dans différents contextes, mais elles conduisent généralement à des questions de santé publique similaires, allant de la compréhension des schémas de transmission et de gravité à l'examen de l'effet des mesures de contrôle ([Cori et al. 2017](https://royalsocietypublishing.org/doi/10.1098/rstb.2016.0371#d1e605)). Nous pouvons relier chacune de ces questions de santé publique à une série de tâches d'analyse des données relatives aux épidémies. Plus ces tâches sont efficaces et fiables, plus nous pouvons répondre rapidement et avec précision aux questions sous-jacentes. + +Epiverse-TRACE vise à fournir un écosystème logiciel pour [**l'analyse des épidémies**](reference.md#outbreakanalytics) grâce à des logiciels intégrés, généralisables et évolutifs pilotés par la communauté. Nous soutenons le développement de nouveaux progiciels R, nous aidons à relier les outils existants pour les rendre plus conviviaux et nous contribuons à une communauté de pratique composée d'épidémiologistes de terrain, de scientifiques des données, de chercheurs de laboratoire, d'analystes d'agences de santé, d'ingénieurs en logiciel et bien d'autres encore. + +### Tutoriels Epiverse-TRACE + +Nos tutoriels sont construits autour d'un pipeline d'analyse d'épidémies divisé en trois étapes : **Tâches préliminaires**, **Tâches intermédiaires** et **Tâches tardives**. Les résultats des tâches accomplies au cours des étapes précédentes alimentent généralement les tâches requises pour les étapes ultérieures. + +![Aperçu des thèmes abordés dans le cadre du tutorat](https://epiverse-trace.github.io/task_pipeline-minimal.svg) + +Chaque tâche a son site web de tutorat et chaque site web de tutorat consiste en un ensemble d'épisodes couvrant différents sujets. + +| [Tutoriels pour les premières tâches ➠](https://epiverse-trace.github.io/tutorials-early/) | [Didacticiels pour les tâches intermédiaires ➠](https://epiverse-trace.github.io/tutorials-middle) | [Travaux dirigés tardifs ➠](https://epiverse-trace.github.io/tutorials-late/) | +| ------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | +| Lire et nettoyer les données de l'affaire, et établir une liste de contrôle | Analyse et prévision en temps réel | Modélisation de scénarios | +| Lire, nettoyer et valider les données des cas, convertir les données de la liste des lignes en incidence pour la visualisation. | Accéder aux distributions des retards et estimer les paramètres de transmission, prévoir les cas, estimer la gravité et la superposition. | Simulez la propagation de la maladie et étudiez les interventions. | + +Chaque épisode contient : + +- **Vue d'ensemble** Cet épisode décrit les questions auxquelles il sera répondu et les objectifs de l'épisode. +- **Conditions préalables** La description des épisodes/paquets qui doivent idéalement être couverts avant l'épisode en cours. +- **Exemple de code R** Le site web de la Commission européenne contient des exemples de code R afin que vous puissiez travailler sur les épisodes sur votre propre ordinateur. +- **Défis** Les défis : des défis à relever pour tester votre compréhension. +- **Explicatifs** Les Explicateurs sont des boîtes qui vous permettent de mieux comprendre les concepts mathématiques et de modélisation. + +Consultez également le site [glossaire](./reference.md) pour connaître les termes qui ne vous sont pas familiers. + +### Paquets Epiverse-TRACE R + +Notre stratégie consiste à incorporer progressivement des **R spécial** dans un pipeline d'analyse traditionnel. Ces progiciels devraient combler les lacunes dans les tâches spécifiques à l'épidémiologie en réponse aux épidémies. + +![Dans le cadre de l'analyse de l'épidémie de grippe aviaire, le **R** l'unité fondamentale du code partageable est le **paquet**. Un paquetage regroupe du code, des données, de la documentation et des tests et est facile à partager avec d'autres ([Wickham et Bryan, 2023](https://r-pkgs.org/introduction.html))](episodes/fig/pkgs-hexlogos-2.png) + +:::::::::::::::::::::::::::: prereq + +Ce contenu suppose une connaissance intermédiaire de R. Ces tutoriels sont pour vous si : + +- Vous savez lire des données dans R, les transformer et les remodeler, et créer une grande variété de graphiques. +- Vous connaissez les fonctions de `{dplyr}`, `{tidyr}` et `{ggplot2}` +- Vous pouvez utiliser le tube magrittr `%>%` et/ou le tuyau natif `|>`. + +Nous attendons des apprenants qu'ils soient familiarisés avec les concepts de base de la statistique, des mathématiques et de la théorie des épidémies, mais PAS avec une connaissance intermédiaire ou experte de la modélisation. + +:::::::::::::::::::::::::::: + +## Configuration du logiciel + +Suivez ces deux étapes : + +### 1\. Installez ou mettez à jour R et RStudio + +R et RStudio sont deux logiciels distincts : + +- **R** est un langage de programmation et un logiciel utilisé pour exécuter du code écrit en R. +- **RStudio** est un environnement de développement intégré (IDE) qui facilite l'utilisation de R. Nous vous recommandons d'utiliser RStudio pour interagir avec R. + +Pour installer R et RStudio, suivez les instructions suivantes . + +::::::::::::::::::::::::::::: callout + +### Déjà installé ? + +Ne perdez pas de temps : C'est le moment idéal pour vous assurer que votre installation R est à jour. + +Ce tutoriel nécessite **R version 4.0.0 ou ultérieure**. + +::::::::::::::::::::::::::::: + +Pour vérifier si votre version de R est à jour : + +- Dans RStudio, votre version de R sera imprimée en [la fenêtre de la console](https://docs.posit.co/ide/user/ide/guide/code/console.html). Ou exécutez `sessionInfo()` là. + +- **Pour mettre à jour R** téléchargez et installez la dernière version à partir du site [site web du projet R](https://cran.rstudio.com/) pour votre système d'exploitation. + + - Après l'installation d'une nouvelle version, vous devrez réinstaller tous vos paquets avec la nouvelle version. + + - Pour Windows, l'option `{installr}` peut mettre à jour votre version de R et migrer votre bibliothèque de paquets. + +- **Pour mettre à jour RStudio** ouvrez RStudio et cliquez sur + `Help > Check for Updates`. Si une nouvelle version est disponible, suivez les instructions suivantes + instructions à l'écran. + +::::::::::::::::::::::::::::: callout + +### Vérifiez régulièrement les mises à jour + +Bien que cela puisse paraître effrayant, c'est **bien plus courant** de rencontrer des problèmes dus à l'utilisation de versions obsolètes de R ou de paquets R. Il est donc recommandé de se tenir au courant des dernières versions de R, de RStudio et de tous les paquets que vous utilisez régulièrement. + +::::::::::::::::::::::::::::: + +### 2\. Installez les paquets R requis + +Ouvrez RStudio et **copiez et collez** le morceau de code suivant dans la fenêtre [fenêtre de la console](https://docs.posit.co/ide/user/ide/guide/code/console.html) puis appuyez sur la touche Entrer (Windows et Linux) ou Retour (MacOS) pour exécuter la commande : + +```r +if(!require("pak")) install.packages("pak") + +new_packages <- c( + "socialmixr", + "finalsize", + "epiverse-trace/epidemics", + "epiparameter", + "scales", + "tidyverse" +) + +pak::pkg_install(new_packages) +``` + +Ces étapes d'installation peuvent vous demander `? Do you want to continue (Y/n)` écrire `Y` et d'appuyer sur Entrez. + +::::::::::::::::::::::::::::: spoiler + +### obtenez-vous une erreur avec {epidemics}? + +Si vous obtenez un message d'erreur lors de l'installation {epidemics} essayez ce code alternatif : + +```r +if(!require("devtools")) install.packages("devtools") + +devtools::install_github("epiverse-trace/epidemics") +``` + +**Que faire si une erreur persiste ?** + +Si le mot-clé du message d'erreur contient une chaîne de caractères comme `Personal access token (PAT)` vous devrez peut-être [configurer votre jeton GitHub](https://epiverse-trace.github.io/git-rstudio-basics/02-setup.html#set-up-your-github-token). + +Installez d'abord ces paquets R : + +```r +if(!require("pak")) install.packages("pak") + +new <- c("gh", + "gitcreds", + "usethis") + +pak::pak(new) +``` + +Ensuite, suivez les trois étapes suivantes pour [configurer votre jeton GitHub (lisez ce guide étape par étape)](https://epiverse-trace.github.io/git-rstudio-basics/02-setup.html#set-up-your-github-token): + +```r +# Generate a token +usethis::create_github_token() + +# Configure your token +gitcreds::gitcreds_set() + +# Get a situational report +usethis::git_sitrep() +``` + +Réessayez d'installer {epidemics}: + +```r +if(!require("devtools")) install.packages("devtools") + +devtools::install_github("epiverse-trace/epidemics") +``` + +Si l'erreur persiste, [contactez-nous](#your-questions)! + +::::::::::::::::::::::::::::: + +Vous devez mettre à jour **tous les paquets** nécessaires au tutoriel, même si vous les avez installés relativement récemment. Les nouvelles versions apportent des améliorations et d'importantes corrections de bogues. + +Lorsque l'installation est terminée, vous pouvez essayer de charger les paquets en collant le code suivant dans la console : + +```r +library(socialmixr) +library(finalsize) +library(epidemics) +library(epiparameter) +library(scales) +library(tidyverse) +``` + +Si vous ne voyez PAS d'erreur comme `there is no package called '...'` vous êtes prêt à partir ! Si c'est le cas, [contactez-nous](#your-questions)! + +## Jeux de données + +### Téléchargez les données + +Nous téléchargerons les données directement à partir de R au cours du tutoriel. Cependant, si vous vous attendez à des problèmes de réseau, il peut être préférable de télécharger les données à l'avance et de les stocker sur votre machine. + +Les fichiers de données pour le tutoriel peuvent être téléchargés manuellement ici : + +- + +- + +## Vos questions + +Si vous avez besoin d'aide pour installer le logiciel ou si vous avez d'autres questions concernant ce tutoriel, veuillez envoyer un courriel à l'adresse suivante [andree.valle-campos@lshtm.ac.uk](mailto:andree.valle-campos@lshtm.ac.uk) + +