News et découvertes - juillet, août et septembre 2022

Voici le résumé de mes découvertes dans les domaines des biostatistiques et de l’utilisation de R, entre juillet et septembre 2022.

Table des matières

Utilisation de R

%nin% la négation de %in%

Pour filtrer des données en fonction de plusieurs modalités d’une variable catégorielle (factor) j’emploie l’opérateur `%in%` ; comme ceci, par exemple, pour filtrer les fleurs des espèces setosa et virginica

library(tidyverse)

seto_virgi <- iris %>% 
  filter(Species %in% c("setosa", "virginica")) 

Eh bien, il est possible de définir l’opérateur inverse %nin%; c’est-à-dire un opérateur qui permet de filtrer ce qui n’est pas ce qui est spécifié ensuite. Par exemple, pour filtrer les fleurs qui ne sont ni des setosa, ni des virginica :

# definition de l'operateur
`%nin%` = Negate(`%in%`)

# utilisation de l'opérateur
versi <- iris %>% 
  filter(Species %nin% c("setosa", "virginica")) 

Merci à Ludovic Degorge pour cette astuce !

Et si vous souhaitez apprendre à manipuler facilement et efficacement vos tableaux de données, j’animerai une formation “Manipulations de données avec R et les packages dplyr, tidyr, et lubridate ” en distanciel vendredi 21 octobre 2022. Le tarif est de 450 euros. Cliquez sur ce lien pour plus d’information (programme et bulletin d’inscription)  

Utilisation de la fonction View() sur une fonction

J’utilise régulièrement la fonction View() pour visualiser mes données dans le tableur de R Studio.
Eh bien, on peut aussi utiliser la fonction `View()` sur une fonction, pour voir son code dans un fichier texte qui s’ouvre dans la fenêtre en haut à gauche de RStudio (à côté des scripts). J’ai appris cela grâce à Romain François.

library(funModeling)
View(funModeling::discretize_df) 
Afficher le code d'une fonction avec la fonction View

Remarque : Vous pouvez aussi sélectionner (avec la souris) une fonction sur votre script, puis appuyer sur F2.

Utilisez des étiquettes en plus des noms de variables

Très récemment, j’ai découvert l’article “The case for variable labels in R ” du blog PIPING HOT DATA, qui traite de la gestion des labels (étiquettes) des variables dans R. Les labels sont des étiquettes de données, que l’on peut ajouter au nom des variables pour contenir plus d’information. Je sais que c’est un sujet qui intéresse beaucoup celles et ceux qui travaillent ou qui ont travaillé avec SAS et SPSS.

En résumé, on peut assez facilement ajouter des labels aux variables en employant le package labelled.

library(labelled)

iris_labelled <- iris %>% 
  set_variable_labels(
    Sepal.Length = "Longueur du sépale en cm",
    Sepal.Width = "Largeur du sépale en cm",
    Petal.Length = "Longueur du pétale en cm",
    Petal.Width = "Largeur du pétale en cm",
    Species = "Espèce de l'iris")



View(iris_labelled) 

Ces labels sont stockés sous la forme d’atributs :

str(iris_labelled)
## 'data.frame':    150 obs. of  5 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##   ..- attr(*, "label")= chr "Longueur du sépale en cm"
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##   ..- attr(*, "label")= chr "Largeur du sépale en cm"
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##   ..- attr(*, "label")= chr "Longueur du pétale en cm"
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##   ..- attr(*, "label")= chr "Largeur du pétale en cm"
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
##   ..- attr(*, "label")= chr "Espèce de l'iris" 

Pour afficher la correspondance entre les noms des variables et les labels, nous pouvons employer la fonction look_for(), comme ceci  (Merci Benoit Touzot) : 

iris_labelled %>% 
  look_for()
##  pos variable     label                    col_type values    
##  1   Sepal.Length Longueur du sépale en cm dbl                
##  2   Sepal.Width  Largeur du sépale en cm  dbl                
##  3   Petal.Length Longueur du pétale en cm dbl                
##  4   Petal.Width  Largeur du pétale en cm  dbl                
##  5   Species      Espèce de l'iris         fct      setosa    
##                                                     versicolor
##                                                     virginica 

Pour en savoir plus sur

  • l’assignation des labels,
  • la création de dictionnaire des data avec ces labels,
  • l’utilisation de ces labels dans les tables résumées,
  • comment les utiliser dans un ggplot,
  • ou encore comment exporter des données avec des étiquettes,

 

je vous recommande de lire l’article “The case for variable labels in R ” du blog PIPING HOT DATA.

 Vous trouverez également des informations dans la vignette du package sjlabelled

Data visualisation

Faire de beaux bopxlots groupés avec ggplot 2

Quand on essaye de faire des boxplots groupés, tout en affichant les points, on peut employer les fonctions geom_boxplot(),  et geom_jitter(), mais le résultat n’est pas très satisfaisant :

library(funModeling) # pour utiliser les data heart_disease
funModeling::heart_disease %>%
  ggplot(aes(x=has_heart_disease,y=max_heart_rate, color=gender)) +
  geom_boxplot(outlier.shape=NA)+
  geom_jitter(width=0.15) 
boxplots groupés non satisfaisants

Pour obtenir un meilleur rendu, il faut utiliser la fonction geom_point(), avec l’argument position = position_jitterdodge(), comme ceci :

funModeling::heart_disease %>%
  ggplot(aes(x=has_heart_disease,y=max_heart_rate, color=gender)) +
  geom_boxplot(outlier.shape=NA)+
  geom_point(position=position_jitterdodge()) 
boxplots groupés

Vous trouverez plus d’information sur le post “How To Make Grouped Boxplot with jittered data points ggplot2 ?” 

Ajouter une table de régression sur un plot

Si vous souhaitez présenter ensemble votre table de régression et la visualisation correspondante, vous devez :

  • créer une table graphique avec la fonction tableGrob() du package gridExtra,
  • combiner la visualisation et la table graphique grâce à la fonction wrap_plots() du package patchwork.

 

Voici un exemple :

library(funModeling)

# plot
p <- funModeling::heart_disease %>% 
  ggplot(aes(x=age, y=max_heart_rate))+
  geom_smooth(method="lm")

# table des résultats de la régression linéaire
library(broom)
df <- broom::tidy(lm(max_heart_rate~age,data= heart_disease )) %>% 
    mutate_if(is.numeric, signif, 3) 

library(patchwork)
library(gridExtra)

patchwork::wrap_plots(tableGrob(df), p, nrow=2) 
présenter la visualisation et la table de régression

Cette astuce a été publiée par Indrajeet Patil.

Biostatistiques

Un cours sur la planification expérimentale

Jean-Luc, un lecteur du blog, m’a fait découvrir ce cours de François Husson sur la planification expérimentale.  Je l’ai seulement parcouru, mais je ne doute pas qu’il soit excellent. Vous trouverez des diaporamas, des vidéos et des exercices (avec corrigés !!).

Une publication sur l’absence de problème des données déséquilibrées en régression logistique

Il est fréquent de lire qu’un déséquilibre de classes (déséquilibre entre la fréquence des événements et des non-évènements) est un problème pour le développement de modèle de prédiction.

Dans la publication “The harm of class imbalance corrections for risk prediction models: illustration and simulation using logistic regression“,  Maarten van Smeden et ces co-auteurs montrent que cela n’est pas le cas, au moins pour la famille des régressions logistiquse, et qu’utiliser une méthode de correction est, au contraire, plus préjudiciable !

Superpower : un outil pour des calculs de puissance basés sur des simulations

Superpower est un package, accompagné d’un livre bookdown, dédiés au calcul de puissance, par simulations

C’est un projet porté, entre autres, par Daniël Lakens et Guy Pochilo, dont j’apprécie beaucoup le travail de vulgarisation des approches statistiques. D’ailleurs, je vous recommande vraiment de lire le 1er chapitre, d’introduction aux analyses de puissance, c’est vraiment hyper pédagogique !

Au-delà du premier chapitre, le livre contient beaucoup d’exemples, et de nombreuses comparaisons avec l’outil G*Power

Je n’ai pas encore utilisé le package, mais il me semble intéressant, car il propose des calculs de puissance / nombre de sujets nécessaire pour l’ANOVA à un facteur, l’ANOVA sur mesures répétées, l’ANOVA mixte (un facteur within, un facteur between).

Pièges courant en recherche, conception, analyse de données et reporting

C’est une publication très courte, qui va à l’essentiel, et qui contient de très bonnes références pour chaque problème listé. C’est encore de Maarten van Smeden et c’est encore très très bon ! 

A Very Short List of Common Pitfalls in Research Design, Data Analysis, and Reporting 

Le mot de la fin

C’est tout pour cette fois – ci. Si vous rencontrez des news particulièrement intéressante, n’hésitez pas à me les envoyer par mail (claire@delladata.fr)

J’ai déjà quelques sujets en stock pour la prochaine fois, par exemple au sujet de Quarto (la nouvelle génération de Rmarkdown), et une BD autour des stats ! 

Poursuivez votre lecture

Vous souhaitez soutenir mon travail ?

Si vous souhaitez soutenir mon travail, vous pouvez faire un don libre sur la page tipeee du blog :

5 réponses

  1. Bonjour Claire,

    comme à votre habitude, un post très intéressant.
    j’ajouterais simplement la ligne “iris_labelled %>% look_for()”
    qui permet dans le cas d’étude de pouvoir imprimer la correspondance entre noms de variables et labels.
    bien à vous,
    Benoit

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Bonjour !

vous venez souvent ?

Identifiez-vous pour avoir accès à toutes les fontionnalités !

Aide mémoire off'R ;)

Enregistrez vous pour recevoir gratuitement mes fiches “aide mémoire” (ou cheat sheets) qui vous permettront de réaliser facilement les principales analyses biostatistiques avec le logiciel R et pour être informés des mises à jour du site.