La reproductibilité avec R, ou pourquoi celle-est située sur un continuum

Bruno Rodrigues

Qui suis-je

Bruno Rodrigues, responsable de la production de statistiques et de la stratégie des données du Ministère de l’Enseignement supérieur et de la Recherche du Grand-Duché du Luxembourg

La reproductibilité

  • Capacité de retrouver exactement les mêmes résultats si je refais une analyse

  • Mais pourquoi?

  • Reproduction des résultats à la demande (audit, mise à jour…)

  • Reproduction des résultats d’une analyse passée

  • (Travailler sur un environnement immutable)

  • En supposant que j’ai le script original et les données: quel est le problème?

Le continuum

Voici ce qui peut influencer la reproductibilité d’une analyse:

  • Version de R utilisée
  • Versions des paquets utilisés
  • Système d’exploitation et sa version
  • Hardware

Le continuum

Source: Peng, Roger D. 2011. “Reproducible Research in Computational Science.” Science 334 (6060): 1226–27

Exemples de problèmes - Versions de R

R < 3.6 (set.seed(1234))

sample(seq(1, 10), 5)
[1] 2 6 5 8 9

R >= 3.6 (set.seed(1234))

sample(seq(1, 10), 5)
[1] 10  6  5  4  1

Impact réel sur des publications utilisant R < 3.6! (projet de recherche en cours)

Exemples de problèmes - système d’exploitation (1/3)

Généralement pas un problème, mais Neupane, et al. 2019:

While preparing a manuscript, to our surprise, attempts by team members to replicate these results produced different calculated NMR chemical shifts despite using the same Gaussian files and the same procedure outlined by Willoughby et al. […] these conclusions were based on chemical shifts that appeared to depend on the computer system on which step 15 of that protocol was performed.

Exemples de problèmes - système d’exploitation (2/3)

Exemples de problèmes - système d’exploitation (3/3)

Le cœur de problème

Works on my machine!

Solutions: conditions nécessaires pour rendre une analyse reproductible

  • Code source (no-code exclu par défaut!) et données disponibles

  • Langage de programmation (à la version près!) utilisé disponible

  • Librairies (et autre dépendances, à la version près!) utilisées disponibles

  • OS utilisé disponible

  • Disponible: possible d’utiliser, de partager et de ré-utiliser sans restrictions

Solutions: R et ses versions

  • R est un logiciel libre ✓
  • Aucune restriction quant à sa distribution
  • Possible de ré-installer des anciennes versions (voir R Installation Manager (RIG))
  • Quid des paquets? Quid de l’OS?

Solutions: le versionnage de paquets avec {renv} (1/2)

  • {renv} permet de générer un fichier renv.lock
  • Exemple: une analyse avec son renv.lock (lien)

Solutions: le versionnage de paquets avec {renv} (2/2)

Vraiment simple à utiliser, permet d’avoir une librairie par projet. Voici comment générer un renv.lock une fois l’analyse terminée:

renv::init()
renv::hydrate()
renv::snapshot()

Restaurer la librairie dans le futur avec:

renv::init()
renv::restore()

Solutions: le versionnage de paquets basé sur une date - {checkpoint}

  • MRAN: snapshots quotidiens de CRAN
  • Versionnage basé sur la date, pas sur la version des paquets
  • Très pratique, mais Microsoft va arrêter le service au 1er juillet

Solutions: le versionnage de paquets basé sur une date - {groundhog} (2/3)

groundhog.library("
    library(purrr)
    library(ggplot2)",
    "2017-10-04",
    tolerate.R.version = "4.2.2")

*** suite du script ***
  • Besoin de “tolérer” la mauvaise version de R -> peut être source de problèmes (RIG à la rescousse)

Solutions: le versionnage de paquets basé sur une date - Posit Package Manager (3/3)

options(repos = c(REPO_NAME = "https://packagemanager.posit.co/cran/2023-06-14"))

Solutions: le versionnage de paquets

  • {renv}: solution idéale
  • {groundhog}, {rang}: solution si pas de renv.lock disponible
  • Posit Package Manager: l’utilisateur doit changer son mirroir CRAN…

Où se trouve-t-on dans le continuum?

  • {renv}: fournit la liste des paquets et la version de R utilisée
  • RIG: permet d’installer des anciennes versions de R
  • Il reste l’OS!

Gérer le système d’exploitation

Solution: ne partagez pas un script, partagez votre ordinateur!

Docker ou comment partager son ordinateur

  • Docker est un outil de containerisation (à installer sur votre ordinateur)
  • Un containeur: un OS (souvent Ubuntu) et du code
  • Facile à partager, via internet ou en tant qu’archive

Docker ou comment partager un ordinateur

  • Créez un simple fichier texte appelé Dockerfile:
```
FROM ubuntu:latest

CMD echo "Hello, World!"
```
  • Créez l’image:
docker build -t hello .
  • Exécutez l’image en tant que containeur:
docker run --rm -d --name hello_container hello

Hello, World!

Images Docker

Une image Docker c’est:

  • une base Linux (souvent Ubuntu)

  • toutes les dépendances nécessaires

  • tous les scripts nécessaires

  • la possibilité de l’exécuter sous forme d’un containeur sur n’importe quel OS

Sans Docker

Avec Docker

Une image Docker complète

Exemple ici

FROM rocker/r-ver:4.2.2

Image basée sur Ubuntu avec R 4.2.2 du projet Rocker téléchargée depuis Docker Hub

“C’est chaud quand même”

  • Le minimum, c’est de fournir un renv.lock: possible de créer le Dockerfile ensuite
  • Toujours possible de re-créer une image Docker par la suite
  • Apprenez à utiliser Docker avec mon bouquin en ligne
  • Apprenez à utiliser un environnement figé avec Docker ici

Et le hardware?

  • Apple: powerpc, intel, silicon
  • Pas de recette miracle: open source et couches de compatibilité ou effort de maintenance (portage des projets, etc)

Docker, la panacée?

  • Pas forcément: point de défaillance unique!
  • Mais, alternatives disponibles et compatibles
  • Docker -> Podman
  • Docker Hub -> Github packages (ou partage d’images archivées)
  • Autre possibilité (sans containerisation): Guix!

Conclusion

  • Le minimum: générez un renv.lock!
  • Bonnes pratiques: pas de chemin absolu, {targets}, packagez votre code {fusen}, gestion de versions avec Git et Github
  • Utilisez la bonne version de R avec les bons scripts avec RIG)
  • Docker: coût d’entrée élevé, mais seule garantie pour la reproductibilité sur le long terme (et effort de maintenance nécessaire aussi)

Références et liens