Réalisez de multiples tests en quelques lignes avec une fonction map()

tests multiples avec le logiciel R

Cette semaine, au cours d’une séance de coaching “libre”, on m’a demandé comment faire de multiples tests de wilcoxon de façon automatisés (il y en avait plus de 250 à faire), et comment récupérer la p-value, afin ensuite de faire un sous jeu de données avec seulement les variables qui seraient significatives.

J’ai trouvé cette question vraiment intéressante, parce que c’est vrai que ça peut être super utile de savoir le faire ! Et aussi parce que j’y ai vu une bonne occasion de me (re)pencher sur les fonctions map() du packages purrr dont je parlais dans cet article celles du packagebroom.

Prérequis : pour bien tirer profit cet article il est nécessaire de connaitre l’utilisation du package dplyr et du symbole pipe %>% qui permet d’enchaîner les instructions.

 

1. Le jeu de données exemple

Pour illustrer cet article, je vais reprendre les données cystfibr que j’avais utilisées dans l’article “Gagnez du temps en utilisant des tests de permutation et en les automatisant !” dans lequel je parlais déjà d’automatisation.

Ce jeu de données cystfibr est un data frame de 25 lignes et 10 variables. Il est relatif aux fonctions pulmonaires de patients atteint de fibrose cystique. cystfibr est contenu dans le package IswR :

 

2. Le test de Wilcoxon

Le test de Wilcoxon est un test non paramétrique (basé sur le calcul d’une somme de rangs) qui permet de comparer les médianes de deux groupes. Avec le jeu de données cystfibr, il s’agit, par exemple, de tester si les médianes des pressions expiratoires maximales (variables pemax) sont différents entre les hommes (n=14) et les femmes (n=11).

Le test de wilcoxon se réalise avec la commande suivante :

 

La sortie comporte plusieurs informations :

  • un rappel des données employées
  • la statistique du test : W
  • la p-value du test
  • un rappel de l’hypothèse alternative (la différence des médianes est différente de
    0)

3. Réaliser de multiples tests de façon automatique

Il s’agit de réaliser un test de Wilcoxon sur chacune des neuf variables numériques, pour comparer les médianes relatives aux hommes et aux femmes. Autrement dit, il s’agit de réaliser neuf tests de Wilcoxon. Neuf tests de Wilcoxon, ce n’est pas la mer à boire. Mais dans la demande initiale qui m’a été faite il y en avait près de 250 !

 

3.1 Multiples tests : approche simple

L’approche simple consiste à :

  • supprimer la variable qui contient les deux groupes à comparer (ici sex)
  • utiliser la fonction ‘map()’ (du package ‘purrr’) pour réaliser un test de wilcoxon avec chacune des variables numérique et la variable sex, qui elle est contenue dans le jeu cystfibr (c’est pour cela que l’on indique ‘data=cystfibr’). A ce stade toutes les sorties de chaque test de wilcoxon sont stockées dans une liste.
  • utiliser la fonction ‘map_dbl()’ pour extraire la p.value de la sortie (voir plus haut). La fonction ’map_dbl()’ permet de concaténer l’ensemble des p-values dans un vecteur (nommé ici p_values)

 

Dans un second temps, on récupère le nom des variables numériques :

 

Puis on peut stoker les nom de ces variables et leur p-value correspondante, dans un data frame :

 

Il est alors tout à fait possible d’ajuster les p-values pour prendre en compte cette réalisation de multiples tests et le problème de l’augmentation du risque alpha global. Ici, avec la méthode d’ajustement de Benjamini & Hochberg :

 

3.2 Multiples tests : approche plus complexe

L’approche décrite ci-dessous est plus complexe, mais elle vaut la peine car elle fait appelle à des fonctions très intéressantes des packages tidyr, comme la fonction nest(), et du package broom, comme la fonction tidy().

De plus, cette approche peut très facilement être modifiée pour, par exemple, stocker les sorties de modèles de régressions linéaires (les coefficients, leur erreur standard, les pvalues, le r² etc…)

Il s’agit dans un premier temps de réaliser une version “long” du jeu de données, c’est à dire de le réduire à 3 colonnes :

  • une contenant la variable “sex”,
  • une contenant toutes les valeurs numériques,
  • une contenant le nom de la variable à laquelle la valeur numérique se rapporte.

Dans un deuxième temps, on crée une version “nested” de la version “long”. Il s’agit de découper le jeu de données par paquet de lignes correspondant à chacune des variables, et de stocker les données à proprement parlé, dans une variable appelée “data”. Ça à l’air un peu compliqué, mais on s ’y habitue…

 

Vous pouvez visualiser les données “nested” dans le viewer:

multiples tests automatisés avec R

En cliquant sur une case blanche de la colonne “data”, il est possible de visualiser le jeu de données qu’elle contient :

automatiser les tests statistiques avec le logiciel R

 

Ensuite, il s’agit de créer une fonction pour réaliser le test de wilcoxon de manière spécifique avec nos données, c’est à dire en spécifiant le nom des variables, tel qu’elles seront nommées dans le jeu de données (ici “value” et “sexe) :

 

Puis de créer une nouvelle variable dans le data.frame “cystfibr_nest” qui contiendra la sortie du test de Wilcoxon créé à l’étape précédente :

 

On utilise alors la fonction tidy() du package broom pour formater les sorties des tests de wilcoxon sous forme de data frame. Voici un exemple :

 

Cette fonction tidy() est couplée à la fonction map() pour être appliquée à toutes les lignes (de cystfibr_nested), et à mutate() pour que le data frame issu de la fonction tidy() soit inclus dans une nouvelle variable (nommé tidy !) :

 

Voici à quoi ressemble à présent le jeu de données “cystfibr_nested”

tidy broom

 

Et ici, le data frame stocké dans la variable tidy :

puuur + broom

 

Il ne reste plus qu’à extraire les variables de ce data frame contenu dans la colonne “tidy” pour les ajouter directement aux colonnes du data frame “cystfibr_nested”. Ceci est possible avec la fonction unnest() :

 

L’argument .drop=TRUE, permet de supprimer la variable tidy.

 

Finalement, en enchaînant les commandes, on obtient :

 

On peut là encore ajuster les p-values :

Puis finalement faire un subset du tableau de résultat en ne gardant que les p-values inférieures à un certain seuil, 0.1 par exemple :

 

4. Ajuster de multiples modèles

Si l’on souhaite, par exemple, faire toutes les régressions linéaires simples entre la variable “pemax” et chacune des autres variables numériques :

5. Conclusion

 

J’espère que cet article vous aura convaincu de l’intérêt de savoir utiliser les fonctions map() du package purrr, mais aussi de l’intérêt de les coupler aux fonctions du package broom. Pour aller plus loin, je vous conseille de visionner cet talk d’Hadley Wickham :

Hadley Wickham

 

Et pour découvrir le package broom, vous pouvez consulter sa vignette, ici

En attendant, si cet article vous a plus, n’oubliez pas de la partager 😉

 

Crédit photos : alan9187

 

Découvrez d’autres articles pour analyser efficacement vos données avec le logiciel R :

Partager l'article
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

1 Commentaire

Laisser un commentaire

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