p-values ajustées : affichez les facilement sur un graph !

1.Contexte

 

Il y a quelque temps, j’ai écrit un article expliquant comment, après une ANOVA, indiquer les  p-values ou les différences significatives sur un graph , en employant le package ggpubr.

Cliquez ici pour ouvrir l’article 

Par exemple, pour une ANOVA non paramétrique (test de Kruskal Wallis) :

 

 

Je disais qu’une des limites du package était que les p-values des comparaisons multiples, affichées sur le graph, étaient les p-values non ajustées. Or quand on réalise une ANOVA (paramétrique ou non paramétrique), les p-values des comparaisons multiples doivent être
ajustées. Et donc que se sont ces p-values ajustées qu’il faudrait pouvoir afficher.

Pour plus d’informations sur “pourquoi il faut ajuster les p-values des comparaisons multiples”, consultez l’ article : “Comparaisons multiples et ajustement des pvalues avec le logiciel R

Et puis la semaine dernière, un lecteur du blog m’a demandé si j’avais finalement trouvé une solution pour afficher ces p-values ajustées.

Je ne m’y étais plus intéressée alors en en première approche je lui ai dit qu’il avait deux possibilités :

  • retoucher les pvalues sous paint (oui je sais c’est mal, mais, à 2 heures du matin, quand on est fatigué, la tentation peut être grande).
  • faire lui même les traits sous ggplot2 avec la fonction geom_segment(), puis ajouter les p-values avec la fonction annotate(). Mais c’est fastidieux !

Et puis, en cherchant un peu plus, j’ai trouvé une solution qui avait été postée par un utilisateur du package ggpubr dans l’onglet “Issue” du répertoire GitHub du package. C’est cette solution que je vous explique ici en pas à pas.

2 Le principe

La solution consiste à :

1. Indiquer les comparaisons deux à deux souhaitées sous forme d’une list

2. Créer un data frame qui contiendra, les p-values ajustées en utilisant la fonction compare_means(), et en précisant :

  • la méthode d’ajustement souhaitée, grâce à l’argument p.adj
  • les tests à employer pour les comparaisons multiples, via l’argument method=. On utilise method='t.test' pour des tests t et method='wilcox.test' pour des tests de Wilcoxon.

3. Ajouter, à ce data frame, une variable y.position dans laquelle on précise le futur emplacement, sur le graph, au niveau de l’axe des ordonnées, des p-values des comparaisons multiples

4. Faire le graph

 

3. P-values ajustées après une ANOVA paramétrique

3.1 Réalisation

J’utilise ici le jeu de données ToothGrowth (contenu dans le package dataset, chargé par défaut !) :

 

Je commence par passer la variable dose en facteur (par défaut, R la considère comme une variable numérique)

 

 

On réalise les 3 étapes décrites précédemment :

1.Indiquer les comparaisons deux à deux souhaitées sous forme d’une liste :

Ici, j’indique toutes comparaisons deux à deux :

 

2.Créer un data frame qui contiendra, les p-values ajustées en utilisant la fonction compare_means(), et en précisant la méthode d’ajustement souhaitée, et le type de tests.

Ici, j’appelle mc_t_test le data frame qui contiendra les informations des comparaisons et notamment les p-values ajustées. Je choisis d’utiliser la méthode d’ajustement d’Holm. D’autres choix sont possibles (cf. paragraphe 5). Et comme il s’agit d’une ANOVA paramétrique, je précise , dans l’argument method que les tests à employer sont des tests t.

 

3.Ajouter, à ce data frame, une variable y.position dans laquelle on précise le futur emplacement, sur le graph, au niveau de l’axe des ordonnées, des p-values des comparaisons multiples:

Je choisis les valeurs y=29 ,y=35, et y=39 en m’aidant du premier graph réalisé dans l’introduction.

 

Pour plus d’infos sur la création d’une variable à l’aide de la fonction mutate() et de l’utilisation du symbole pipe %>%, consultez l’article “Initiation à la manipulation de données avec le package
dplyr”

4.Faire le graph

On indique method = "anova" dans la fonction stat_compare_means() et on indique le data frame mc_t_test dans la fonction stat_pvalue_manual() :

 

3.2 Vérification

3.2.1 Réalisation de l’ANOVA

 

La p-value est bien identique à celle du graph.

 3.2.2 Réalisation des comparaisons multiples

Lorsque l’argument method='t.test' est utilisé dans la fonction compare_mean() du package ggpubr , les tests t employés sont des tests pour variances inégales. Ces tests t sont aussi appelés tests de Welch.
Il est possible de réaliser tous les tests t deux à deux, en utilisant la fonction pairwise.t.test. Pour obtenir des tests de Welch, on utilise l’argument pool.sd =FALSE.

 

 

Ces p-values correspondent bien à celle du graph.

4. P-values ajustées après d’une ANOVA non paramétrique

L’ANOVA non paramétrique est appelée test de Kruskal Wallis.

4.1 Réalisation

1.Indiquer les comparaisons deux à deux souhaitées sous forme d’une liste :

On conserve les comparaisons deux à deux précédentes:

 

2.Créer un data frame qui contiendra, les p-values ajustées en utilisant la fonction compare_means(), et en précisant la méthode d’ajustement souhaitée,et le type de tests.

Ici j’appelle mc_wilcox_test le data frame qui contiendra les informations des comparaisons et notamment les p-values ajustées. Comme précédemment, je choisis d’utiliser la méthode d’ajustement d’Holm. D’autres choix sont possibles (paragraphe 5 ). Et comme il s’agit d’une ANOVA non paramétrique, je précise que les tests à employer sont des tests de wilcoxon.

 

3. Ajouter, à ce data frame, une variable y.position dans laquelle on précise le future emplacement, sur le graph, au niveau de l’axe des ordonnées, des p-values des comparaisons multiples:

Je garde les même valeurs que précédemment : y=29 ,y=35, et y=39

 

4. Faire le graph

On indique method = "kruskal.test" dans la fonction stat_compare_means() et on indique le data frame mc_wilcox_test dans la fonction stat_pvalue_manual() :

 

4.2 Vérification

4.2.1 Réalisation du test de Kruskal Wallis

 

La p-value est bien identique à celle du graph.

4.2.2 Réalisation des comparaisons multiples

Il est possible de réaliser tous les tests de Wilcoxon deux à deux, en utilisant la fonction pairwise.wilcox.test :

 

Ces p-values correspondent bien à celle du graph.

Remarques : les messages de warning indiquent simplement qu’il existe des valeurs de len identiques dans plusieurs groupes et que cela rend impossible le calcule d’une p-value exacte. Une approximation sera alors utilisée (ce n’est pas grave !).

 

5 Remarques :

Il existe plusieurs méthodes d’ajustement des p-values qui peuvent être employées dans les fonctions compare_means(), pairwise.t.test() et pairwise.wilcox.test(), via l’arugment p.adj.

Pour connaitre comment préciser ces méthodes, utiliser la commande suivante :

 

Pour plus d’information, consulter la page d’aide, en utilisant la commande :

6 Pour aller plus loin:

Je vous conseille vivement d’aller faire un tour sur la page de présentation du package ggpubrcar ce package propose de nombreuses options de graphes très intéressantes.

Et si vous rencontrez des difficultés, consultez l’onglet Issue, c’est là que les utilisateurs posent leur questions, remontent les bugs rencontrés, ou encore postent des réponses !

Si vous souhaitez plus d’informations, théoriques ou pratiques, sur l’ANOVA à un facteur, vous pouvez consulter mes articles :

 

Et vous, avez vous d’autres astuces, ou d’autres routines pour présenter vos résultats d’ANOVA à un facteur ? Indiquez les moi en commentaire!

Et si cet article vous a plu, ou vous a été utile, n’hésitez pas à le partager 😉

 

Crédits photos : geralt

Consultez mes 3 derniers articles “astuces” :

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

11 commentaires

  1. Bobo B. Kabungu Répondre

    Très intéressant. À recommander vivement. L’illustration graphique est parlante.

  2. Louis Aldebert Répondre

    Je trouve cela particulièrement intéressant, car, personnellement, je ne trouvais une pas grande utilité à comparer des boxplots. Mais avec les p-values indiqués comme ceci ça a une vraie valeur ajoutée !

    Merci Claire

  3. Paradiso Répondre

    Bonjour, tout d’abord merci pour l’article.
    J’aimerai savoir s’il est possible de spécifier le nombre de comparaison que l’on souhaite faire dans le p.adj. Car spécifier que la correction se fait avec Holms est une chose mais j’aimerai être sur que le nombre de comparaisons est exactement celui que je souhaite.
    Bine à vous,
    MP

    • Claire Della Vedova Auteur de l’articleRépondre

      Bonjour,

      On ne précise pas directement le nombre de comparaisons mais on spécifie les comparaisons individuellement via
      my_comparisons <- list( c("0.5", "1"), c("1", "2"), c("0.5", "2") ) et ensuite my_comparaisons passe en argument de stat_compare_means(). Bonne continuation

  4. Souvenir Répondre

    Mais comment faire lorsque le modèle de comparaison est sous tendu par un glm et non un lm

    • Claire Della Vedova Auteur de l’articleRépondre

      Et ben, je pense qu’il faut faire les segments horizontaux sous ggplot2 avec geom_segment() et ajouter les p-values ajustées avec annotate(), mais c’est fastidieux. J’essaierai de le montrer dans un prochain article.
      Bonne continuation

  5. chizere Répondre

    Bonjour, Je vous remercie pour cet article vraiment intéressant. J’avais une question pour le test de kruskal Wallis, comment est-ce qu’on pourrait procéder quand on se retrouve dans un cas avec un rang, au lieu de plusieurs.

    • Claire Della Vedova Auteur de l’articleRépondre

      Bonjour,
      je pense que ce n’est pas possible, vous devez avoir des réplicats.
      Bonne continuation

Laisser un commentaire

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