diff --git a/locale/fr/episodes/clean-data.Rmd b/locale/fr/episodes/clean-data.Rmd new file mode 100644 index 00000000..15bda640 --- /dev/null +++ b/locale/fr/episodes/clean-data.Rmd @@ -0,0 +1,665 @@ +--- +title: Nettoyer les données de l'affaire +teaching: 20 +exercises: 10 +--- + +:::::::::::::::::::::::::::::::::::::: questions + +- Comment nettoyer et normaliser les données des dossiers ? + :::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::: objectives + +- Expliquez comment nettoyer, conserver et normaliser les données des dossiers à l'aide des outils suivants `{cleanepi}` paquet +- Effectuer les opérations essentielles de nettoyage des données à réaliser dans un ensemble de données brutes. + +:::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::: prereq + +Cet épisode vous demande de : + +- Télécharger le [simulé\_ebola\_2.csv](https://epiverse-trace.github.io/tutorials-early/data/simulated_ebola_2.csv) +- Enregistrez-le dans le fichier `data/` dossier. + +::::::::::::::::::::: + +## Introduction + +Lors de l'analyse des données d'une épidémie, il est essentiel de s'assurer que l'ensemble des données est propre, classé, normalisé et validé. Cela garantira la précision de l'analyse (c'est-à-dire que vous analysez ce que vous pensez analyser) et sa reproductibilité (c'est-à-dire que si quelqu'un veut revenir en arrière et répéter vos étapes d'analyse avec votre code, vous pouvez être sûr qu'il obtiendra les mêmes résultats). +Cet épisode se concentre sur le nettoyage des données relatives aux épidémies et aux flambées épidémiques à l'aide de l'outil +[cleanepi](https://epiverse-trace.github.io/cleanepi/) à l'aide du paquetage cleanepi, +À des fins de démonstration, nous travaillerons avec un ensemble de données simulées de cas d'Ebola. + +Commençons par charger le paquet `{rio}` pour lire les données et le paquet `{cleanepi}` +pour les nettoyer. Nous utiliserons le tuyau `%>%` pour connecter certaines de leurs fonctions, y compris celles de +du paquet `{dplyr}` Nous allons donc également faire appel au paquet tidyverse : + +```{r, eval=TRUE, message=FALSE, warning=FALSE} +# Load packages +library(tidyverse) # for {dplyr} functions and the pipe %>% +library(rio) # for importing data +library(here) # for easy file referencing +library(cleanepi) +``` + +::::::::::::::::::: checklist + +### Le double point-virgule + +Le double point-virgule `::` dans R vous permet d'appeler une fonction spécifique d'un paquetage sans charger le paquetage entier dans le fichier +l'environnement actuel. + +Par exemple, vous pouvez appeler une fonction spécifique d'un paquetage sans charger le paquetage entier dans l'environnement actuel, `dplyr::filter(data, condition)` utilise `filter()` à partir de l'outil `{dplyr}` paquet. + +Cela nous permet de nous souvenir des fonctions du paquet et d'éviter les conflits d'espace de noms. + +::::::::::::::::::: + +La première étape consiste à importer le jeu de données dans l'environnement de travail, ce qui peut être fait en suivant les instructions suivantes +décrites dans le [Lire les données du cas](../episodes/read-cases.Rmd) de l'épisode. Il s'agit de charger +l'ensemble de données dans `R` et de visualiser sa structure et son contenu. + +```{r, eval=FALSE, echo=TRUE, message=FALSE} +# Read data +# e.g.: if path to file is data/simulated_ebola_2.csv then: +raw_ebola_data <- rio::import( + here::here("data", "simulated_ebola_2.csv") +) %>% + dplyr::as_tibble() # for a simple data frame output +``` + +```{r, eval=TRUE, echo=FALSE, message=FALSE} +# Read data +raw_ebola_data <- rio::import( + file.path("data", "simulated_ebola_2.csv") +) %>% + dplyr::as_tibble() # for a simple data frame output +``` + +```{r, message=FALSE} +# Print data frame +raw_ebola_data +``` + +::::::::::::::::: discussion + +Commençons par **diagnostiquer** le cadre de données. Dressez la liste de toutes les caractéristiques de la base de données ci-dessus qui posent problème pour l'analyse des données. + +Certaines de ces caractéristiques vous sont-elles familières dans le cadre d'une analyse de données que vous avez déjà effectuée ? + +:::::::::::::::::::::::::::: + +::::::::::::::::::: instructor + +Animez une brève discussion pour établir un lien entre les caractéristiques diagnostiquées et les opérations de nettoyage requises. + +Vous pouvez utiliser ces termes pour **diagnostiquer les caractéristiques**: + +- *Codification* Codification des données, comme les entrées relatives au sexe et à l'âge, à l'aide de chiffres, de lettres et de mots. Également des dates dans des dispositions différentes. + ("jj/mm/aaaa" ou "aaaa/mm/jj") et des formats différents. Moins visibles, les noms des colonnes. +- *Manquant* Comment interpréter une entrée telle que "" dans le statut ou "-99" dans une autre colonne ? + du processus de collecte des données ? +- *Incohérences* Les incohérences sont les suivantes : la date de l'échantillon est antérieure à la date d'apparition. +- *Valeurs non plausibles* Les valeurs non plausibles, comme les observations aberrantes avec des dates en dehors de la période prévue. +- *Les doublons* Toutes les observations sont-elles uniques ? + +Vous pouvez utiliser ces termes pour vous référer à **les opérations de nettoyage**: + +- Normaliser le nom des colonnes +- Normaliser les variables catégorielles comme le sexe/genre +- Normaliser les colonnes de dates +- Convertir des caractères en valeurs numériques +- Vérifier la séquence d'événements datés + +:::::::::::::::::::::::::::::: + +## Une inspection rapide + +Une exploration et une inspection rapides de l'ensemble des données sont essentielles pour identifier les problèmes potentiels liés aux données avant qu'ils ne se produisent. +avant de se lancer dans des tâches d'analyse. Les `{cleanepi}` +simplifie ce processus grâce à l'outil `scan_data()` . Voyons comment vous pouvez l'utiliser : + +```{r} +cleanepi::scan_data(raw_ebola_data) +``` + +Les résultats donnent un aperçu du contenu de chaque colonne, y compris les noms des colonnes et le pourcentage de certaines données +de certains types de données par colonne. +Vous pouvez constater que les noms des colonnes de l'ensemble de données sont descriptifs mais manquent de cohérence, car certains d'entre eux sont composés de +plusieurs mots séparés par des espaces blancs. En outre, certaines colonnes contiennent plus d'un type de données, et il y a des +valeurs manquantes dans d'autres. + +## Opérations courantes + +Cette section montre comment effectuer quelques opérations courantes de nettoyage de données à l'aide de la fonction `{cleanepi}` pour effectuer des opérations courantes de nettoyage de données. + +### Normalisation des noms de colonnes + +Pour cet exemple de jeu de données, la normalisation des noms de colonnes consiste généralement à supprimer les espaces et à relier des mots différents +avec "\_". Cette pratique permet de maintenir la cohérence et la lisibilité de l'ensemble des données. Cependant, la fonction utilisée pour +normaliser les noms de colonnes offre plus d'options. Type de colonne `?cleanepi::standardize_column_names` pour plus de détails. + +```{r} +sim_ebola_data <- cleanepi::standardize_column_names(raw_ebola_data) +names(sim_ebola_data) +``` + +Si vous souhaitez conserver certains noms de colonnes sans les soumettre au processus de normalisation, vous pouvez utiliser l'option +l'option `keep` de la fonction `cleanepi::standardize_column_names()`. Cet argument accepte un vecteur de colonnes +qui doivent rester inchangés. + +::::::::::::::::::::::::::::::::::::: challenge + +- Quelles différences pouvez-vous observer dans les noms de colonnes ? + +- Normalisez les noms des colonnes de l'ensemble de données d'entrée, mais conservez les noms de la première colonne tels quels. + +::::::::::::::::: hint + +Vous pouvez essayer `cleanepi::standardize_column_names(data = raw_ebola_data, keep = "V1")` + +:::::::::::::::::::::: + +:::::::::::::::::::::::::::::::::::::::::::::::: + +### Suppression des irrégularités + +Les données brutes peuvent contenir des irrégularités telles que **des doublons** lignes, **vides** lignes et colonnes vides, ou **constant** colonnes +(où toutes les entrées ont la même valeur). Les fonctions de `{cleanepi}` comme `remove_duplicates()` et `remove_constants()` +supprimer ces irrégularités, comme le montre le morceau de code ci-dessous. + +```{r} +# Remove constants +sim_ebola_data <- cleanepi::remove_constants(sim_ebola_data) +``` + +Maintenant, imprimez la sortie pour identifier la colonne de constantes que vous avez supprimée ! + +```{r} +# Remove duplicates +sim_ebola_data <- cleanepi::remove_duplicates(sim_ebola_data) +``` + + + +::::::::::::::::::::: spoiler + +#### Combien de lignes avez-vous supprimées ? Quelles lignes ont été supprimées ? + +Vous pouvez obtenir le nombre et l'emplacement des lignes dupliquées qui ont été trouvées. Exécuter `cleanepi::print_report()`, +attendez que le rapport s'ouvre dans votre navigateur et trouvez l'onglet "Duplicates". + +```{r, eval=FALSE, echo=TRUE} +# Print a report +cleanepi::print_report(sim_ebola_data) +``` + +::::::::::::::::::::: + +::::::::::::::::::::: challenge + +Dans le cadre de données suivant : + +```{r, echo=FALSE, eval=TRUE} +library(tidyverse) + +#create dataset +df <- tibble( + col1 = c(1, 2), + col2 = c(1, 3) +) %>% + mutate(col3 = rep("a", nrow(.))) %>% + mutate(col4 = rep("b", nrow(.))) %>% + mutate(col5 = rep(NA_Date_, nrow(.))) %>% + add_row(col1 = NA_integer_, col3 = "a") %>% + add_row(col1 = NA_integer_, col3 = "a") %>% + add_row(col1 = NA_integer_, col3 = "a") %>% + add_row(col1 = NA_integer_) + +df +``` + +Quelles sont les colonnes ou les lignes : + +- des doublons ? +- vides ? +- constant ? + +::::::::::::::: hint + +Les doublons se réfèrent principalement aux lignes répliquées. Les lignes ou colonnes vides peuvent constituer un sous-ensemble de l'ensemble des lignes constantes. +ou de colonnes constantes. + +::::::::::::::: + +::::::::::::::::::::: + +::::::::::::::: instructor + +- rangs dupliqués : 3, 4, 5 +- lignes vides : 6 +- cols vides : 5 +- lignes constantes : 6 +- colonnes constantes : 5 + +Faites remarquer aux apprenants que l'utilisateur peut créer de nouvelles colonnes ou lignes constantes après avoir supprimé certaines colonnes ou lignes initiales. + +```{r} +df %>% + cleanepi::remove_constants() + +df %>% + cleanepi::remove_constants() %>% + cleanepi::remove_constants() +``` + +::::::::::::::: + +### Remplacer les valeurs manquantes + +Outre les irrégularités, les données brutes peuvent contenir des valeurs manquantes, qui peuvent être codées par différentes chaînes de caractères (par ex. `"NA"`, `""`, `character(0)`). Pour garantir une analyse solide, il est conseillé de remplacer toutes les valeurs manquantes par `NA` dans les +dans l'ensemble du jeu de données. Vous trouverez ci-dessous un extrait de code démontrant comment vous pouvez réaliser cette opération dans le module `{cleanepi}` pour les entrées manquantes représentées par une chaîne vide `"`: + +```{r} +sim_ebola_data <- cleanepi::replace_missing_values( + data = sim_ebola_data, + na_strings = "" +) + +sim_ebola_data +``` + + + +### Validation des identifiants des sujets + +Chaque entrée de l'ensemble de données représente un sujet (par exemple, un cas de maladie ou un participant à une étude) et doit pouvoir être distinguée par une colonne spécifique formatée dans un format +d'une manière particulière, par exemple en se situant dans un intervalle spécifié, en contenant certains préfixes et/ou suffixes, en contenant un numéro d'identification. +nombre spécifique de caractères. Les `{cleanepi}` propose la fonction `check_subject_ids()` conçue avec précision +pour cette tâche, comme le montre le morceau de code ci-dessous. Cette fonction valide s'ils sont uniques et s'ils satisfont aux exigences de la norme +critères requis. + +```{r} +sim_ebola_data <- + cleanepi::check_subject_ids( + data = sim_ebola_data, + target_columns = "case_id", + range = c(0, 15000) + ) +``` + +Notez que notre jeu de données simulé contient des IDS de sujets dupliqués. + +::::::::::::::::: spoiler + +#### Comment corriger les IDS des sujets ? + +Imprimons un rapport préliminaire avec `cleanepi::print_report(sim_ebola_data)`. Concentrez-vous sur les "Identifiants de sujets inattendus" +pour identifier les identifiants qui nécessitent un traitement supplémentaire. + +Après avoir terminé ce tutoriel, nous vous invitons à explorer le guide de référence du paquet de [`cleanepi::check_subject_ids()`](https://epiverse-trace.github.io/cleanepi/reference/check_subject_ids.html) pour trouver le +qui peut remédier à cette situation. + +::::::::::::::::::::::::: + +### Normalisation des dates + +Un ensemble de données épidémiques contient généralement des colonnes de dates pour différents événements, tels que la date d'infection, +la date d'apparition des symptômes, etc. Ces dates peuvent être présentées sous différents formats, et il est bon de les normaliser afin de garantir que les analyses ultérieures comparent les mêmes données. +Les `{cleanepi}` fournit une fonctionnalité permettant de convertir les colonnes de dates des ensembles de données épidémiques au format ISO, +garantissant la cohérence entre les différentes colonnes de dates. Voici comment vous pouvez l'utiliser sur notre jeu de données simulé : + +```{r} +sim_ebola_data <- cleanepi::standardize_dates( + sim_ebola_data, + target_columns = c( + "date_onset", + "date_sample" + ) +) + +sim_ebola_data +``` + +Cette fonction convertit les valeurs dans les colonnes cibles ou détermine automatiquement les colonnes de dates dans +l'ensemble de données (si `target_columns = NULL`) et les convertit dans le format **Ymd** et les convertir dans le format Ymd. + +::::::::::::::::::: discussion + +#### Comment cela est-il possible ? + +Nous vous invitons à découvrir le paquet clé qui rend cette normalisation possible à l'intérieur. `{cleanepi}` en lisant la section Détails du +[Manuel de référence sur la normalisation des variables de date](https://epiverse-trace.github.io/cleanepi/reference/standardize_dates.html#details)! + +::::::::::::::::::: + +### Conversion en valeurs numériques + +Dans l'ensemble de données brutes, certaines colonnes peuvent contenir un mélange de valeurs numériques et de caractères, et vous voudrez souvent convertir les valeurs suivantes +les valeurs de caractères pour les nombres en valeurs numériques (par ex. `"seven"` en `7`). Par exemple, dans notre ensemble de données simulées, dans la colonne de l'âge, certaines entrées sont +écrites en mots. Dans la colonne `{cleanepi}` la fonction `convert_to_numeric()` effectue cette conversion, comme illustré ci-dessous +ci-dessous. + +```{r} +sim_ebola_data <- cleanepi::convert_to_numeric(sim_ebola_data, + target_columns = "age" +) + +sim_ebola_data +``` + +::::::::::::::::: callout + +### Prise en charge de plusieurs langues + +Grâce à la `{numberize}` nous pouvons convertir les nombres écrits sous forme de mots anglais, français ou espagnols en nombres positifs. +valeurs entières positives ! + +::::::::::::::::::::::::: + +## Opérations liées à l'épidémiologie + +Outre les tâches courantes de nettoyage des données, telles que celles évoquées dans la section précédente, l'équipe d'épidémiologie de l `{cleanepi}` offre +fonctionnalités supplémentaires spécialement conçues pour le traitement et l'analyse des données relatives aux foyers et aux épidémies. Cette section +couvre certaines de ces tâches spécialisées. + +### Vérification de la séquence des événements datés + +Garantir l'ordre et la séquence corrects des événements datés est crucial dans l'analyse des données épidémiologiques, en particulier +lors de l'analyse des maladies infectieuses, où la chronologie d'événements tels que l'apparition des symptômes et la collecte d'échantillons est essentielle. +L'analyse des données épidémiologiques `{cleanepi}` fournit une fonction utile appelée `check_date_sequence()` précisément dans ce but. + +Voici un exemple de morceau de code démontrant l'utilisation de la fonction `check_date_sequence()` dans les 100 premiers enregistrements de notre ensemble de données Ebola simulé + +```{r, warning=FALSE, results="hide"} +cleanepi::check_date_sequence( + data = sim_ebola_data[1:100, ], + target_columns = c("date_onset", "date_sample") +) +``` + +Cette fonctionnalité est essentielle pour garantir l'intégrité et la précision des données dans les analyses épidémiologiques, car elle permet d'identifier les éléments suivants +les incohérences ou les erreurs dans l'ordre chronologique des événements, ce qui vous permet d'y remédier de manière appropriée. + +### Substitution basée sur un dictionnaire + +Dans le domaine du prétraitement des données, il est fréquent de rencontrer des scénarios dans lesquels certaines colonnes d'un ensemble de données, +comme la colonne "sexe" dans notre jeu de données Ebola simulé, sont censées avoir des valeurs ou des facteurs spécifiques. +Cependant, il est également fréquent que des valeurs inattendues ou erronées apparaissent dans ces colonnes, qui doivent être remplacées par des valeurs de +valeurs appropriées. La colonne `{cleanepi}` prend en charge la substitution basée sur le dictionnaire, une méthode qui vous permet d'effectuer des remplacements par des valeurs appropriées. +de remplacer des valeurs dans des colonnes spécifiques sur la base de correspondances définies dans un dictionnaire. +Cette approche garantit la cohérence et la précision du nettoyage des données. + +En outre, cette approche permet de garantir la cohérence et la précision du nettoyage des données, `{cleanepi}` fournit un dictionnaire intégré spécialement conçu pour les données épidémiologiques. L'exemple +ci-dessous comprend des correspondances pour la colonne "sexe". + +```{r} +test_dict <- base::readRDS( + system.file("extdata", "test_dict.RDS", package = "cleanepi") +) %>% + dplyr::as_tibble() # for a simple data frame output + +test_dict +``` + +Nous pouvons maintenant utiliser ce dictionnaire pour normaliser les valeurs de la colonne "sexe" selon des catégories prédéfinies. +Vous trouverez ci-dessous un exemple de code démontrant comment utiliser cette fonctionnalité : + +```{r} +sim_ebola_data <- cleanepi::clean_using_dictionary( + sim_ebola_data, + dictionary = test_dict +) + +sim_ebola_data +``` + +Cette approche simplifie le processus de nettoyage des données, en garantissant que les données catégorielles dans les ensembles de données épidémiologiques sont +catégorisées avec précision et prêtes pour une analyse plus approfondie. + +:::::::::::::::::::::::::: spoiler + +#### Comment créer votre propre dictionnaire de données ? + +Notez que, lorsque la colonne de l'ensemble de données contient des valeurs qui ne figurent pas dans le dictionnaire, la fonction +`cleanepi::clean_using_dictionary()` soulèvera une erreur. + +Vous pouvez démarrer un dictionnaire personnalisé avec un cadre de données à l'intérieur ou à l'extérieur de R. Vous pouvez utiliser la fonction +`cleanepi::add_to_dictionary()` pour inclure de nouveaux éléments dans le dictionnaire. Vous pouvez utiliser la fonction pour inclure de nouveaux éléments dans le dictionnaire, par exemple : + +```{r} +new_dictionary <- tibble::tibble( + options = "0", + values = "female", + grp = "sex", + orders = 1L +) %>% + cleanepi::add_to_dictionary( + option = "1", + value = "male", + grp = "sex", + order = NULL + ) + +new_dictionary +``` + +Vous pouvez lire plus de détails dans la section "Substitution de données basée sur le dictionnaire" dans le paquetage +[ Vignette "Démarrez".](https://epiverse-trace.github.io/cleanepi/articles/cleanepi.html#dictionary-based-data-substituting). + +:::::::::::::::::::::::::: + +### Calcul de l'intervalle de temps entre différentes dates + +Dans l'analyse des données épidémiologiques, il est également utile de suivre et d'analyser les événements dépendant du temps, tels que la progression +d'une épidémie (c'est-à-dire la différence de temps entre la date d'aujourd'hui et le premier cas signalé) ou la durée entre +la durée entre la collecte et l'analyse des échantillons (c'est-à-dire la différence de temps entre aujourd'hui et la collecte de l'échantillon). Les données les plus courantes +L'exemple le plus courant est le calcul de l'âge de tous les sujets en fonction de leur date de naissance (c'est-à-dire la différence de temps entre aujourd'hui et la date de prélèvement de l'échantillon). +et la date de naissance). + +Les `{cleanepi}` propose une fonction pratique pour calculer le temps écoulé entre deux événements datés à +différentes échelles de temps. Par exemple, l'extrait de code ci-dessous utilise la fonction `cleanepi::timespan()` pour calculer le +temps écoulé depuis la date de l'échantillon pour le cas identifié +jusqu'au 3 janvier 2025 (`"2025-01-03"`). + +```{r} +sim_ebola_data <- cleanepi::timespan( + sim_ebola_data, + target_column = "date_sample", + end_date = lubridate::ymd("2025-01-03"), + span_unit = "years", + span_column_name = "years_since_collection", + span_remainder_unit = "months" +) + +sim_ebola_data %>% + dplyr::select(case_id, date_sample, years_since_collection, remainder_months) +``` + +Après avoir exécuté la fonction `cleanepi::timespan()` deux nouvelles colonnes nommées `years_since_collection` et +`remainder_months` sont ajoutées à la base de données **sim\_ebola\_data** qui contient le temps calculé écoulé depuis la date +de prélèvement de l'échantillon pour chaque cas, mesuré en années, et le temps restant mesuré en mois. + +::::::::::::::::::::::::::::::::::::::::::::::: challenge + +Les données relatives à l'âge sont utiles dans toute analyse en aval. Vous pouvez les classer par catégories pour générer des estimations stratifiées. + +Lisez le `test_df.RDS` dans le cadre de données `{cleanepi}` paquet : + +```{r} +dat <- readRDS( + file = system.file("extdata", "test_df.RDS", package = "cleanepi") +) %>% + dplyr::as_tibble() +``` + +Calculez l'âge en années **jusqu'au 1er mars** des sujets avec la date de naissance, et le temps restant en mois. Nettoyez et standardisez les éléments nécessaires pour y parvenir. + +:::::::::::::::::::::::::::: hint + +Avant de calculer l'âge, vous devrez peut-être.. : + +- normaliser les noms des colonnes +- standardiser les colonnes de dates +- remplacez missing par des chaînes de caractères par une entrée manquante valide + +:::::::::::::::::::::::::::: + +:::::::::::::::::::::::::: solution + +Dans la solution, nous ajoutons `date_first_pcr_positive_test` étant donné qu'il fournira l'échelle temporelle pour l'analyse descriptive et statistique en aval de l'épidémie. + +```{r} +dat_clean <- dat %>% + # standardize column names and dates + cleanepi::standardize_column_names() %>% + cleanepi::standardize_dates( + target_columns = c("date_of_birth", "date_first_pcr_positive_test") + ) %>% + # replace from strings to a valid missing entry + cleanepi::replace_missing_values( + target_columns = "sex", + na_strings = "-99" + ) %>% + # calculate the age in 'years' and return the remainder in 'months' + cleanepi::timespan( + target_column = "date_of_birth", + end_date = lubridate::ymd("2025-03-01"), + span_unit = "years", + span_column_name = "age_in_years", + span_remainder_unit = "months" + ) +``` + +Maintenant, comment classeriez-vous une variable numérique ? + +:::::::::::::::::::::::::: + +:::::::::::::::::::::::::: solution + +La solution la plus simple consiste à utiliser `Hmisc::cut2()`. Vous pouvez également utiliser `dplyr::case_when()` mais cela nécessite plus de lignes de code et est plus approprié pour les catégorisations personnalisées. Nous vous proposons ici une solution utilisant `base::cut()`: + +```{r} +dat_clean %>% + # select to conveniently view timespan output + dplyr::select( + study_id, + sex, + date_first_pcr_positive_test, + date_of_birth, + age_in_years + ) %>% + # categorize the age numerical variable [add as a challenge hint] + dplyr::mutate( + age_category = base::cut( + x = age_in_years, + breaks = c(0, 20, 35, 60, Inf), # replace with max value if known + include.lowest = TRUE, + right = FALSE + ) + ) +``` + +Vous pouvez rechercher les valeurs maximales des variables en utilisant `skimr::skim()`. Au lieu de `base::cut()` vous pouvez également utiliser +`Hmisc::cut2(x = age_in_years,cuts = c(20,35,60))` qui calcule la valeur maximale et ne nécessite pas plus d'informations. +d'arguments. + +:::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::: + +## Plusieurs opérations à la fois + +L'exécution individuelle des opérations de nettoyage des données peut prendre beaucoup de temps et être source d'erreurs. Les `{cleanepi}` paquet +simplifie ce processus en offrant une fonction enveloppante pratique appelée `clean_data()` qui vous permet d'exécuter +plusieurs opérations à la fois. + +La fonction `clean_data()` applique une série d'opérations de nettoyage de données prédéfinies à l'ensemble de données d'entrée. Voici un exemple +exemple de code illustrant l'utilisation de la fonction `clean_data()` sur un ensemble de données brutes d'Ebola simulé : + +En outre, vous pouvez combiner plusieurs tâches de nettoyage de données via l'opérateur pipe dans "%>%", comme indiqué dans le code ci-dessous +extrait. + +```{r, warning=FALSE, message=FALSE} +# Perfom the cleaning operations using the pipe (%>%) operator +cleaned_data <- raw_ebola_data %>% + cleanepi::standardize_column_names() %>% + cleanepi::remove_constants() %>% + cleanepi::remove_duplicates() %>% + cleanepi::replace_missing_values(na_strings = "") %>% + cleanepi::check_subject_ids( + target_columns = "case_id", + range = c(1, 15000) + ) %>% + cleanepi::standardize_dates( + target_columns = c("date_onset", "date_sample") + ) %>% + cleanepi::convert_to_numeric(target_columns = "age") %>% + cleanepi::check_date_sequence( + target_columns = c("date_onset", "date_sample") + ) %>% + cleanepi::clean_using_dictionary(dictionary = test_dict) %>% + cleanepi::timespan( + target_column = "date_sample", + end_date = lubridate::ymd("2025-01-03"), + span_unit = "years", + span_column_name = "years_since_collection", + span_remainder_unit = "months" + ) +``` + +```{r, echo=FALSE, eval=TRUE} +cleaned_data %>% + write_csv(file = file.path("data", "cleaned_data.csv")) +``` + +:::::::::::::: challenge + +Avez-vous remarqué que `{cleanepi}` contient un ensemble de fonctions pour **diagnostiquer** l'état de nettoyage et un autre ensemble pour **effectuer** les actions de nettoyage ? + +Identifier les deux groupes : + +- Sur une feuille de papier, écrivez le nom de chaque fonction dans la colonne correspondante : + +| **Diagnostiquer** état du nettoyage | **Effectuer** action de nettoyage | +| ------------------ | -------------------- | +| ... | ... | + +:::::::::::::: + +:::::::::::::: instructor + +Notez que `{cleanepi}` contient un ensemble de fonctions pour **diagnostiquer** l'état du nettoyage (par ex, `check_subject_ids()` et `check_date_sequence()` dans l'extrait ci-dessus) et un autre à **réaliser** une action de nettoyage (les fonctions complémentaires de l'ensemble ci-dessus). + +:::::::::::::: + +## Rapport de nettoyage + +Le rapport `{cleanepi}` génère un rapport complet détaillant les résultats et les actions de tous les nettoyages de données. +effectuées au cours de l'analyse. Ce rapport se présente sous la forme d'une page web comportant plusieurs sections. Chaque section +correspond à une opération spécifique de nettoyage des données, et un clic sur chaque section vous permet d'accéder aux résultats de l'opération de nettoyage des données. +l'opération en question. Cette approche interactive permet aux utilisateurs d'examiner et d'analyser efficacement les résultats des opérations de nettoyage des données. +des étapes individuelles de nettoyage dans le cadre d'un processus de nettoyage de données plus large. + +Vous pouvez consulter le rapport à l'aide de la fonction `cleanepi::print_report(cleaned_data)`. + +

+ Rapport de nettoyage des données +
+

Exemple de rapport de nettoyage de données généré par `{cleanepi}`

Les rapports de nettoyage de données sont générés par `{cleanepi}`. +

+
+ +::::::::::::::::::::::::::::::::::::: keypoints + +- Utilisation `{cleanepi}` pour nettoyer et normaliser les données sur les épidémies et les foyers. +- Comprendre comment utiliser `{cleanepi}` pour effectuer des tâches courantes de nettoyage de données et des opérations liées à l'épidémiologie +- Visualiser le rapport de nettoyage des données dans un navigateur, le consulter et prendre des décisions. + +::::::::::::::::::::::::::::::::::::: + + diff --git a/locale/fr/episodes/describe-cases.Rmd b/locale/fr/episodes/describe-cases.Rmd new file mode 100644 index 00000000..308f04f7 --- /dev/null +++ b/locale/fr/episodes/describe-cases.Rmd @@ -0,0 +1,372 @@ +--- +title: Agréger et visualiser +teaching: 20 +exercises: 10 +--- + +:::::::::::::::::::::::::::::::::::::: questions + +- Comment agréger et résumer les données relatives aux cas ? +- Comment visualiser les données agrégées ? +- Quelle est la répartition des cas dans le temps, le lieu, le sexe, l'âge ? + +:::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::: objectives + +- Simuler des données synthétiques sur les épidémies +- Convertir les données des listes individuelles en incidence dans le temps +- Créer des courbes épidémiques à partir de données d'incidence + :::::::::::::::::::::::::::::::::::::::::::::::: + +## Introduction + +Dans un pipeline analytique, l'analyse exploratoire des données (AED) est une étape importante avant la modélisation formelle. L'AED aide à +de déterminer les relations entre les variables et de résumer leurs principales caractéristiques, souvent au moyen de la visualisation des données. + +Cet épisode se concentre sur l'analyse des données d'épidémies à l'aide de packages R. +L'un des aspects clés de l'analyse des données épidémiques est la notion de "personne, lieu et temps". Il est utile d'identifier comment les événements observés - tels que les cas confirmés, les hospitalisations, les décès et les guérisons - évoluent dans le temps et comment ils varient en fonction des différents lieux et facteurs démographiques, notamment le sexe, l'âge, etc. + +Commençons par charger le paquet `{incidence2}` afin d'agréger les données de la liste de diffusion en fonction de caractéristiques spécifiques et de visualiser les courbes épidémiques (épicurves) qui en résultent et qui représentent le nombre de nouveaux événements (c'est-à-dire l'incidence) au fil du temps. +Nous utiliserons `{simulist}` pour simuler des données d'épidémies à analyser, et `{tracetheme}` pour le formatage des figures. +Nous utiliserons le tuyau `%>%` pour connecter certaines de leurs fonctions, y compris celles des paquets `{dplyr}` et +`{ggplot2}` Nous allons donc également faire appel au paquet tidyverse : + +```{r, eval=TRUE, message=FALSE, warning=FALSE} +# Load packages +library(incidence2) # For aggregating and visualising +library(simulist) # For simulating linelist data +library(tracetheme) # For formatting figures +library(tidyverse) # For {dplyr} and {ggplot2} functions and the pipe %>% +``` + +::::::::::::::::::: checklist + +### Le double point-virgule + +Le double point-virgule `::` dans R vous permet d'appeler une fonction spécifique d'un paquetage sans charger l'ensemble du paquetage dans l'environnement actuel. + +Par exemple, vous pouvez appeler une fonction spécifique d'un package sans charger le package entier dans l'environnement actuel, `dplyr::filter(data, condition)` utilise `filter()` à partir de l'outil `{dplyr}` paquet. +Cela nous permet de nous souvenir des fonctions du paquet et d'éviter les conflits d'espace de noms. + +::::::::::::::::::: + +## Données synthétiques sur les épidémies + +Pour illustrer le processus d'analyse des données sur les épidémies, nous allons générer une liste de lignes +pour une épidémie hypothétique à l'aide de l'outil `{simulist}` paquet. `{simulist}` génère des données de simulation pour une épidémie selon une configuration donnée. +Sa configuration minimale permet de générer une liste d'adresses, comme le montre le morceau de code ci-dessous : + +```{r} +# Simulate linelist data for an outbreak with size between 1000 and 1500 +set.seed(1) # Set seed for reproducibility +sim_data <- simulist::sim_linelist(outbreak_size = c(1000, 1500)) %>% + dplyr::as_tibble() # for a simple data frame output + +# Display the simulated dataset +sim_data +``` + +Cet ensemble de données de liste contient des entrées sur les événements simulés au niveau individuel pendant l'épidémie. + +::::::::::::::::::: spoiler + +## Ressources supplémentaires sur les données relatives aux foyers + +Ce qui précède est la configuration par défaut de `{simulist}` Elle comprend donc un certain nombre d'hypothèses sur la transmissibilité et la gravité de l'agent pathogène. Si vous souhaitez en savoir plus sur `sim_linelist()` et d'autres fonctionnalités +consultez le site [site de documentation](https://epiverse-trace.github.io/simulist/). + +Vous pouvez également trouver des ensembles de données concernant des urgences réelles du passé sur le site [`{outbreaks}` paquet R](https://www.reconverse.org/outbreaks/). + +::::::::::::::::::: + +## Agrégation + +Souvent, nous voulons analyser et visualiser le nombre d'événements qui se produisent un jour ou une semaine donnés, plutôt que de nous concentrer sur des cas individuels. Pour ce faire, il est nécessaire de regrouper les données de la liste de diffusion + en données d'incidence. Les données [incidence2] (([https://www.reconverse.org/incidence2/articles/incidence2.html){.externe +](https://www.reconverse.org/incidence2/articles/incidence2.html\){.external) target="\_blank"}) +offre une fonction utile appelée `incidence2::incidence()` qui permet de regrouper les données relatives à un cas, généralement en fonction d'événements datés. +et/ou d'autres caractéristiques. Le morceau de code fourni ci-dessous démontre la création d'une fonction `` à partir de la classe +Ebola simulé `linelist` sur la base de la date d'apparition. + +```{r} +# Create an incidence object by aggregating case data based on the date of onset +daily_incidence <- incidence2::incidence( + sim_data, + date_index = "date_onset", + interval = "day" # Aggregate by daily intervals +) + +# View the incidence data +daily_incidence +``` + +Avec les `{incidence2}` vous pouvez spécifier l'intervalle souhaité (par exemple, le jour, la semaine) et classer les cas selon une ou plusieurs catégories. +plusieurs facteurs. Vous trouverez ci-dessous un extrait de code montrant des cas hebdomadaires regroupés selon la date d'apparition, le sexe et le type de cas. + +```{r} +# Group incidence data by week, accounting for sex and case type +weekly_incidence <- incidence2::incidence( + sim_data, + date_index = "date_onset", + interval = "week", # Aggregate by weekly intervals + groups = c("sex", "case_type") # Group by sex and case type +) + +# View the incidence data +weekly_incidence +``` + +::::::::::::::::::::::::::::::::::::: callout + +## Dates d'achèvement + +Lorsque les affaires sont regroupées en fonction de différents facteurs, il est possible que les événements impliquant ces groupes aient des dates différentes dans la base de données de l +qui en résultent `incidence2` qui en résulte. L'objet `incidence2` fournit une fonction appelée `complete_dates()` pour s'assurer qu'un +a la même plage de dates pour chaque groupe. Par défaut, les chiffres manquants pour un groupe particulier seront complétés par 0 pour cette date. + +Cette fonctionnalité est également disponible en tant qu'argument dans `incidence2::incidence()` ajouter `complete_dates = TRUE`. + +```{r} +# Create an incidence object grouped by sex, aggregating daily +daily_incidence_2 <- incidence2::incidence( + sim_data, + date_index = "date_onset", + groups = "sex", + interval = "day", # Aggregate by daily intervals + complete_dates = TRUE # Complete missing dates in the incidence object +) +``` + +```{r, echo=FALSE, eval=FALSE} +daily_incidence_2_complete <- incidence2::complete_dates( + x = daily_incidence_2, + expand = TRUE, # Expand to fill in missing dates + fill = 0L, # Fill missing values with 0 + by = 1L, # Fill by daily intervals + allow_POSIXct = FALSE # Ensure that dates are not in POSIXct format +) +``` + +:::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::: challenge + +## Défi 1 : Pouvez-vous le faire ? + +- **Tâche** Tâche : Agrégat `sim_data` la liste d'attente en fonction de la date d'admission et de l'issue du cas en **bihebdomadaire** + et enregistrez les résultats dans un objet appelé `biweekly_incidence`. + +:::::::::::::::::::::::::::::::::::::::::::::::: + +## Visualisation + +La `incidence2` peut être visualisé à l'aide de la fonction `plot()` du paquetage R de base. +Le graphique qui en résulte est appelé courbe épidémique, ou épi-courbe. Le code suivant +suivants génèrent des épi-courbes pour le modèle `daily_incidence` et `weekly_incidence` mentionnés ci-dessus. + +```{r} +# Plot daily incidence data +base::plot(daily_incidence) + + ggplot2::labs( + x = "Time (in days)", # x-axis label + y = "Dialy cases" # y-axis label + ) + + tracetheme::theme_trace() # Apply the custom trace theme +``` + +```{r} +# Plot weekly incidence data +base::plot(weekly_incidence) + + ggplot2::labs( + x = "Time (in weeks)", # x-axis label + y = "weekly cases" # y-axis label + ) + + tracetheme::theme_trace() # Apply the custom trace theme +``` + +:::::::::::::::::::::::: callout + +#### Esthétique simple + +Nous vous invitons à parcourir le `{incidence2}` paquet ["Vignette "Pour commencer](https://www.reconverse.org/incidence2/articles/incidence2.html). Découvrez comment vous pouvez utiliser des arguments dans `plot()` pour donner de l'esthétique à vos objets de la classe incidence2. + +```{r} +base::plot(weekly_incidence, fill = "sex") +``` + +Certains d'entre eux incluent `show_cases = TRUE`, `angle = 45` et `n_breaks = 5`. N'hésitez pas à les essayer. + +:::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::: challenge + +## Défi 2 : Pouvez-vous le faire ? + +- **Tâche** Visualiser `biweekly_incidence` objet. + +:::::::::::::::::::::::::::::::::::::::::::::::: + +## Courbe des cas cumulés + +Le nombre cumulé de cas peut être calculé à l'aide de la courbe des cas cumulés. `cumulate()` à partir d'un `incidence2` et visualisé, comme dans l'exemple ci-dessous. + +```{r} +# Calculate cumulative incidence +cum_df <- incidence2::cumulate(daily_incidence) + +# Plot cumulative incidence data using ggplot2 +base::plot(cum_df) + + ggplot2::labs( + x = "Time (in days)", # x-axis label + y = "weekly cases" # y-axis label + ) + + tracetheme::theme_trace() # Apply the custom trace theme +``` + +Notez que cette fonction préserve le regroupement, c'est-à-dire que si la fonction `incidence2` contient des groupes, elle accumulera les cas en conséquence. + +::::::::::::::::::::::::::::::::::::: challenge + +## Défi 3 : Pouvez-vous le faire ? + +- **Tâche** Visuliser les cas cumulés de `biweekly_incidence` l'objet. + +:::::::::::::::::::::::::::::::::::::::::::::::: + +## Estimation des pics + +Vous pouvez estimer le pic - le moment où le nombre de cas enregistrés est le plus élevé - à l'aide de la fonction `estimate_peak()` de la fonction {incidence2} paquet. +Cette fonction utilise une méthode de bootstrap pour déterminer l'heure de pointe (c'est-à-dire en rééchantillonnant les dates avec remplacement, ce qui donne une distribution des heures de pointe estimées). + +```{r} +# Estimate the peak of the daily incidence data +peak <- incidence2::estimate_peak( + daily_incidence, + n = 100, # Number of simulations for the peak estimation + alpha = 0.05, # Significance level for the confidence interval + first_only = TRUE, # Return only the first peak found + progress = FALSE # Disable progress messages +) + +# Display the estimated peak +print(peak) +``` + +Cet exemple montre comment estimer l'heure de pointe à l'aide de la fonction `estimate_peak()` à $95%$ +et en utilisant 100 échantillons bootstrap. + +::::::::::::::::::::::::::::::::::::: challenge + +## Défi 4 : Pouvez-vous le faire ? + +- **Tâche** Estimation de l'heure de pointe à partir de `biweekly_incidence` l'objet. + +:::::::::::::::::::::::::::::::::::::::::::::::: + +## Visualisation avec ggplot2 + +`{incidence2}` permet d'obtenir des tracés de base pour les épicurves, mais un travail supplémentaire est nécessaire pour créer des graphiques bien annotés. Cependant, l'utilisation de l'outil `{ggplot2}` vous pouvez générer des graphes plus sophistiqués et des épicurves avec plus de flexibilité dans l'annotation. +`{ggplot2}` est un logiciel complet qui offre de nombreuses fonctionnalités. Cependant, nous nous concentrerons sur trois éléments clés pour la production d'épicurves : les tracés d'histogrammes, la mise à l'échelle des axes de date et de leurs étiquettes, et l'annotation générale du thème du tracé. +L'exemple ci-dessous montre comment configurer ces trois éléments pour un tracé d'histogramme simple. `{incidence2}` simple. + +```{r} +# Define date breaks for the x-axis +breaks <- seq.Date( + from = min(as.Date(daily_incidence$date_index, na.rm = TRUE)), + to = max(as.Date(daily_incidence$date_index, na.rm = TRUE)), + by = 20 # every 20 days +) + +# Create the plot +ggplot2::ggplot(data = daily_incidence) + + geom_histogram( + mapping = aes( + x = as.Date(date_index), + y = count + ), + stat = "identity", + color = "blue", # bar border color + fill = "lightblue", # bar fill color + width = 1 # bar width + ) + + theme_minimal() + # apply a minimal theme for clean visuals + theme( + plot.title = element_text(face = "bold", + hjust = 0.5), # center and bold title + plot.subtitle = element_text(hjust = 0.5), # center subtitle + plot.caption = element_text(face = "italic", + hjust = 0), # italicized caption + axis.title = element_text(face = "bold"), # bold axis titles + axis.text.x = element_text(angle = 45, vjust = 0.5) # rotated x-axis text + ) + + labs( + x = "Date", # x-axis label + y = "Number of cases", # y-axis label + title = "Daily Outbreak Cases", # plot title + subtitle = "Epidemiological Data for the Outbreak", # plot subtitle + caption = "Data Source: Simulated Data" # plot caption + ) + + scale_x_date( + breaks = breaks, # set custom breaks on the x-axis + labels = scales::label_date_short() # shortened date labels + ) +``` + +Utilisez l'outil `group` dans la fonction de mappage pour visualiser une courbe épique avec différents groupes. S'il y a plus d'un facteur de regroupement, utilisez l'option `facet_wrap()` comme le montre l'exemple ci-dessous : + +```{r} +# Plot daily incidence by sex with facets +ggplot2::ggplot(data = daily_incidence_2) + + geom_histogram( + mapping = aes( + x = as.Date(date_index), + y = count, + group = sex, + fill = sex + ), + stat = "identity" + ) + + theme_minimal() + # apply minimal theme + theme( + plot.title = element_text(face = "bold", + hjust = 0.5), # bold and center the title + plot.subtitle = element_text(hjust = 0.5), # center the subtitle + plot.caption = element_text(face = "italic", hjust = 0), # italic caption + axis.title = element_text(face = "bold"), # bold axis labels + axis.text.x = element_text(angle = 45, + vjust = 0.5) # rotate x-axis text for readability + ) + + labs( + x = "Date", # x-axis label + y = "Number of cases", # y-axis label + title = "Daily Outbreak Cases by Sex", # plot title + subtitle = "Incidence of Cases Grouped by Sex", # plot subtitle + caption = "Data Source: Simulated Data" # caption for additional context + ) + + facet_wrap(~sex) + # create separate panels by sex + scale_x_date( + breaks = breaks, # set custom date breaks + labels = scales::label_date_short() # short date format for x-axis labels + ) + + scale_fill_manual(values = c("lightblue", + "lightpink")) # custom fill colors for sex +``` + +::::::::::::::::::::::::::::::::::::: challenge + +## Défi 5 : Pouvez-vous le faire ? + +- **Tâche** Produire une figure annotée pour biweekly\_incidence à l'aide de `{ggplot2}` paquet. + +:::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::: keypoints + +- Utiliser `{simulist}` pour générer des données synthétiques sur les foyers +- Utiliser `{incidence2}` pour agréger les données sur les cas en fonction d'une date d'événement et produire des courbes épidémiques. +- Utilisez `{ggplot2}` pour produire des courbes épidémiques mieux annotées. + +:::::::::::::::::::::::::::::::::::::::::::::::: + + diff --git a/locale/fr/episodes/read-cases.Rmd b/locale/fr/episodes/read-cases.Rmd new file mode 100644 index 00000000..2b283b23 --- /dev/null +++ b/locale/fr/episodes/read-cases.Rmd @@ -0,0 +1,292 @@ +--- +title: Lire les données du dossier +teaching: 20 +exercises: 10 +editor_options: + chunk_output_type: inline +--- + +:::::::::::::::::::::::::::::::::::::: questions + +- Où stockez-vous habituellement vos données sur les épidémies ? +- Combien de formats de données différents pouvez-vous utiliser pour l'analyse ? +- Pouvez-vous importer des données à partir de bases de données et d'API de santé ? + :::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::: objectives + +- Expliquez comment importer des données sur les épidémies provenant de différentes sources dans le système d'information sur la santé. `R` + l'environnement. + :::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::: prereq + +## Conditions préalables à l'utilisation du logiciel + +Cet épisode nécessite que vous soyez familier avec : + +**La science des données** Tâches de base avec R. +::::::::::::::::::::::::::::::::: + +## Introduction + +L'étape initiale de l'analyse des épidémies consiste généralement à importer l'ensemble de données cible dans le logiciel `R` à partir d'une source locale (comme un fichier sur votre ordinateur) ou d'une source externe (comme une base de données). Les données relatives aux épidémies peuvent être stockées dans différents formats, dans des systèmes de gestion de bases de données relationnelles (SGBDR) ou dans des systèmes d'information sur la santé (SIS), tels que [REDCap](https://www.project-redcap.org/) et [DHIS2](https://dhis2.org/) qui fournissent des interfaces de programme d'application (API) aux systèmes de base de données afin que les utilisateurs vérifiés puissent facilement ajouter des entrées de données et y accéder. Cette dernière option est particulièrement adaptée à la collecte et au stockage de données de santé institutionnelles à grande échelle. Cet épisode élucidera le processus de lecture des cas à partir de ces sources. + +Commençons par charger le paquet `{rio}` pour lire les données et le paquet `{here}` pour trouver facilement un chemin de fichier dans votre projet RStudio. Nous utiliserons le tube `%>%` pour relier facilement certaines de leurs fonctions, y compris les fonctions du paquetage de formatage de données `{dplyr}`. Nous appellerons donc le paquetage tidyverse, qui comprend à la fois le tuyau et le paquetage `{dplyr}`: + +```{r, eval=TRUE, message=FALSE, warning=FALSE} +# Load packages +library(tidyverse) # for {dplyr} functions and the pipe %>% +library(rio) # for importing data +library(here) # for easy file referencing +``` + +::::::::::::::::::: checklist + +### Le double point-virgule + +Le double point-virgule `::` dans R vous permet d'appeler une fonction spécifique d'un paquetage sans charger l'ensemble du paquetage dans l'environnement actuel. + +Par exemple, vous pouvez appeler une fonction spécifique d'un paquetage sans charger le paquetage entier dans l'environnement actuel, `dplyr::filter(data, condition)` utilise `filter()` à partir de l'outil `{dplyr}` sans avoir à utiliser `library(dplyr)` au début d'un script. + +Cela nous aide à nous souvenir des fonctions du paquet et à éviter les conflits d'espace de noms (c'est-à-dire lorsque deux paquets différents incluent des fonctions portant le même nom et que R ne sait pas laquelle utiliser). + +::::::::::::::::::: + +:::::::::: prereq + +### Créez un projet et un dossier + +- Créez un projet RStudio. Si nécessaire, suivez cette procédure [guide pratique sur "Hello RStudio Projects"](https://docs.posit.co/ide/user/ide/get-started/#hello-rstudio-projects) pour en créer un. +- Dans le projet RStudio, créez un fichier `data/` dossier. +- Dans le dossier `data/` enregistrez le fichier [ebola\_cases\_2.csv](https://epiverse-trace.github.io/tutorials-early/data/ebola_cases_2.csv) et [marburg.zip](https://epiverse-trace.github.io/tutorials-early/data/Marburg.zip) Fichiers CSV. + +:::::::::: + +## Lecture de fichiers + +Plusieurs logiciels sont disponibles pour importer des données de foyers stockées dans des fichiers individuels dans le logiciel `R`. Il s'agit notamment de [rio](https://gesistsa.github.io/rio/), [lire](https://readr.tidyverse.org/) de la `tidyverse`, [io](https://bitbucket.org/djhshih/io/src/master/), [ImportExport](https://cran.r-project.org/web/packages/ImportExport/index.html) et [data.table](https://rdatatable.gitlab.io/data.table/). Ensemble, ces paquets offrent des méthodes pour lire un ou plusieurs fichiers dans un large éventail de formats. + +L'exemple ci-dessous montre comment importer un fichier `csv` dans `R` à l'aide de la fonction `{rio}` package. Nous utilisons l'option `{here}` pour indiquer à R de rechercher le fichier dans l'environnement `data/` de votre projet, et `as_tibble()` pour le convertir dans un format plus ordonné en vue d'une analyse ultérieure dans R. + +```{r, eval=FALSE, echo=TRUE} +# read data +# e.g., the path to our file is data/raw-data/ebola_cases_2.csv then: +ebola_confirmed <- rio::import( + here::here("data", "ebola_cases_2.csv") +) %>% + dplyr::as_tibble() # for a simple data frame output + +# preview data +ebola_confirmed +``` + +```{r, eval=TRUE, echo=FALSE, message=FALSE} +# internal for DBI::dbWriteTable() +# read data +ebola_confirmed <- rio::import( + file.path("data", "ebola_cases_2.csv") +) %>% + dplyr::as_tibble() # for a simple data frame output + +# preview data +ebola_confirmed +``` + +De même, vous pouvez importer des fichiers d'autres formats tels que `tsv`, `xlsx`... etc. + +:::::::::::::::::::: checklist + +### Pourquoi devrions-nous utiliser le {here} Pourquoi devrions-nous utiliser le paquetage + +Les `{here}` est conçu pour simplifier le référencement des fichiers dans les projets R en fournissant un moyen fiable de construire les chemins d'accès aux fichiers par rapport à la racine du projet. La principale raison de l'utiliser est **Compatibilité entre environnements**. + +Il fonctionne sur différents systèmes d'exploitation (Windows, Mac, Linux) sans qu'il soit nécessaire d'ajuster les chemins d'accès aux fichiers. + +- Sous Windows, les chemins d'accès sont écrits en utilisant des barres obliques inverses ( `\` ) comme séparateur entre les noms de dossiers : `"data\raw-data\file.csv"` +- Sur les systèmes d'exploitation Unix tels que macOS ou Linux, la barre oblique ( `/` ) est utilisée comme séparateur de chemin : `"data/raw-data/file.csv"` + +L'élément `{here}` est idéal pour ajouter une couche supplémentaire de reproductibilité à votre travail. Si vous êtes intéressé par la reproductibilité, nous vous invitons à [lire ce tutoriel pour accroître l'ouverture, la durabilité et la reproductibilité de vos analyses épidémiques avec R](https://epiverse-trace.github.io/research-compendium/) + +:::::::::::::::::::: + +::::::::::::::::::::::::::::::::: challenge + +### Lecture de données compressées + +Prenez 1 minute : +Pouvez-vous lire les données d'un fichier compressé en `R`? Téléchargez ceci [fichier zip](https://epiverse-trace.github.io/tutorials-early/data/Marburg.zip) contenant les données relatives à l'épidémie de Marburg et importez-le dans votre environnement de travail. + +::::::::::::::::: hint + +Vous pouvez vérifier le fichier [liste complète des formats de fichiers pris en charge](https://gesistsa.github.io/rio/#supported-file-formats) +dans le `{rio}` sur le site web du paquet. Pour développer {rio} à la gamme complète de supports pour les formats d'importation et d'exportation, exécutez : + +```{r, eval=FALSE} +rio::install_formats() +``` + +Vous pouvez utiliser ce modèle pour lire le fichier : + +`rio::import(here::here("some", "where", "downto", "path", "file_name.zip"))` + +:::::::::::::::::::::: + +::::::::::::::::: solution + +```{r, eval=FALSE} +rio::import(here::here("data", "Marburg.zip")) +``` + +:::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::: + +## Lecture des bases de données + +Les [DBI](https://dbi.r-dbi.org/) sert d'interface polyvalente pour interagir avec les systèmes de gestion de bases de données (SGBD) à travers différents serveurs ou backends. Il offre une méthode uniforme pour accéder aux données et les récupérer à partir de différents systèmes de base de données. + +::::::::::::: discussion + +### Quand lire directement une base de données ? + +Nous pouvons utiliser des interfaces de base de données pour optimiser l'utilisation de la mémoire. Si nous traitons la base de données avec des "requêtes" (par exemple, sélectionner, filtrer, résumer) avant l'extraction, nous pouvons réduire la charge de mémoire dans notre session RStudio. À l'inverse, le fait d'effectuer toutes les manipulations de données en dehors du système de gestion de base de données en chargeant l'ensemble des données dans R peut utiliser beaucoup plus de mémoire informatique (c.-à-d. RAM) que ce qui est possible sur une machine locale, ce qui peut entraîner un ralentissement, voire un blocage de RStudio. + +Les systèmes de gestion de bases de données relationnelles (SGBDR) externes présentent également l'avantage de permettre à plusieurs utilisateurs d'accéder, de stocker et d'analyser simultanément des parties de l'ensemble de données, sans devoir transférer des fichiers individuels, ce qui rendrait très difficile le suivi de la version la plus récente. + +::::::::::::: + +Le morceau de code suivant montre en quatre étapes comment créer une base de données SQLite temporaire en mémoire, stocker le fichier `ebola_confirmed` en tant que table, puis de la lire : + +### 1\. Connectez-vous à une base de données + +Tout d'abord, nous établissons une connexion avec une base de données SQLite créée sur notre machine et stockée dans sa mémoire locale avec `DBI::dbConnect()`. + +```{r, warning=FALSE, message=FALSE} +library(DBI) +library(RSQLite) + +# Create a temporary SQLite database in memory +db_connection <- DBI::dbConnect( + drv = RSQLite::SQLite(), + dbname = ":memory:" +) +``` + +::::::::::::::::: callout + +Une connexion réelle à une base de données SQLite externe ressemblerait à ceci : + +```r +# in real-life +db_connection <- DBI::dbConnect( + RSQLite::SQLite(), + host = "database.epiversetrace.com", + user = "juanito", + password = epiversetrace::askForPassword("Database password") +) +``` + +::::::::::::::::: + +### 2\. Écrire une base de données locale en tant que table dans une base de données + +Ensuite, nous pouvons écrire le `ebola_confirmed` dans une table nommée `cases` dans la base de données à l'aide de l'option `DBI::dbWriteTable()` à l'aide de la fonction + +```{r, warning=FALSE, message=FALSE} +# Store the 'ebola_confirmed' dataframe as a table named 'cases' +# in the SQLite database +DBI::dbWriteTable( + conn = db_connection, + name = "cases", + value = ebola_confirmed +) +``` + +Dans un cadre de base de données, vous pouvez avoir plus d'une table. Chaque table peut appartenir à une `entity` (par exemple, les patients, les unités de soins, les emplois). Toutes les tables seront reliées par un identifiant commun ou `primary key`. + +### 3\. Lire les données d'un tableau dans une base de données + + + + + + + + + + + + + + + + + +Ensuite, nous lisons les données du fichier `cases` en utilisant `dplyr::tbl()`. + +```{r} +# Read one table from the database +mytable_db <- dplyr::tbl(src = db_connection, "cases") +``` + +Si nous appliquons `{dplyr}` à cette base de données SQLite, ces verbes seront traduits en requêtes SQL. + +```{r} +# Show the SQL queries translated +mytable_db %>% + dplyr::filter(confirm > 50) %>% + dplyr::arrange(desc(confirm)) %>% + dplyr::show_query() +``` + +### 4\. Extraire des données de la base de données + +Utiliser `dplyr::collect()` pour forcer le calcul d'une requête de base de données et extraire la sortie sur votre ordinateur local. + +```{r} +# Pull all data down to a local tibble +extracted_data <- mytable_db %>% + dplyr::filter(confirm > 50) %>% + dplyr::arrange(desc(confirm)) %>% + dplyr::collect() +``` + +L'option `extracted_data` représente l'extrait, idéalement après avoir spécifié des requêtes qui réduisent sa taille. + +```{r, warning=FALSE, message=FALSE} +# View the extracted_data +extracted_data +``` + +:::::::::::::::::::::: callout + +### Exécutez des requêtes SQL dans R à l'aide de dbplyr + +Entraînez-vous à faire des requêtes SQL sur des bases de données relationnelles en utilisant plusieurs logiciels. `{dplyr}` verbes comme `dplyr::left_join()` parmi les tables avant d'extraire les données vers votre session locale avec `dplyr::collect()`! + +Vous pouvez également passer en revue les `{dbplyr}` R. Mais pour un tutoriel pas à pas sur SQL, nous vous recommandons ce qui suit [tutoriel sur la gestion des données avec SQL pour Ecologist](https://datacarpentry.org/sql-ecology-lesson/). Vous y trouverez près de `{dplyr}`! + +:::::::::::::::::::::: + +### 5\. Fermez la connexion à la base de données + +Enfin, nous pouvons fermer la connexion à la base de données avec `dbDisconnect()`. + +```{r, warning=FALSE, message=FALSE} +# Close the database connection +DBI::dbDisconnect(conn = db_connection) +``` + +## Lecture des API HIS + +Les données relatives à la santé sont également de plus en plus souvent stockées dans des API HIS spécialisées telles que **Le bout des doigts**, **GoData**, **REDCap** et **DHIS2**. Dans ce cas, il est possible de recourir à [readepi](https://epiverse-trace.github.io/readepi/) qui permet de lire les données des HIS-API. + - [TBC] + +::::::::::::::::::::::::::::::::::::: keypoints + +- Utilisation `{rio}, {io}, {readr}` et `{ImportExport}` pour lire les données des différents fichiers. +- Utiliser `{readepi}` pour lire les données des API HIS et des SGBDR. + :::::::::::::::::::::::::::::::::::::::::::::::: + + diff --git a/locale/fr/episodes/simple-analysis.Rmd b/locale/fr/episodes/simple-analysis.Rmd new file mode 100644 index 00000000..a7d08446 --- /dev/null +++ b/locale/fr/episodes/simple-analysis.Rmd @@ -0,0 +1,194 @@ +--- +title: Une analyse simple +teaching: 20 +exercises: 10 +--- + +:::::::::::::::::::::::::::::::::::::: questions + +- Quel est le taux de croissance de l'épidémie ? +- Comment identifier le pic d'une épidémie ? +- Comment calculer la moyenne mobile des cas ? + +:::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::: objectives + +- Effectuer une analyse préliminaire des données relatives aux épidémies +- Identifier les tendances, l'exponentiel, le doublement et l'heure de pointe + +:::::::::::::::::::::::::::::::::::::::::::::::: + +## Introduction + +Il est essentiel de comprendre les tendances des données de surveillance pour comprendre les moteurs et la dynamique des épidémies. Il peut s'agir de prévoir la charge de morbidité, de planifier les futures interventions de santé publique et d'évaluer l'efficacité des mesures de contrôle antérieures. En analysant les tendances, les décideurs politiques et les experts en santé publique peuvent prendre des décisions éclairées pour limiter la propagation des maladies et protéger la santé publique. Cet épisode se concentre sur la manière d'effectuer une simple analyse préliminaire des données d'incidence. Il utilise le même ensemble de données de **données sur les cas de Covid-19 en Angleterre** qui a été utilisé dans l'épisode [Agréger et visualiser](../episodes/describe-cases.Rmd) épisode. + +::::::::::::::::::: checklist + +### Le double point-virgule + +Le double point-virgule `::` dans R vous permettent d'appeler une fonction spécifique d'un paquet sans charger l'ensemble du paquet dans l'environnement actuel. + +Par exemple, vous pouvez appeler une fonction spécifique d'un package sans charger le package entier dans l'environnement actuel, `dplyr::filter(data, condition)` utilise `filter()` à partir de l'outil `{dplyr}` paquet. + +Cela nous permet de nous souvenir des fonctions du paquet et d'éviter les conflits d'espace de noms. + +::::::::::::::::::: + +## Modèle simple + +Les données agrégées sur les cas au cours d'unités de temps spécifiques (c'est-à-dire les données d'incidence) représentent généralement le nombre de cas qui surviennent au cours de cette période. Nous pouvons considérer ces cas comme des observations bruitées générées par le processus épidémique sous-jacent (que nous ne pouvons pas observer directement). Pour tenir compte du caractère aléatoire des observations, nous pouvons supposer que les cas observés suivent soit `Poisson distribution` (si les cas sont signalés à un taux moyen constant au fil du temps) ou un `negative binomial (NB) distribution` (s'il existe une variabilité potentielle dans la déclaration au fil du temps). Lors de l'analyse de ces données, une approche courante consiste à examiner la tendance au fil du temps en calculant le taux de changement, qui peut indiquer s'il y a une croissance ou une décroissance exponentielle du nombre de cas. Une croissance exponentielle implique que le nombre de cas augmente à un rythme accéléré au fil du temps, tandis qu'une décroissance exponentielle suggère que le nombre de cas diminue à un rythme décéléré. + +Les `i2extras` fournit des méthodes pour modéliser la tendance des données sur les cas, calculer les moyennes mobiles et le taux de croissance ou de décroissance exponentielle. Le morceau de code ci-dessous calcule la tendance de la Covid-19 au Royaume-Uni au cours des trois premiers mois en utilisant une distribution binomiale négative. + +```{r, warning=FALSE, message=FALSE} +# load packages which provides methods for modeling +library(i2extras) +library(incidence2) + +# read data from {outbreaks} package +covid19_eng_case_data <- outbreaks::covid19_england_nhscalls_2020 + +# subset the covid19_eng_case_data to include only the first 3 months of data +df <- base::subset( + covid19_eng_case_data, + covid19_eng_case_data$date <= min(covid19_eng_case_data$date) + 90 +) + +# uses the incidence function from the incidence2 package to compute the +# incidence data +df_incid <- incidence2::incidence( + df, + date_index = "date", + groups = "sex" +) + +# fit a curve to the incidence data. The model chosen is the negative binomial +# distribution with a significance level (alpha) of 0.05. +fitted_curve_nb <- + i2extras::fit_curve( + df_incid, + model = "negbin", + alpha = 0.05 + ) + +# plot fitted curve +base::plot(fitted_curve_nb, angle = 45) + + ggplot2::labs(x = "Date", y = "Cases") +``` + +::::::::::::::::::::::::::::::::::::: challenge + +## Défi 1 : Distribution de Poisson + +Répétez l'analyse ci-dessus en utilisant la distribution de Poisson. + +:::::::::::::::::::::::: solution + +```{r, warning=FALSE, message=FALSE} +fitted_curve_poisson <- + i2extras::fit_curve( + x = df_incid, + model = "poisson", + alpha = 0.05 + ) + +base::plot(fitted_curve_poisson, angle = 45) + + ggplot2::labs(x = "Date", y = "Cases") +``` + +::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::: + +## Taux de croissance ou de décroissance exponentiel + +Le taux de croissance ou de décroissance exponentielle, noté $r$ sert d'indicateur de la tendance des cas, indiquant s'ils augmentent (croissance) ou diminuent (décroissance) sur une échelle exponentielle. Ce taux est calculé à l'aide de la méthode dite **équation de renouvellement** [(Wallinga et al. 2006)](https://royalsocietypublishing.org/doi/10.1098/rspb.2006.3754) qui relie mécaniquement le nombre de reproducteurs $R$ de nouveaux cas (c'est-à-dire le nombre moyen de personnes infectées par un cas typique) à l'intervalle de génération de la maladie (c'est-à-dire le délai moyen entre une infection et la suivante dans une chaîne de transmission). Cette méthode de calcul est mise en œuvre dans le `{i2extras}` paquet. + +Vous trouverez ci-dessous un extrait de code démontrant comment extraire le taux de croissance/décroissance à partir des données ci-dessus. **binomiale négative** ci-dessus à l'aide de la fonction `growth_rate()` fonction : + +```{r, message=FALSE, warning=FALSE} +rates_nb <- i2extras::growth_rate(fitted_curve_nb) +rates_nb <- base::as.data.frame(rates_nb) |> + subset(select = c(sex, r, r_lower, r_upper)) +base::print(rates_nb) +``` + +::::::::::::::::::::::::::::::::::::: challenge + +## Défi 2 : Taux de croissance à partir d'une **Poisson**\-courbe ajustée + +Extraire les taux de croissance de la **Poisson**\-de Poisson de **Défi 1**? + +:::::::::::::::::::::::::::::::::::::::::::::::: + +## Temps de pointe + +L'heure de pointe **heure de pointe** est l'heure à laquelle le plus grand nombre de cas est observé dans les données agrégées. Elle peut être estimée à l'aide de la méthode `i2extras::estimate_peak()` comme le montre le morceau de code ci-dessous, qui identifie l'heure de pointe à partir des données de l'enquête. `incidenc2` l'objet `df_incid`. + +```{r, message=FALSE, warning=FALSE} +peaks_nb <- i2extras::estimate_peak(df_incid, progress = FALSE) |> + subset(select = -c(count_variable, bootstrap_peaks)) + +base::print(peaks_nb) +``` + +## Moyenne mobile + +Une moyenne mobile ou glissante calcule le nombre moyen de cas au cours d'une période donnée. Pour ce faire, vous pouvez utiliser la fonction `add_rolling_average()` de la fonction `{i2extras}` sur un fichier `incidence2 object`. Le morceau de code suivant illustre le calcul de la moyenne hebdomadaire du nombre de cas à partir de la fonction `incidence2` l'objet `df_incid` suivi d'une visualisation. + +```{r, warning=FALSE, message=FALSE} +library(ggplot2) + +moving_Avg_week <- i2extras::add_rolling_average(df_incid, n = 7L) + +base::plot(moving_Avg_week, border_colour = "white", angle = 45) + + ggplot2::geom_line( + ggplot2::aes( + x = date_index, + y = rolling_average, + color = "red" + ) + ) + + ggplot2::labs(x = "Date", y = "Cases") +``` + +::::::::::::::::::::::::::::::::::::: challenge + +## Défi 3 : Moyenne mobile mensuelle + +Calculez et visualisez la moyenne mobile mensuelle des cas sur `df_incid`? + +:::::::::::::::::::::::: solution + +```{r, warning=FALSE, message=FALSE} +moving_Avg_mont <- i2extras::add_rolling_average(df_incid, n = 30L) + +base::plot( + moving_Avg_mont, + border_colour = "white", + angle = 45 +) + + ggplot2::geom_line( + ggplot2::aes( + x = date_index, + y = rolling_average, + color = "red" + ) + ) + + ggplot2::labs(x = "Date", y = "Cases") +``` + +::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::: keypoints + +- Utilisez `{i2extras}` pour : + - ajuster l'épi-courbe en utilisant soit **Poisson** ou **binomiale négative** négative, + - calculer la croissance ou la décroissance exponentielle des cas, + - trouver l'heure de pointe, et + - calculer la moyenne mobile des cas dans la fenêtre temporelle spécifiée. + +:::::::::::::::::::::::::::::::::::::::::::::::: + + diff --git a/locale/fr/episodes/validate.Rmd b/locale/fr/episodes/validate.Rmd new file mode 100644 index 00000000..37770e6d --- /dev/null +++ b/locale/fr/episodes/validate.Rmd @@ -0,0 +1,392 @@ +--- +title: Valider les données du dossier +teaching: 10 +exercises: 2 +--- + +:::::::::::::::::::::::::::::::::::::: questions + +- Comment convertir un ensemble de données brutes en un fichier `linelist` objet ? + +:::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::: objectives + +- Démontrez comment convertir des données de cas en `linelist` données +- Démontrer comment étiqueter et valider les données pour rendre l'analyse plus fiable + +:::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::: prereq + +Cet épisode vous demande de : + +- Télécharger le [données\_nettoyées.csv](https://epiverse-trace.github.io/tutorials-early/data/cleaned_data.csv) +- Sauvegardez-le dans le fichier `data/` dossier. + +::::::::::::::::::::: + +## Introduction + +Dans l'analyse des épidémies, une fois que vous avez terminé les étapes initiales de lecture et de nettoyage des données de cas, +il est essentiel d'établir une couche de fondation supplémentaire pour garantir l'intégrité et la fiabilité des données ultérieures. +analyses ultérieures. Dans le cas contraire, vous risquez de constater que votre analyse cesse soudainement de fonctionner lorsque des variables spécifiques apparaissent ou disparaissent, ou que leurs types de données sous-jacents (tels que `` ou ``). Plus précisément, cette couche supplémentaire implique : 1) de vérifier la présence et le type de données correctes de certaines colonnes au sein de +dans votre ensemble de données, un processus communément appelé "étiquetage" ; 2) la mise en œuvre de mesures pour +vérifier que ces colonnes marquées ne sont pas supprimées par inadvertance lors d'étapes ultérieures de traitement des données, ce que l'on appelle la "validation". + +Cet épisode se concentre sur le balisage et la validation des données de foyers à l'aide de l'outil [liste de lignes](https://epiverse-trace.github.io/linelist/) +à l'aide du paquetage linelist. Commençons par charger le paquet `{rio}` pour lire les données et le paquet `{linelist}` +pour créer un objet linelist. Nous utiliserons le tuyau `%>%` pour connecter certaines de leurs fonctions, y compris celles de +du paquet `{dplyr}` Nous allons donc également faire appel au paquet tidyverse : + +```{r, eval=TRUE, message=FALSE, warning=FALSE} +# Load packages +library(tidyverse) # for {dplyr} functions and the pipe %>% +library(rio) # for importing data +library(here) # for easy file referencing +library(linelist) # for taggin and validating +``` + +::::::::::::::::::: checklist + +### Le double point-virgule + +Le double point-virgule `::` dans R vous permet d'appeler une fonction spécifique d'un paquetage sans charger le paquetage entier dans le fichier +l'environnement actuel. + +Par exemple, vous pouvez appeler une fonction spécifique d'un paquetage sans charger le paquetage entier dans l'environnement actuel, `dplyr::filter(data, condition)` utilise `filter()` à partir de l'outil `{dplyr}` paquet. + +Cela nous permet de nous souvenir des fonctions du paquet et d'éviter les conflits d'espace de noms. + +::::::::::::::::::: + +Importez l'ensemble de données en suivant les directives énoncées dans le document [Lire les données de l'affaire](../episodes/read-cases.Rmd) de l'épisode Lire les données de l'affaire. +Il s'agit de charger l'ensemble de données dans l'environnement de travail et de visualiser sa structure et son contenu. + +```{r, eval=FALSE} +# Read data +# e.g.: if path to file is data/simulated_ebola_2.csv then: +cleaned_data <- rio::import( + here::here("data", "cleaned_data.csv") +) %>% + dplyr::as_tibble() # for a simple data frame output +``` + +```{r, echo=FALSE} +# Import cleaned data without printing code +cleaned_data <- rio::import( + file.path("data", "cleaned_data.csv") +) %>% + dplyr::as_tibble() # Convert to tibble for better data display + +# Display the first five rows of the dataset +cleaned_data +``` + +:::::::::::::::::::::::: discussion + + + +### Un changement inattendu + +Vous êtes dans une situation d'urgence. Vous devez produire des rapports de situation quotidiens. Vous avez automatisé votre analyse pour lire les données directement à partir du serveur en ligne :grin :. Cependant, les personnes chargées de la collecte et de l'administration des données devaient **supprimer/renommer/reformater** une variable que vous aviez trouvée utile :disappointed: ! + +Comment pouvez-vous détecter si les données saisies sont **toujours valides** pour reproduire le code d'analyse que vous avez écrit la veille ? + +:::::::::::::::::::::::: + +:::::::::::::::::::::::: instructor + +Si les apprenants n'ont pas d'expérience à partager, nous, en tant qu'instructeurs, pouvons en partager une. + +Un tel scénario se produit généralement lorsque l'institution qui effectue l'analyse n'est pas la même que celle qui collecte les données. Cette dernière peut prendre des décisions sur la structure des données qui peuvent affecter les processus en aval et avoir un impact sur le temps ou la précision des résultats de l'analyse. + +:::::::::::::::::::::::: + +## Création d'une liste de contrôle et étiquetage des éléments + +Une fois les données chargées et nettoyées, nous les convertissons en un fichier `linelist` à l'aide d'un objet `{linelist}` comme dans l'exemple suivant +ci-dessous. + +```{r} +# Create a linelist object from cleaned data +linelist_data <- linelist::make_linelist( + x = cleaned_data, # Input data + id = "case_id", # Column for unique case identifiers + date_onset = "date_onset", # Column for date of symptom onset + gender = "gender" # Column for gender +) + +# Display the resulting linelist object +linelist_data +``` + +Le paquet `{linelist}` fournit des étiquettes pour les variables épidémiologiques courantes +et un ensemble de types de données appropriés pour chacune d'entre elles. Vous pouvez consulter la liste des étiquettes disponibles à partir du nom de la variable +et les types de données acceptables pour chacune d'entre elles en utilisant `linelist::tags_types()`. + +::::::::::::::::::::::::::::::::::::: challenge + +Voyons **tag** plus de variables. Dans les nouveaux ensembles de données, il sera fréquent que les noms de variables soient différents des noms de balises disponibles. Cependant, nous pouvons les associer en fonction de la façon dont les variables ont été définies pour la collecte des données. + +Maintenant, vous pouvez les associer en fonction de la façon dont les variables ont été définies pour la collecte des données : + +- **Explorer** les noms de balises disponibles dans {linelist}. +- **Trouver** quelles autres variables de l'ensemble de données nettoyé peuvent être associées à l'une des étiquettes disponibles. +- **Étiquette** ces variables comme ci-dessus en utilisant `linelist::make_linelist()`. + +:::::::::::::::::::: hint + +Vous pouvez accéder à la liste des noms de balises disponibles dans la rubrique {linelist} en utilisant : + +```{r, eval=FALSE} +# Get a list of available tags by name and data types +linelist::tags_types() + +# Get a list of names only +linelist::tags_names() +``` + +::::::::::::::::::::::: + +::::::::::::::::: solution + +```{r, eval=FALSE} +linelist::make_linelist( + x = cleaned_data, + id = "case_id", + date_onset = "date_onset", + gender = "gender", + age = "age", # same name in default list and dataset + date_reporting = "date_sample" # different names but related +) +``` + +Comment ces balises supplémentaires sont-elles visibles dans le résultat ? + +:::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::: + +## Validation + +S'assurer que toutes les variables marquées sont normalisées et que les données sont correctes. +utilisez la fonction `linelist::validate_linelist()` comme +comme le montre l'exemple ci-dessous : + +```r +linelist::validate_linelist(linelist_data) +``` + + + + + + + +::::::::::::::::::::::::: challenge + +Faisons en sorte que **validons** quelques variables marquées. Simulons une situation dans le cadre d'une épidémie en cours. Vous vous réveillez un jour et découvrez que le flux de données sur lequel vous vous appuyez comporte un nouvel ensemble d'entrées (c'est-à-dire de lignes ou d'observations) et une variable dont le type de données a changé. + +Par exemple, supposons que la variable `age` est passée d'un double (``) en caractère (``). + +Pour simuler cette situation : + +- **Changer** le type de données de la variable, +- **étiquette** la variable dans une liste de lignes, puis +- **valider** il. + +Décrivez comment `linelist::validate_linelist()` réagit lorsque les données d'entrée ont un type de données variable différent. + +:::::::::::::::::::::::::: hint + +Nous pouvons utiliser `dplyr::mutate()` pour modifier le type de la variable avant de l'étiqueter pour la validation. Par exemple, nous pouvons changer le type de variable avant de la baliser pour la validation : + +```{r, eval=FALSE} +cleaned_data %>% + # simulate a change of data type in one variable + dplyr::mutate(age = as.character(age)) %>% + # tag one variable + linelist::... %>% + # validate the linelist + linelist::... +``` + +:::::::::::::::::::::::::: + +:::::::::::::::::::::::::: hint + +> Veuillez exécuter le code ligne par ligne, en vous concentrant uniquement sur les parties situées avant le tuyau (`%>%`). Après chaque étape, observez la sortie avant de passer à la ligne suivante. + +Si le résultat `age` passe de double (``) en caractère (``), nous obtenons ce qui suit : + +```{r} +cleaned_data %>% + # simulate a change of data type in one variable + dplyr::mutate(age = as.character(age)) %>% + # tag one variable + linelist::make_linelist( + age = "age" + ) %>% + # validate the linelist + linelist::validate_linelist() +``` + +Pourquoi recevons-nous un `Error` message ? + + + +Explorez d'autres situations pour comprendre ce comportement. Essayons ces modifications supplémentaires des variables : + +- `date_onset` changements de a `` en caractère (``), +- `gender` passe d'un caractère (``) à un nombre entier (``). + +Ensuite, marquez-les dans une liste de lignes pour validation. Est-ce que le `Error` nous propose-t-il la solution ? + +:::::::::::::::::::::::::: + +::::::::::::::::::::::::: solution + +```{r, eval=FALSE} +# Change 2 +# Run this code line by line to identify changes +cleaned_data %>% + # simulate a change of data type + dplyr::mutate(date_onset = as.character(date_onset)) %>% + # tag + linelist::make_linelist( + date_onset = "date_onset" + ) %>% + # validate + linelist::validate_linelist() +``` + +```{r, eval=FALSE} +# Change 3 +# Run this code line by line to identify changes +cleaned_data %>% + # simulate a change of data type + dplyr::mutate(gender = as.factor(gender)) %>% + dplyr::mutate(gender = as.integer(gender)) %>% + # tag + linelist::make_linelist( + gender = "gender" + ) %>% + # validate + linelist::validate_linelist() +``` + +Nous obtenons `Error` des messages en raison de la non-concordance entre le type de balise prédéfini (de `linelist::tags_types()`) et la classe de variables balisées dans la liste de contrôle. + +Les `Error` Le message nous informe que pour **valider** notre liste de lignes, nous devons fixer le type de variable d'entrée pour qu'il corresponde au type d'étiquette attendu. Dans un script d'analyse de données, nous pouvons le faire en ajoutant une étape de nettoyage dans le pipeline. + +::::::::::::::::::::::::: + +::::::::::::::::::::::::: + +::::::::::::::::::::::::: challenge + +Quelle étape de la `{linelist}` workflow de marquage et de validation répondrait à l'absence d'une variable ? + +:::::::::::::::::::::::::: solution + +En ce qui concerne la perte de variables, vous pouvez simuler ce scénario : + +```{r} +cleaned_data %>% + # simulate a change of data type in one variable + select(-age) %>% + # tag one variable + linelist::make_linelist( + age = "age" + ) +``` + +:::::::::::::::::::::::::: + +::::::::::::::::::::::::: + +## Sauvegarde + +La sauvegarde est implicitement intégrée dans les objets de la liste de diffusion. Si vous essayez d'abandonner l'un des objets +vous recevrez un message d'erreur ou d'avertissement, comme le montre l'exemple ci-dessous. + +```{r, warning=TRUE} +new_df <- linelist_data %>% + dplyr::select(case_id, gender) +``` + +Ce message d'erreur ou d'avertissement s'affiche dans l'exemple ci-dessous. `Warning` ci-dessus est l'option de sortie par défaut lorsque nous perdons des balises dans un fichier `linelist` dans un objet. Cependant, il peut être remplacé par un message `Error` en utilisant `linelist::lost_tags_action()`. + +::::::::::::::::::::::::::::::::::::: challenge + +Testons les implications de la modification de l'élément **sauvegarde** d'une configuration `Warning` à une `Error` message. + +- Tout d'abord, exécutez ce code pour compter la fréquence par catégorie au sein d'une variable catégorielle : + +```{r, eval=FALSE} +linelist_data %>% + dplyr::select(case_id, gender) %>% + dplyr::count(gender) +``` + +- Définir le comportement pour les étiquettes perdues dans un `linelist` à "erreur" comme suit : + +```{r, eval=FALSE} +# set behavior to "error" +linelist::lost_tags_action(action = "error") +``` + +- Maintenant, réexécutez le segment de code ci-dessus avec `dplyr::count()`. + +Identifiez : + +- Quelle est la différence entre la production d'un `Warning` et un `Error`? +- Quelles pourraient être les implications de ce changement pour votre pipeline quotidien d'analyse de données lors d'une réponse à une épidémie ? + +:::::::::::::::::::::::: solution + +Décider entre `Warning` ou `Error` dépendra du niveau d'attention ou de flexibilité dont vous avez besoin lorsque vous perdez des balises. L'un vous alertera d'un changement mais continuera à exécuter le code en aval. L'autre arrêtera votre pipeline d'analyse et le reste ne sera pas exécuté. + +Un script de lecture, de nettoyage et de validation des données peut nécessiter un pipeline plus stable ou fixe. Une analyse exploratoire des données peut nécessiter une approche plus souple. Ces deux processus peuvent être isolés dans des scripts ou des référentiels différents afin d'adapter la sauvegarde à vos besoins. + +Avant de continuer, rétablissez la configuration à l'option par défaut de `Warning`: + +```{r} +# set behavior to the default option: "warning" +linelist::lost_tags_action() +``` + +:::::::::::::::::::::::: + +:::::::::::::::::::::::::::::::::::::::::::::::: + +A `linelist` ressemble à un cadre de données mais offre des caractéristiques plus riches. +et des fonctionnalités plus riches. Les paquets qui prennent en compte les listes de liens peuvent exploiter ces objets. +fonctionnalités. Par exemple, vous pouvez extraire un cadre de données contenant uniquement les colonnes étiquetées +à l'aide de la fonction `linelist::tags_df()` comme indiqué ci-dessous : + +```{r, warning=FALSE} +linelist::tags_df(linelist_data) +``` + +Cela permet d'extraire les colonnes étiquetées uniquement dans l'analyse en aval, ce qui sera utile pour le prochain épisode ! + +:::::::::::::::::::::::::::::::::::: checklist + +### Quand dois-je utiliser `{linelist}`? + +L'analyse des données au cours d'une réponse à une épidémie ou d'une surveillance de masse exige un ensemble différent de "sauvegardes des données" par rapport aux situations de recherche habituelles. Par exemple, vos données changeront ou seront mises à jour au fil du temps (nouvelles entrées, nouvelles variables, variables renommées). + +`{linelist}` L'outil de collecte de données est plus approprié pour ce type d'analyse continue ou à long terme. +Consultez la section de la vignette "Pour commencer" à propos de +[Quand devriez-vous envisager d'utiliser {linelist}?](https://epiverse-trace.github.io/linelist/articles/linelist.html#should-i-use-linelist) pour plus d'informations. + +::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::: keypoints + +- Utiliser `{linelist}` pour étiqueter, valider et préparer les données de cas pour l'analyse en aval. + +:::::::::::::::::::::::::::::::::::::::::::::::: + + diff --git a/locale/fr/learners/setup.md b/locale/fr/learners/setup.md new file mode 100644 index 00000000..3f325876 --- /dev/null +++ b/locale/fr/learners/setup.md @@ -0,0 +1,277 @@ +--- +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()`. + +- **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 +# for episodes on read, clean, validate and visualize linelist + +if(!require("pak")) install.packages("pak") + +new_packages <- c( + "cleanepi", + "rio", + "here", + "DBI", + "RSQLite", + "dbplyr", + "linelist", + "epiverse-trace/simulist", + "incidence2", + "epiverse-trace/tracetheme", + "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 les paquets epiverse-trace ? + +Si vous obtenez un message d'erreur lors de l'installation de {simulist} essayez ce code alternatif : + +```r +# for simulist +install.packages("simulist", repos = c("https://epiverse-trace.r-universe.dev")) + +# for tracetheme +install.packages("tracetheme", repos = c("https://epiverse-trace.r-universe.dev")) +``` + +::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::: spoiler + +### obtenez-vous un message d'erreur avec un autre paquet ? + +Essayez d'utiliser la fonction de code classique pour installer un paquet, par exemple : + +```r +install.packages("rio") +``` + +::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::: spoiler + +### 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 ces trois étapes 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 {epiparameter}: + +```r +if(!require("remotes")) install.packages("remotes") +remotes::install_github("epiverse-trace/epiparameter") +``` + +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 +# for episodes on read, clean, validate and visualize linelist + +library(cleanepi) +library(rio) +library(here) +library(DBI) +library(RSQLite) +library(dbplyr) +library(linelist) +library(simulist) +library(incidence2) +library(tracetheme) +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)! + +### 3\. Créez un projet et un dossier RStudio + +Nous vous suggérons d'utiliser les projets RStudio. + +::::::::::::::::::::::::::::::::: checklist + +#### Suivez les étapes suivantes + +- **Créer un projet RStudio**. Si nécessaire, suivez cette procédure [guide pratique sur "Hello RStudio Projects"](https://docs.posit.co/ide/user/ide/get-started/#hello-rstudio-projects) pour créer un nouveau projet dans un nouveau répertoire. +- **Créez** l'entreprise `data/` dans le projet RStudio ou dans le répertoire correspondant. Utilisez l'option `data/` pour **enregistrer** les ensembles de données à télécharger. + +Le répertoire d'un projet RStudio nommé par exemple `training` devrait ressembler à ceci : + +``` +training/ +|__ data/ +|__ training.Rproj +``` + +**Projets RStudio** vous permet d'utiliser *fichier relatif* relatifs par rapport à l'élément `R` projet, +ce qui rend votre code plus portable et moins sujet aux erreurs. +Évite d'utiliser `setwd()` avec *chemins absolus* +comme `"C:/Users/MyName/WeirdPath/training/data/file.csv"`. + +::::::::::::::::::::::::::::::::: + +### 4\. Créez un compte GitHub + +Nous pouvons utiliser [GitHub](https://github.com) comme plateforme de collaboration pour communiquer sur les problèmes liés aux paquets et s'engager dans des projets de développement. [discussions au sein de la communauté](https://github.com/orgs/epiverse-trace/discussions). + +::::::::::::::::::::::::::::::::: checklist + +#### Suivez toutes ces étapes + +1. Allez à l'adresse suivante et suivez le lien "S'inscrire" en haut à droite de la fenêtre. +2. Suivez les instructions pour créer un compte. +3. Vérifiez votre adresse électronique auprès de GitHub. + + +- +- +- +- + +## 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) + +