Comparaison de moyennes : indiquez la significativité des différences sur le graph

différences significatives

Lorsqu’on souhaite synthétiser les résultats d’une comparaison de moyennes, on réalise généralement une représentation graphique sur laquelle on reporte les comparaisons réalisées, et les résultats des tests statistiques employés.

Les résultats peuvent être exprimés en termes de p-values, par exemple, comme ceci:

significativité des différences

 

Ou encore, en employant des lettres, comme ci dessous. La covention veut que si deux moyennes partagent une même lettre alors elles ne sont pas significativement différentes, et au contraire, si deux moyennes ne partagent pas une même lettre alors elles sont significativement différentes.

significativité des différences
La réalisation de ces deux types de figures, comportant une annotation de la significativité des différences, n’est pas très aisée avec le logiciel R.

Néanmoins, deux outils permettent de les construire plus facilement. Il s’agit d’une part du package ggpubr développé par Alboukadel Kassambara, qui permet d’indiquer les comparaisons réalisées, et les p-values des tests employés. Et d’autre part, d’une fonction (nomméetri.to.squ) publiée sur le blog Fabio Marroni qui, couplée à la fonction multcompLetters du package multcompView, permet facilement d’employer des lettres pour indiquer la significativité des comparaisons.

Dans ce post, je vais donc vous montrer, en pas à pas, comment construire les deux figures précédentes.

1. Afficher la significativité des différences à l’aide des p-values en utilisant le package ggpubr

1.1 Représenter les données

Le package ggpubr propose des fonctions “toutes prêtes” pour représenter les données à comparer. Ces fonctions sont basées sur une utilisation indirecte du package ggplot2. On parle de fonctions “wrapper” de ggplot2, puisqu’elles simplifient son utilisation.

A mon sens les fonctions les plus utiles pour illustrer une comparaison de moyennes sont ggboxplot et ggviolin.

significativité des différences

Ou encore, par exemple

 

significativité des différences

1.2 Ajouter les p-values

Les comparaisons statistiques des moyennes, et l’affichage des p-values correspondantes, sont réalisés par la fonction stat_compare_means.

Lorsque plus de deux moyennes sont à comparer, la fonction permet de réaliser deux niveaux de test : un test de comparaison gobal, et des comparaisons multiples deux à deux.

1.2.1 La p-value du test global

Le premier niveau est le test global. Il permet d’évaluer si au moins deux moyennes sont différentes. Il s’agit d’une analyse de variance (ANOVA). En pratique, la fonction stat_compare_means permet de réaliser:

  • une ANOVA paramétrique, à l’aide de l’argument method="aov" ou method="anova"

  • une ANOVA non paramétrique, à l’aide de l’argument method="kruskal.test". Il s’agit de l’option par défaut.

La fonctionstat_compare_means s’ajoute simplement à la fonction permettant de faire le plot, comme ceci :

 

significativité des différences

Il est également possible de choisir à quel niveau, sur l’axe de y, placer la p-value, en utilisant l’argument label.y =.

 

significativité des différences

1.2.2 Les p-values des comparaisons deux à deux

Le deuxième niveau de test correspond aux comparaisons deux à deux entre les moyennes. Pour cette étape, la fonction stat_compare_means permet de réaliser :

  • des tests t de Student (qui sont des tests paramétriques) par l’intermédiaire de l’argument : method = "t.test".

  • des tests non paramétriques de Wilcoxon, en utilisant l’argument : method = "wilcox.test".

Pour afficher les pvalues des comparaisons deux à deux, celles-ci doivent être spécifiées en amont, puis passées à la fonction stat_compare_means par l’intermédiaire de l’argument comparisons, comme ceci :

significativité des différences

Lorsque seulement deux moyennes sont comparées, un seul niveau de p-value est évidemment affiché :

significativité des différences

1.3 Afficher les seuils de significativité :

Plutôt que les p-values, il est possible d’afficher les seuils de significativité, sous la fore de nombre d’étoiles, par l’intermédiaire de l’argument label = "p.signif" de la fonction stat_compare_means.

 

significativité des différences
1.4 Les limites du package

Lorsqu’on réalise des comparaisons multiples de moyennes, deux à deux, il est usuel d’ajuster les p-values pour conserver un risque alpha global de 5%.

Alors que le package ggpubr propose une fonction, pour réaliser des comparaisons de moyennes, avec des p-values ajustées (fonction compare_means()), il ne semble pas possible d’afficher ces p-values ajustées sur les plots.

Mise à jour : Vous trouverez un article décrivant comment afficher les pvalues ajustées ici :

 

En pratique, la fonction compare_means()permet de réaliser des ANOVA paramétriques et non paramétriques (test de Kruskal Wallis ), ainsi que les comparaisons multiples avec différentes méthodes d’ajustement des p-values:

significativité des différences

significativité des différences

D’autres méthodes d’ajustement des pvalues, sont utilisables. Pour plus de détails, utilisez ?p.adjust.methods.

Pour plus d’infos sur le package wilcox.t.test, vous pouvez consulter cette page, ou encore celle-ci.

 

2. Afficher la significativité des différences à l’aide de lettres

2.1 Principe

Pour réaliser ce type de représentation graphique, le principe est de :

  1. Faire les comparaisons de moyennes deux à deux avec les fonctions pairwise.t.test ou wilcox.t.test. Et en ajustant les pvalues si on le souhaite à l’aide des méthodes disponibles (voir les méthodes disponibles de la fonction p.adjust.methods).

  2. Récupérer la matrice triangulaire de p-values issues de ces fonctions, et la transformer en matrice rectangulaire par la fonction tri.to.squ. Le code de cette fonction est donnée plus bas.

  3. Entrer la matrice rectangulaire de p-values en argument de la fonction multcompLetters du package multcompView afin d’obtenir les lettres correspondant à chaque groupe (ou moyenne) comparé.

  4. Conserver les lettres dans un data.frame.

  5. Faire le plot principal avec le package ggplot2

  6. Ajouter les lettres sur ce plot avec la fonction geom_text

2.2 La fonction tri.to.squ

Le code de la fonctiontri.to.squ provient du blog de Fabio Marroni.

2.2 Exemple en pas à pas

En principe, les comparaisons multiples ne peuvent être réalisées que si le test global est significatif.

significativité des différences

 

J’espère que cet article vous permettra de réaliser plus facilement vos figures illustrant des comparaisons de moyennes, notamment pour vos publications. Si vous avez d’autres astuces pour réaliser ce type de représentation graphique, indiquez les moi en commentaire.

Et si cet article vous a plu, partagez le !

 

Retrouver ici mes 5 derniers articles “astuce”:

Comment retrouver sous R une couleur employée avec Excel?

Choisissez et modifiez très facilement les couleurs de vos graphs R avec Colour Picker

Versionnage de vos scripts avec RStudio + Git

Comment insérer des références bibliographiques dans un document Rmarkdown?

Estimer l’intervalle de confiance d’une moyenne par bootstrap en une seule ligne de commande

Partager l'article
  •  
  •  
  •  
  •  
  •  
    11
    Partages
  • 11
  •  
  •  
  •  
  •  

5 commentaires

  1. evane thorel Répondre

    bonjour

    Impossible de faire passer la fonction tri.to.squ

    Une idée de la cause de ce disfonctionnement

    Cordialement

  2. Cat Répondre

    Merci pour vos explications et pour l’aide fournie.
    Je débute sous R et un certain nombre d’aspects restent abscons, qui m’empêchent de suivre le pas à pas (car il manque des pas pour moi).
    J’essaye de faire une représentation graphique d’un test de wilcoxon où je compare 2 médianes.
    Je cherche à reproduire le graphique avec les boxplot, les points, et l’affichage de la pvalue du test.
    Le code que vous utilisez est le suivant :
    p <- ggboxplot(ToothGrowth, x = "supp", y = "len", color = "supp", palette = "jco",
    add = "jitter") +
    theme(legend.position="none")
    # Add p-value
    p + stat_compare_means()
    Mais je n'arrive pas à le mettre en œuvre : "objet p introuvable".
    J'ai installé les package ggplot2 et ggpubr
    j'ai du mal ensuite à m'y retrouver avec les significations des x et y que vous indiquez dans le code : je ne sais pas s'il s'agit de la formule à part entière ou du nom de vos variables (mais à ce moment là où indique t-on les variables à utiliser?).
    Dans mon cas j'ai un nom de data qui contient l'ensemble de mes variables…. et les 2 variables que je croise dans mon test de wilcoxon. Mettons respectivement "data", "var1", "var2"…
    Pourriez-vous svp m'éclairer pour cet exemple ? cela me permettrait ensuite de mettre en œuvre les autres. Encore merci pour votre patience

  3. Keita Répondre

    Bonjour donnez nous souvent les scripts en pdf pour qu’on puisse les télécharger et les utiliser

  4. David ROUX Répondre

    Vraiment pour les pistes données.
    Cependant si on fait les stats avec le package PMCMR, devenu récemment PMCMRplus, il n’est plus possible de l’interfacer avec multcompLetters. PMCMRplus possède bien une fonction summaryGroup qui produit les lettres pour les groupes significatifs, mais sous forme de text. Je n’arrive pas à récupérer ces lettres pour les injecter dans ggplot. Une piste serait la fonction R capture.output…
    Cordialement

    • Claire Della Vedova Auteur de l’articleRépondre

      Bonjour,

      je ne connais pas du tout ce package…
      Bonne continuation.

Laisser un commentaire

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