Lecture des données épidémiologiques

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

Vue d'ensemble

Questions

  • Où stockez-vous habituellement vos données épidémiologiques ?
  • Quels sont les formats des données que vous utilisez pour vos analyses ?
  • Pouvez-vous importer des données à partir de bases de données et de system d’information de santé (SIS) à travers leur API ?

Objectifs

  • Expliquez comment importer des données épidémiologiques dans R à partir de différentes sources.

Conditions préalables à l’utilisation du logiciel

Cet épisode nécessite que vous soyez familier avec Science des données: Tâches de base avec R.

Introduction


L’étape initiale de l’analyse de données épidémiologiques consiste généralement à importer le jeu de données d’intérêt 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 des fichiers sous multiples formats, dans des systèmes de gestion de bases de données relationnelles (SGBDR) ou dans des systèmes d’information sanitaires (SIS), tels que SORMAS et DHIS2 qui fournissent une interface de programme d’application (API) à la base de données du système afin que les utilisateurs vérifiés puissent facilement y ajouter et en extraire des données. Cette dernière option est particulièrement adaptée à la collecte et au stockage de large données de santé par les institutions. Cet épisode élucidera le processus de lecture de données à partir de ces sources.

Commençons par charger la librairie rio pour importer les données stockées dans des fichiers et la librairie here pour trouver facilement un chemin d’accès à ces fichiers dans votre projet RStudio. Nous utiliserons l’opérateur pipe (%>%) de la librairie magrittr pour relier facilement certaines de leurs fonctions, y compris les fonctions de la librairie de formatage de données dplyr. Nous chargerons donc la librairie tidyverse, qui comprend à la fois les librairies magrittr et dplyr.

R

# charger les librairies
library(tidyverse)
library(rio)
library(here)
library(readepi)
library(dbplyr)

L’opérateur double deux-points (::)

L’opérateur :: de R permet d’accéder aux fonctions ou aux objets d’un package spécifique sans attacher l’intégralité du package (sans faire appel à la functionlibray()). Il offre plusieurs avantages, notamment :

  • Indiquer explicitement le package d’origine d’une fonction, réduisant ainsi les ambiguïtés et les conflits potentiels lorsque plusieurs packages possèdent des fonctions portant le même nom.
  • Permettre d’appeler une fonction depuis un package sans charger l’intégralité du package avec library().

Par exemple, la commande dplyr::filter(data, condition) signifie que nous appelons la fonction filter() depuis la librairie dplyr.

Créez un projet et un dossier

Lecture de fichiers


Ils existent plusieurs librairies pour importer des données épidémiologiques dans R à partir de fichiers individuels. Il s’agit notamment de {rio}, {readr} de la tidyverse, {io}, {ImportExport} et {data.table}, et des fonctions similaires de la librairie de base de R. Ensemble, ces librairies offrent des méthodes pour lire un ou plusieurs fichiers de différents formats.

L’exemple ci-dessous montre comment importer un fichier csv dans R à l’aide de la librairie rio. Nous avons utilisé la librairie here pour indiquer à R de rechercher le fichier dans le dossier data/ de votre projet, et la fonction dplyr::as_tibble() pour le convertir dans un format plus ordonné en vue d’une analyse ultérieure dans R.

R

# lire les données
# exemple:
# si le chemin d'accès au fichier est "data/raw-data/ebola_cases_2.csv",
# alors:
ebola_confirmed <- rio::import(
  here::here("data", "ebola_cases_2.csv")
) %>%
  dplyr::as_tibble()

# obtenir un aperçu des données
ebola_confirmed

SORTIE

# A tibble: 120 × 4
    year month   day confirm
   <int> <int> <int>   <int>
 1  2014     5    18       1
 2  2014     5    20       2
 3  2014     5    21       4
 4  2014     5    22       6
 5  2014     5    23       1
 6  2014     5    24       2
 7  2014     5    26      10
 8  2014     5    27       8
 9  2014     5    28       2
10  2014     5    29      12
# ℹ 110 more rows

Vous pouvez aussi importer des fichiers d’autres formats tels que tsv, xlsx, etc en utilisant la même fonction.

Pourquoi devrions-nous utiliser la librairie {here}

La librairie here est conçue pour simplifier le référencement des fichiers dans un projet 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 de s’assurer la Compatibilité entre environnements.

Elle fonctionne à travers 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, on utilise la barre oblique ( / ) pour séparer les noms de dossiers : "data/raw-data/file.csv"

La librairie here permet de renforcer la reproductibilité de votre travail à travers différents systèmes d’exploitation. Si vous êtes intéressé par la reproductibilité, nous vous invitons à lire ce tutoriel pour accroître l’accès, la durabilité et la reproductibilité de vos analyses épidémiques avec R.

Lecture de données compressées

Pouvez-vous importer les données d’un fichier compressé dans R?

Téléchargez le fichier compressé contenant les données relatives à l’épidémie de Marburg et importez-le dans votre environnement de travail.

Vous pouvez consulter la liste complète des formats de fichiers pris en charge sur le site web de la librairie rio. Pour étendre {rio} à d’autres formats, vous pouvez installer les librairies correspondantes à l’aide de la fonction ci-dessous :

R

rio::install_formats()

R

rio::import(here::here("data", "Marburg.zip"))

Lecture de données à partir d’une bases de données


La librarie {readepi} contient des fonctionalités qui permettent d’importer des données directement des SGBDR ou de SIS (à travers leurs API). La fonction readepi::read_rdbms() permet d’importer des données à partir de serveurs tels que Microsoft SQL, MySQL, PostgreSQL, et SQLite. Elle repose essentiellement sur la librairie {DBI} qui sert d’interface polyvalente pour interagir avec les systèmes de gestion de bases de données relationnelles (SGBDR).

Avantages liées à l’importation des données à partir d’une base de données ?

La lecture de données directement à partir d’une base de données permet d’optimiser la quantité de mémoire utilisée par la session R. Si nous envoyons une requête à la base de données avec des instructions de filtrage des données (par exemple, select, filter, summarise) avant d’extraire les données, nous pouvons réduire la charge de mémoire dans notre session RStudio. À l’inverse, en effectuant toutes les manipulations de données en dehors du système de gestion de base de données après lecture de toute la base de données dans R peut entrainer l’utilisation de beaucoup plus de mémoire (RAM) que possible sur un ordinateur, pouvant entraîner un ralentissement, voire un blocage de RStudio.

Les systèmes de gestion de bases de données relationnelles (SGBDR) présentent également l’avantage de permettre à plusieurs utilisateurs d’accéder, de stocker et d’analyser simultanément différentes 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 à jour.

1. Etablir la connection à une base de données

Vous pouvez utiliser la fonction readepi::login() pour établir une connection avec la base de données comme illuster ci-dessous.

R

# etablir la connection avec la base de donnees
rdbms_login <- readepi::login(
  from = "mysql-rfam-public.ebi.ac.uk",
  type = "MySQL",
  user_name = "rfamro",
  password = "",
  driver_name = "",
  db_name = "Rfam",
  port = 4497
)

SORTIE

✔ Logged in successfully!

R

rdbms_login

SORTIE

<Pool> of MySQLConnection objects
  Objects checked out: 0
  Available in pool: 1
  Max size: Inf
  Valid: TRUE

À noter

Dans cet exemple, l’accès peut être limité par des restrictions réseau organisationnelles, mais il devrait fonctionner normalement sur les réseaux domestiques

2. Accéder á la liste des tables de la base de données

Vous pouvez accéder à la liste des noms de tables qui existent dans une base de données en utilisant la function readepi::show_tables().

R

# obtenir la liste des tables dans la base de donnees
tables <- readepi::show_tables(login = rdbms_login)

tables

Dans un cadre de base de données, vous pouvez avoir plusieurs tables.
Chaque table peut correspondre à une entité spécifique (par ex. patients, unités de soins, emplois).
Toutes les tables sont liées par un identifiant commun ou une clé primaire.

3. Lire les données d’une table dans une base de données

La fonction readepi::read_rdbms() permet d’importer les données à travers une requête SQL ou une liste de paramètres.

R

# lire les donnees de la table 'author' en utilisant une requete SQL
dat <- readepi::read_rdbms(
  login = rdbms_login,
  query = "select * from author"
)

# lire les donnees de la table 'author' en utilisant une liste de parametres
dat <- readepi::read_rdbms(
  login = rdbms_login,
  query = list(table = "author", fields = NULL, filter = NULL)
)

Alternativement, nous pouvons lire les données de la table author en utilisant dplyr::tbl().

R

# lire les donnees de la table 'author' en utilisant une requete SQL
dat <- rdbms_login %>%
  dplyr::tbl(from = "author") %>%
  dplyr::filter(initials == "A") %>%
  dplyr::arrange(desc(author_id))

dat

SORTIE

# Source:     SQL [?? x 6]
# Database:   mysql 5.6.36-log [@mysql-rfam-public.ebi.ac.uk:/Rfam]
# Ordered by: desc(author_id)
  author_id name           last_name    initials orcid                 synonyms
      <int> <chr>          <chr>        <chr>    <chr>                 <chr>
1        46 Roth A         Roth         A        ""                    ""
2        42 Nahvi A        Nahvi        A        ""                    ""
3        32 Machado Lima A Machado Lima A        ""                    ""
4        31 Levy A         Levy         A        ""                    ""
5        27 Gruber A       Gruber       A        "0000-0003-1219-4239" ""
6        13 Chen A         Chen         A        ""                    ""
7         6 Bateman A      Bateman      A        "0000-0002-6982-4660" ""      

Si nous appliquons dplyr à cette base de données SQLite, ces verbes seront traduits en requêtes SQL.

R

dat %>%
  dplyr::show_query()

SORTIE

<SQL>
SELECT `author`.*
FROM `author`
WHERE (`initials` = 'A')
ORDER BY `author_id` DESC

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

dat %>%
  dplyr::collect()

SORTIE

# A tibble: 7 × 6
  author_id name           last_name    initials orcid                 synonyms
      <int> <chr>          <chr>        <chr>    <chr>                 <chr>
1        46 Roth A         Roth         A        ""                    ""
2        42 Nahvi A        Nahvi        A        ""                    ""
3        32 Machado Lima A Machado Lima A        ""                    ""
4        31 Levy A         Levy         A        ""                    ""
5        27 Gruber A       Gruber       A        "0000-0003-1219-4239" ""
6        13 Chen A         Chen         A        ""                    ""
7         6 Bateman A      Bateman      A        "0000-0002-6982-4660" ""      

Idéalement, après avoir spécifié un ensemble de requêtes, nous pouvons réduire la taille du jeu de données d’entrée à utiliser dans l’environnement de notre session R.

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. Les verbes dplyr comme dplyr::left_join() peuvent être appliqués entre les tables avant d’extraire les données vers votre session locale avec dplyr::collect() !

Vous pouvez également consulter le package dbplyr en R. Pour un tutoriel pas à pas sur SQL, nous recommandons le tutoriel sur la gestion des données avec SQL pour écologistes, qui montre l’utilisation de dplyr avec SQL.

R

# SELECT FEW COLUMNS FROM ONE TABLE AND LEFT JOIN WITH ANOTHER TABLE
author <- rdbms_login %>%
  dplyr::tbl(from = "author") %>%
  dplyr::select(author_id, name)

family_author <- rdbms_login %>%
  dplyr::tbl(from = "family_author") %>%
  dplyr::select(author_id, rfam_acc)

dplyr::left_join(author, family_author, keep = TRUE) %>%
  dplyr::show_query()

SORTIE

Joining with `by = join_by(author_id)`

SORTIE

<SQL>
SELECT
  `author`.`author_id` AS `author_id.x`,
  `name`,
  `family_author`.`author_id` AS `author_id.y`,
  `rfam_acc`
FROM `author`
LEFT JOIN `family_author`
  ON (`author`.`author_id` = `family_author`.`author_id`)

R

dplyr::left_join(author, family_author, keep = TRUE) %>%
  dplyr::collect()

SORTIE

Joining with `by = join_by(author_id)`

SORTIE

# A tibble: 4,874 × 4
   author_id.x name         author_id.y rfam_acc
         <int> <chr>              <int> <chr>
 1          44 Osuch I               44 RF01571
 2           2 Argasinska J           2 RF02588
 3           2 Argasinska J           2 RF02587
 4           2 Argasinska J           2 RF02586
 5           2 Argasinska J           2 RF02585
 6           2 Argasinska J           2 RF02549
 7           8 Boursnell C            8 RF02002
 8          56 Weinberg Z            56 RF01741
 9          39 Moxon SJ              39 RF00496
10          39 Moxon SJ              39 RF00469
# ℹ 4,864 more rows

Lecture de données à partir de SIS


Les données relatives à la santé sont de plus en plus souvent stockées dans des SIS spécialisées telles que Fingertips, GoData, REDCap, DHIS2, SORMAS, etc. La version actuelle de la librairie {readepi} permet d’importer des données à partir de DHIS2 et SORMAS.

Lecture des données à partir de DHIS2

Le système d’information sanitaire de district DHIS2 est un logiciel open source qui a révolutionné la gestion des informations sanitaires mondiales. La fonction readepi::read_dhis2() permet d’importer des données depuis le system Tracker de DHIS2 via leurs API.

Pour cela, il faudra établir la connection au système en utilisant la fonction readepi::login(), puis fornir le nom ou l’identifiant du programme et de l’unité organisationnelle (structure sanitaire, localité, pays, etc) cible.

Pour un système donné, vous pouvez accéder aux identifiants et noms des programmes et structure sanitaires en utilisant les fonctions get_programs() et get_organisation_units() respectivement.

R

# etablir la connection au systeme
dhis2_login <- readepi::login(
  from = "https://smc.moh.gm/dhis",
  user_name = "test",
  password = "Gambia@123"
)

SORTIE

✔ Logged in successfully!

R

# obtenir les noms et identifiants des programmes
programs <- readepi::get_programs(login = dhis2_login)

# obtenir les noms et identifiants des unites organisationnelles
org_units <- get_organisation_units(login = dhis2_login)

R

# importer les donnees a partir de DHIS2 en utilisant les identifiants
data <- readepi::read_dhis2(
  login = dhis2_login,
  org_unit = "GcLhRNAFppR",
  program = "E5IUQuHg3Mg"
)

# importer les donnees a partir de DHIS2 en utilisant les noms
data <- readepi::read_dhis2(
  login = dhis2_login,
  org_unit = "Keneba",
  program = "Child Registration & Treatment "
)

tibble::as_tibble(data)

SORTIE

# A tibble: 1,116 × 69
   event   tracked_entity org_unit ` SMC-CR Scan QR Code` SMC-CR Did the child…¹
   <chr>   <chr>          <chr>    <chr>                  <chr>
 1 bgSDQb… yv7MOkGD23q    Keneba   SMC23-0510989          1
 2 y4MKmP… nibnZ8h0Nse    Keneba   SMC2021-018089         1
 3 yK7VG3… nibnZ8h0Nse    Keneba   SMC2021-018089         1
 4 EmNflz… nibnZ8h0Nse    Keneba   SMC2021-018089         1
 5 UF96ms… nibnZ8h0Nse    Keneba   SMC2021-018089         1
 6 guQTwc… FomREQ2it4n    Keneba   SMC23-0510012          1
 7 jbkRkL… FomREQ2it4n    Keneba   SMC23-0510012          1
 8 AEeype… FomREQ2it4n    Keneba   SMC23-0510012          1
 9 R30SPs… E5oAWGcdFT4    Keneba   koika-smc-22897        1
10 nr03Qy… E5oAWGcdFT4    Keneba   koika-smc-22897        1
# ℹ 1,106 more rows
# ℹ abbreviated name: ¹​`SMC-CR Did the child  previously received a card?`
# ℹ 64 more variables: `SMC-CR Child First Name1` <chr>,
#   `SMC-CR Child Last Name` <chr>, `SMC-CR Date of Birth` <chr>,
#   `SMC-CR Select Age Category  ` <chr>, `SMC-CR Child gender1` <chr>,
#   `SMC-CR Mother/Person responsible full name` <chr>,
#   `SMC-CR Mother/Person responsible phone number1` <chr>, …

Il est important de savoir que toutes les unités organisationnelles (structures sanitaires) ne sont pas enregistrées pour un programme spécifique. Pour connaître les unités organisationnelles qui exécutent un programme particulier, utilisez la fonction get_program_org_units() comme illustré dans l’exemple ci-dessous.

R

# obtenir les unités organisationnelles qui exécutent un programme "E5IUQuHg3Mg"
target_org_units <- readepi::get_program_org_units(
  login = dhis2_login,
  program = "E5IUQuHg3Mg",
  org_units = org_units
)

tibble::as_tibble(target_org_units)

SORTIE

# A tibble: 26 × 3
   org_unit_ids levels            org_unit_names
   <chr>        <chr>             <chr>
 1 UrLrbEiWk3J  Town/Village_name Sare Sibo
 2 wlVsFVeHSTx  Town/Village_name Jawo Kunda
 3 kp0ZYUEqJE8  Town/Village_name Chewal
 4 Wr3htgGxhBv  Town/Village_name Madinayel
 5 psyHoqeN2Tw  Town/Village_name Bolibanna
 6 MGBYonFM4y3  Town/Village_name Sare Mala
 7 GcLhRNAFppR  Town/Village_name Keneba
 8 y1Z3KuvQyhI  Town/Village_name Brikama
 9 W3vH9yBUSei  Town/Village_name Gidda
10 ISbNWYieHY8  Town/Village_name Song Kunda
# ℹ 16 more rows

Lecture des données à partir de SORMAS

Le Système de surveillance, de gestion et d’analyse des réponses aux épidémies SORMAS est un système de santé digital open source qui optimise les processus de surveillance de la propagation des maladies infectieuses et de réponse aux épidémies. La fonction readepi::read_sormas() permet d’importer des données depuis SORMAS via son API.

Dans la version actuelle de la librairie {readepi}, la fonction read_sormas() renvoie des données pour les colonnes suivantes: case_id, person_id, sex, date_of_birth, case_origin, country, city, lat, long, case_status, date_onset, date_admission, date_last_contact, date_first_contact, outcome, date_outcome, Ct_values.

Un des arguments fondamentals est le nom de la maladie pour laquelle l’utilisateur souhaite obtenir des données. Pour vous assurez de la vraie synthaxe à utiliser lors de l’appel à la fonction, vous pouvez obtenir la liste des noms de maladies à travers la fonction sormas_get_diseases().

R

# obtenir la liste des noms de maladies
disease_names <- readepi::sormas_get_diseases(
  base_url = "https://demo.sormas.org/sormas-rest",
  user_name = "SurvSup",
  password = "Lk5R7JXeZSEc"
)

tibble::as_tibble(disease_names)

SORTIE

# A tibble: 65 × 2
   disease            active
   <chr>              <chr>
 1 AFP                TRUE
 2 CHOLERA            TRUE
 3 CONGENITAL_RUBELLA TRUE
 4 CSM                TRUE
 5 DENGUE             TRUE
 6 EVD                TRUE
 7 GUINEA_WORM        TRUE
 8 LASSA              TRUE
 9 MEASLES            TRUE
10 MONKEYPOX          TRUE
# ℹ 55 more rows

R

# obtenir les donnees de tous les cas de COVID-19
covid_cases <- readepi::read_sormas(
  base_url = "https://demo.sormas.org/sormas-rest",
  user_name = "SurvSup",
  password = "Lk5R7JXeZSEc",
  disease = "coronavirus"
)

tibble::as_tibble(covid_cases)

SORTIE

# A tibble: 6 × 16
  case_id    person_id date_onset date_admission case_origin case_status outcome
  <chr>      <chr>     <date>     <date>         <chr>       <chr>       <chr>
1 QFC5QI-GC… XNQZBX-W… NA         NA             IN_COUNTRY  NOT_CLASSI… NO_OUT…
2 UOZL3G-4M… UGBWTB-B… 2025-05-27 NA             IN_COUNTRY  SUSPECT     NO_OUT…
3 SRO72L-LY… UOAAIQ-Z… NA         NA             IN_COUNTRY  NOT_CLASSI… NO_OUT…
4 XV7RQ3-ZY… XP2SJX-W… 2025-07-03 NA             IN_COUNTRY  NOT_CLASSI… NO_OUT…
5 SMUIMI-ZI… TMWNQS-O… NA         NA             IN_COUNTRY  CONFIRMED   NO_OUT…
6 SZ3GHH-RJ… V2XMXK-K… NA         NA             IN_COUNTRY  NOT_CLASSI… NO_OUT…
# ℹ 9 more variables: sex <chr>, date_of_birth <chr>, country <chr>,
#   city <chr>, latitude <chr>, longitude <chr>, contact_id <chr>,
#   date_last_contact <date>, Ct_values <chr>

Points clés

  • Utilisez rio, io, readr et {ImportExport} pour importer les données à partir des fichiers.
  • Utilisez {readepi} pour importer les données à partir des SIS et SGBDR.