Test de Student : Est-il toujours correct de comparer des moyennes?

 


Test t de Student

Probablement l’une des questions les plus populaires dans le domaine de la recherche est de savoir si deux groupes d’échantillons indépendants diffèrent l’un de l’autre. Le test de Student est l’un des tests statistiques le plus utilisé pour comparer les moyennes de deux groupes indépendants ou appariés.

La formule du test de Student est décrite en détails ici et le test peut être facilement fait en utilisant la fonction t.test() de R. Cependant, une des questions majeures est:

Est il toujours correct de comparer des moyennes?

La réponse est bien évidemment non!! Ceci est expliqué dans la section suivante.

L’objectif de cet article est :

  • Premièrement, de discuter à propos des conditions d’utilisation du test de Student
  • Deuxièmement, de fournir une fonction R simple d’utilisation (rquery.t.test()) permettant de guider étape par étape l’utilisateur dans le but de faire le test de student en respectant les conditions appropriées d’application.

Conditions d’application du test de Student : Normalité et égalité des variances

Les erreurs statistiques sont fréquentes dans les articles scientifiques, et environ 50% des articles publiés contiennent au moins une erreur. Beaucoup de tests statistiques notamment la corrélation, la régression, le test de Student et l’analyse de variance supposent que les données suivent une distribution normale.

Ces tests sont appelés tests paramétriques car leur validité dépend de la distribution des données.

Une erreur fréquente est d’utiliser des tests statistiques qui supposent une distribution normale sur des données qui ne suivent pas la loi normale.

Comme mentionner ci-dessus, on ne peut pas toujours utiliser le test de Student pour comparer des moyennes. Il existe différents types de tests de Student(test-de-student-formules): Le test de Student pour un échantillon unique, le test de Student pour échantillons indépendants et le test de Student pour échantillons appariés.

Ces différents tests peuvent être utilisés seulement sous certaines conditions :


Avant d’utiliser le test de Student vous devez vérifier :

  1. Dans le cas du test de Student pour un échantillon unique:
    • Si les données suivent la loi normale
  2. Dans le cas du test de Student indépendant:
    • Si les deux groupes d’échantillons (x et y), à comparer, suivent une loi normale;
    • et si les variances des deux groupes sont égales ou pas.
  3. Pour le test de student apparié:
    • Si la différence d (= x-y) suit une loi normale


Ces conditions doivent être vérifiées sérieusement pour pouvoir tirer des conclusions fiables.

Le résultat de ces tests préliminaires détermine par la suite la méthode à utiliser pour comparer les échantillons. Malheureusement, ces pré-tests ne sont pas automatiquement faits par la fonction native t.test() du logiciel R. C’est la raison pour laquelle j’ai écrit la fonction rquery.t.test() qui va tout d’abord vérifier les conditions d’application du test de Student et ensuite décide de la méthode à utiliser (test paramétrique ou non-paramétrique) à partir du résultat des tests préliminaires.

Comment tester la normalité des données?

Lorsque la taille des échantillons est suffisamment grande (n >30), on peut ignorer le test de normalité sans problème majeur.

Le théorème central limite nous dit que, la distribution de l’échantillonnage tend à suivre la loi normale lorsque la taille est grande ( n > 30).

En revanche, pour être rigoureux, la normalité peut être vérifier par une inspection visuelle [Histogramme, Q-Q plot (quantile-quantile plot)] ou par des tests de significativité.

  • L’histogramme permet un jugement visuel à savoir si la distribution est une courbe en cloche (courbe de Gauss).
  • Le test de significativité compare la distribution d’un échantillon donné à celle de la loi normale et renvoie une p-value.

Plusieurs méthodes existent pour le test de normalité, notamment le test de Kolmogorov-Smirnov (K-S) et le test de Shapiro-Wilk.

L’hypothèse nulle (H0) de ces tests est : " L’échantillon suit une loi normale“. Si le test est significatif, la distribution ne suit pas une loi normale.

La méthode de Shapiro-Wilk est le plus largement recommendé pour le test de normalité et il plus puissant que le test de K-S. Il est basé sur la corrélation entre les données et les scores théoriques de la loi normale.

Notez que le test de normalité est sensible à la taille des échantillons. Les échantillons de petite taille passe très souvent le test de normalité. Par conséquent, il est important de combiner une inspection visuelle et un test de significativité pour prendre la bonne décision.

Question : Faire ou ne pas faire le test de normalité?

Le test de normalité et les autres hypothèses faites par les tests paramétriques devraient être pré-testés avant de continuer avec le test principal de comparaison de moyennes. Par exemple, dans le domaine de la recherche médicale, la distribution normale des données est une exception plutôt qu’une règle. Dans de telles situations, l’utilisation des tests paramétriques n’est pas encouragée. Les tests non-paramétriques, tel que le test de Wilcoxon, sont recommandés.

Dans la fonction rquery.t.test(), le test de normalité de Shapiro-Wilk est utilisé et, une histogramme et un Q-Q plot sont automatiquement dessinés pour une inspection visuelle.

Comment tester l’égalité des variances ?

Le test de Student indépendant classique suppose l’homogénéité des variances des deux groupes à comparer. Si les deux échantillons suivent une loi normale, le test F peut être utilisé pour comparer les variances.

L’hypothèse nulle (H0) du test F est : “les variances des deux groupes sont égales”. Si le test est significatif, l’hypothèse nulle est rejeté et on peut conclure que les variances sont significativement différents.

Que faire lorsque les conditions d’application du test de Student ne sont pas remplies?

La procédure suivante, à deux étapes, est largement acceptée (voir figure ci-dessous):

  1. Si la normalité est acceptée, le test de Student est utilisé;
  2. Si les échantillons à comparer ne sont pas distribués selon une loi normale, un test non-paramétrique tel que le test de Wilcoxon est recommandé comme une alternative au test de Student.

Si les deux groupes d’échantillons suivent une loi normale, mais de variances inégales, le test t de Welch peut être utilisé (figure ci-dessous). Le test t de Welch est une adaptation du test t de Student et il est utilisé pour comparer deux échantillons lorsque l’égalité des variances ne peut être assumée.

t-test

rquery.t.test : La fonction t.test intélligente

Comme mentionner ci-dessus, cette fonction est une amélioration de la fonction native t.test() de R. Elle peut être utilisée pour faire un test de Student apparié ou indépendant. Son avantage est qu’elle vérifie automatiquement la distribution des données et l’égalité des variances des deux échantillons (dans le cas d’un test de Student indépendant).

Avant de calculer le t test, la fonction rquery.t.test effectue les étapes suivantes :

  1. Premièrement, le test de Shapiro Wilk est utilisé pour effectuer le test de normalité. Si les données ne suivent pas une loi normale, la fonction rquery.test vous avertira et vous suggère de faire le test de Wilcoxon.

  2. Un test F de comparaison de variances est également fait automatiquement :
  • Si les variances sont considérées égales : le test de Student classique est effectué
  • Si les variances sont significativement différentes : le test t de Welch est appliqué.

Notez que le code R de la fonction rquery.t.test() est fourni à la fin de ce document.

Un format simplifié de la fonction est :

rquery.t.test(x, y = NULL, paired = FALSE, graph = TRUE, ...)

Le résultat de la fonction rquery.t.test() est identique à celle donnée par la fonction native t.test de R. Il contient, entre autres, les éléments suivants :

  • statistic : La valeur de la statistique t
  • parameter : Le degré de liberté
  • p.value : p-value du test
Pour plus détails voir le chapitre : test de student avec R.

Test de Student pour échantillon unique : Comparaison d’une moyenne observée à une moyenne théorique

source('http://www.sthda.com/upload/rquery_t_test.r')
set.seed(123456789)
x<-rnorm(100) # générer des données
rquery.t.test(x, mu=0)

    One Sample t-test

data:  x
t = 0.2606, df = 99, p-value = 0.7949
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 -0.1657  0.2159
sample estimates:
mean of x 
  0.02506 

Test de student: comment faire simplement un test de student

Lire plus en suivant ce lien : Test de Student pour échantillon unique

Test de Student indépendant : Comparaison de moyennes de deux groupes d’échantillons indépendants

Cas 1 - Les deux groupes d’échantillons suivent des lois normales et sont de variances égales:

source('http://www.sthda.com/upload/rquery_t_test.r')
set.seed(123456789)
x<-rnorm(100, mean=2, sd=0.9)
y<-rnorm(100, mean=4, sd=1)
rquery.t.test(x, y)

    Two Sample t-test

data:  x and y
t = -16.85, df = 198, p-value < 2.2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -2.449 -1.935
sample estimates:
mean of x mean of y 
    2.023     4.215 

Test de student: comment faire simplement un test de student

Le test de Student classique est utilisé automatiquement.

Cas 2 - Les échantillons suivent des lois normales mais de variances différentes:

source('http://www.sthda.com/upload/rquery_t_test.r')
set.seed(123456789)
x<-rnorm(100, mean=2, sd=0.9)
y<-rnorm(100, mean=2, sd=3)
rquery.t.test(x, y)

    Welch Two Sample t-test

data:  x and y
t = -2.043, df = 116.3, p-value = 0.04326
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -1.22327 -0.01913
sample estimates:
mean of x mean of y 
    2.023     2.644 

Test de student: comment faire simplement un test de student

Le test t de Welch est utilisé automatiquement.

Cas 3 - Les échantillons ne sont pas distribués selon une loi normale:

source('http://www.sthda.com/upload/rquery_t_test.r')
set.seed(123456789)
x<-rnorm(100, mean=2, sd=0.9)
x<-c(x, 10,20) # add some outliers
y<-rnorm(100, mean=4, sd=1)
rquery.t.test(x, y)
Warning: x or y is not normally distributed : Shapiro test p-value : 2e-17 (for x) and 0.5 (for y).
 Use a non parametric test like Wilcoxon test.

    Welch Two Sample t-test

data:  x and y
t = -8.374, df = 142.2, p-value = 4.809e-14
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -2.395 -1.480
sample estimates:
mean of x mean of y 
    2.277     4.215 

Test de student: comment faire simplement un test de student

Un message d’avertissement est affiché et la fonction rquery.t.test vous suggère de faire un test non-paramétrique de type Wilcoxon.

Test de Student apparié : Compararaison de moyennes de deux séries dependantes

source('http://www.sthda.com/upload/rquery_t_test.r')
set.seed(123456789)
x<-rnorm(30, mean=10, sd=2)
y<-rnorm(30, mean=50, sd=3)
rquery.t.test(x, y, paired=TRUE)

    Paired t-test

data:  x and y
t = -56.5, df = 29, p-value < 2.2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -41.63 -38.72
sample estimates:
mean of the differences 
                 -40.17 

Test de student: comment faire simplement un test de student

Lire plus sur test de student apparié

Test de Student en ligne


Noter qu’un logiciel web est disponible ici permettant de calculer le test de Student en ligne sans aucune installation.


Code R de la fonction rquery.t.test

#++++++++++++++++++++++++
# rquery.t.test
#+++++++++++++++++++++++
# Description : Performs one or two samples t-test

# x : a (non-empty) numeric vector of data values.
# y : an optional (non-empty) numeric vector of data values
# paired : if TRUE, paired t-test is performed
# graph : if TRUE, the distribution of the data is shown
  # for the inspection of normality
# ... : further arguments to be passed to the built-in t.test() R function

# 1. shapiro.test is used to check normality
# 2. F-test is performed to check equality of variances
# If the variances are different, then Welch t-test is used

rquery.t.test<-function(x, y = NULL, paired = FALSE, 
                        graph = TRUE, ...)
{
  # I. Preliminary test : normality and variance tests
  # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  var.equal = FALSE # by default
  
  # I.1 One sample t test
  if(is.null(y)){
    if(graph) par(mfrow=c(1,2))
    shapiro.px<-normaTest(x, graph, 
                          hist.title="X - Histogram",
                          qq.title="X - Normal Q-Q Plot")
    if(shapiro.px < 0.05)
      warning("x is not normally distributed :",
        " Shapiro-Wilk test p-value : ", shapiro.px, 
        ".\n Use a non-parametric test like Wilcoxon test.")
  }
  
  # I.2 Two samples t test
  if(!is.null(y)){
    
      # I.2.a unpaired t test
      if(!paired){
          if(graph) par(mfrow=c(2,2))
          # normality test
          shapiro.px<-normaTest(x, graph, 
                                hist.title="X - Histogram",
                                qq.title="X - Normal Q-Q Plot")
          shapiro.py<-normaTest(y, graph,
                                hist.title="Y - Histogram",
                                qq.title="Y - Normal Q-Q Plot")
          if(shapiro.px < 0.05 | shapiro.py < 0.05){
              warning("x or y is not normally distributed :",
                " Shapiro test p-value : ", shapiro.px,
                " (for x) and ", shapiro.py, " (for y)",
                ".\n Use a non parametric test like Wilcoxon test.")
            }
          # Check for equality of variances
          if(var.test(x,y)$p.value >= 0.05) var.equal=TRUE
        } 
      
      # I.2.b Paired t-test
      else {
        if(graph) par(mfrow=c(1,2))
        d = x-y 
        shapiro.pd<-normaTest(d, graph, 
                              hist.title="D - Histogram",
                              qq.title="D - Normal Q-Q Plot")
        if(shapiro.pd < 0.05 )
          warning("The difference d ( = x-y) is not normally distributed :",
                " Shapiro-Wilk test p-value : ", shapiro.pd, 
                ".\n Use a non-parametric test like Wilcoxon test.")
      } 
      
   }
  
  # II. Student's t-test
  # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  res <- t.test(x, y, paired=paired, var.equal=var.equal, ...)
  return(res)
}


#+++++++++++++++++++++++
# Helper function
#+++++++++++++++++++++++

# Performs normality test using Shapiro Wilk's method
# The histogram and Q-Q plot of the data are plotted

# x : a (non-empty) numeric vector of data values.
# graph : possible values are TRUE or FALSE. If TRUE,
  # the histogram and the Q-Q plot of the data are displayed
# hist.title : title of the histogram
# qq.title : title of the Q-Q plot
normaTest<-function(x, graph=TRUE, 
                    hist.title="Histogram", 
                    qq.title="Normal Q-Q Plot",...)
  {  
  # Significance test
  #++++++++++++++++++++++
  shapiro.p<-signif(shapiro.test(x)$p.value,1) 
  
  if(graph){
    # Plot : Visual inspection
    #++++++++++++++++
    h<-hist(x, col="lightblue", main=hist.title, 
            xlab="Data values", ...)
    m<-round(mean(x),1)
    s<-round(sd(x),1)
    mtext(paste0("Mean : ", m, "; SD : ", s),
          side=3, cex=0.8)
    # add normal curve
    xfit<-seq(min(x),max(x),length=40)
    yfit<-dnorm(xfit,mean=mean(x),sd=sd(x))
    yfit <- yfit*diff(h$mids[1:2])*length(x)
    lines(xfit, yfit, col="red", lwd=2)
    # qq plot
    qqnorm(x, pch=19, frame.plot=FALSE,main=qq.title)
    qqline(x)
    mtext(paste0("Shapiro-Wilk, p-val : ", shapiro.p),
          side=3, cex=0.8)
  }
  return(shapiro.p)
}

Infos

Cette analyse a été effectué avec R (ver. 3.1.0).


References

  1. Asghar Ghasemi, Saleh Zahediasl; Normality Tests for Statistical Analysis: A Guide for Non-Statisticians; Int J Endocrinol Metab. 2012;10(2):486-489.
  2. Rochon J1, Gondan M, Kieser M.; To test or not to test: Preliminary assessment of normality when comparing two independent samples; BMC Med Res Methodol. 2012 Jun 19;12:81.


 Get involved :
  Click to follow us on and Google+ :   
  Comment this article by clicking on "Discussion" button (top-right position of this page)
  Sign up as a member and post news and articles on STHDA web site.


Suggestions


 
Cette page a été vue 433 fois