olivier godechot

Comment faire des tests sous R ?

Un petit article d'introduction aux tests sous R publié d'abord ici http://quanti.hypotheses.org/404.

Comment faire des tests sous R ?

 

Les articles de sciences sociales utilisent les tests de manière routinisée à travers notamment l'examen des paramètres d'une régression. Il n'est pas inutile de revenir aux bases pour comprendre le test dans sa généralité avant de l'embrigader dans la lourde mathématique de l'analyse toutes choses égales par ailleurs. Au commencement le test sert à répondre à des questions simples. Est-ce que je peux affirmer sans me tromper ou plus exactement sans avoir trop de chances de me tromper que deux moyennes sont différentes ou que deux variables ne sont pas indépendantes ?

 

Plutôt qu'un long discours sur la théorie des tests, les différentes espèces de risque, la notion de puissance et autre, l'idée de ce tutoriel est de proposer un apprentissage par la pratique. Donnons-nous un article où il y ait des tests facilement reproductibles pour voir ce qu'il en est. On trouve de tels tests dans les articles de sociologie portant sur des petits échantillons, là où l'utilisation des régressions multivariées ne donne souvent pas grand chose faute d'un effectif suffisant.

 

L'article de Bernard Zarca, « Mathérmaticien : une profession élitaire et masculine », Sociétés Contemporaines, 2006, 64, 41-65 fournit un bon exemple de ce type de données et permet d'illustrer deux des tests les plus utilisés, le test de Student et le test du Chi2, tests qui sont utilisés généralement pour montrer la différence de deux moyennes d'une part et la liaison de deux variables qualitatives d'autre part. Il porte sur les mathématiciens et souligne l'importance du plafond de verre pour les femmes dans cette discipline élitiste.

 

Prenons le tableau 4 de cet article.

 

TabLEAU 4 : Âge MOYEN D'ACCÈS À LA CLASSE 2 DU RANG A (PROFESSEURS ET DIRECTEURS DE RECHERCHE) DES MATHÉMATICIENS ET SCIENTIFIQUES CONNEXES. VARIATIONS SELON LA FILIÈRE DE FORMATION ET LE SEXE .


 


Mathématiciens

Scientifiques connexes

Ensemble

moyenne

38,5

40,3


écart type

5,4

5,7

Hommes

moyenne

38

41,4


écart type

5,3

5,5


effectif

123

64

Femmes

moyenne

40,9

41,9


écart type

5,4

7,7


effectif

18

16

 


seuil de significativité du F test de différence entre moyennes

.029

ns

Anciens élèves de l'ENS

moyenne

37,1

39,2


écart type

5,1

6,2


effectif

35

10

Autres

moyenne

38,3

41


écart type

5,5

5,3


effectif

40

21

 


seuil de significativité du F test de différence entre moyennes

ns

ns

ENS hommes

moyenne

37,4

40,1


écart type

5

5,6


effectif

26

8

Autres hommes

moyenne

38

40,5


écart type

5,6

4,7


effectif

34

18

ENS femmes

moyenne

40,1

35,5


écart type

5,4

2,1


effectif

7

2

Autres femmes

moyenne

39,7

44,3


écart type

5

8,5


effectif

6

3

 

 

Le tableau comporte quatre tests. Le test de la différence de moyennes d'âge au passage professeur entre les hommes et les femmes, les normaliens et les non-normaliens en mathématiques d'une part et dans les disciplines connexes d'autre part. Les tests pratiqués sont ici des tests de Fisher d'égalité des moyennes (ANOVA). Ceux-ci sont équivalents au test de student lorsque l'on teste l'égalité de deux moyennes uniquement, ce qui est le cas ici. Aussi on se permettra de tester celui-là. Le grand avantage du test de student (mais aussi son inconvénient diront certains), c'est que l'on n'a pas besoin de toute la distribution mais seulement de la moyenne, de l'écart-type et de l'effectif.

 

Test de Student

 

Première méthode : En décomposant tous les calculs.

 

Nous allons essayer de reproduire le premier test dans le tableau.

 

D'abord entrons les paramètres de l'échantillon d'âge des mathématiciens hommes passant professeur.

 

mean1<-38

sd1<-5.3

n1<-123

 

Faisons de même avec les femmes.

 

mean2<-40.9

sd2<-5.4

n2<-18

 

La logique du test est la suivante :

 

1. On veut montrer qu'il y a une différence d'âge entre hommes et femmes pour passer professeur.

 

2. On pose l'hypothèse nulle (celle qu'on veut « nullifier », c'est-à-dire réfuter) qu'il n'y a pas de différence d'âge entre les deux sexes.

 

3. On calcule la statistique empirique T d'écart entre notre échantillon et l'hypothèse nulle

 

4. On calcule la probabilité qu'un échantillon de même taille tiré dans notre population abstraite suivant les paramètres de H0 ait un écart à 0 au moins aussi grand.

 

5. Si cette probabilité est petite, on peut rejeter H0.

 

Pour reproduire le test, on va faire l'hypothèse que les variances sont égales, ce qui semble plutôt être le cas ici. (5.3 versus 5.4)

 

On calcule donc la variance commune. Cette variance est une moyenne pondérée des deux variances

 

vcom<-((n1-1)*sd1**2+(n2-1)*sd2**2)/(n1+n2-2)

vcom**0.5

 

 

On calcule la statistique de student t, qui représente l'écart entre notre échantillon et les hypothèses H0 d'égalité des moyennes dans les deux groupes :

 

t<-(mean1-mean2)/((vcom*(1/n1+1/n2))**0.5)

t

 

Calculons maintenant la probabilité que sous H0, dans échantillon de taille similaire, on ait une différence au moins aussi grande.

 

Pour cela nous avons besoin du degré de liberté du test :

 

df<-n1+n2-2

 

Pour calculer notre probabilité, nous avons besoin de la fonction de distribution de student :

 

pt(t,df)

 

Attention ! Ce premier calcul ne correspond pas la probabilité recherchée mais à celui-ci P(X<-2.16). Or nous cherchons la probabilité d'être dans les deux queues de distribution de la fonction de distribution de student.

 

Le calcul juste est P(X<-2.16 ou X>2.16)=2-2*P(|X|<2.16)

 

On calcule ici la probabilité qu'en tirant dans notre population abstraite - population infinie conforme à l'hypothèse nulle (pas de différence de moyenne entre hommes et femmes) - un échantillon de même taille ait un écart absolu à l'hypothèse nulle aussi grand que celle observée dans l'échantillon empirique dont nous disposons.

 

p<-2-2*pt(abs(t),df)

p

 

Conclusion : on a 3.2% de chance de tromper si l'on rejette l'égalité des moyennes. Cette probabilité est petite. On peut donc prendre ce risque et affirmer que les âges des hommes et des femmes au passage professeur sont différents en mathématiques.

 

On peut regarder la différence entre le test de student et l'utilisation d'une loi normale :

 

pbis<-2-2*pnorm(abs(t))

pbis

 

On voit que le test de Student est un peu plus conservateur. On rejette moins facilement H0. Mais la différence est ici minime. Elle est plus sensible quand l'effectif total est inférieur à 30.

 

Deuxième méthode : en générant des échantillons

 

A défaut de disposer des données de l'auteur, on peut générer des échantillons sous R qui ont les mêmes moyennes et écart-types. Avec la fonction rnorm on génère un échantillon de la taille voulue suivant la loi normale centrée réduite.

 

Une petite transformation assure qu'il a bien d'abord l'écart type voulu (x-mean(x))*sd1/sd(x) et ensuite la moyenne voulue (+mean1 ).

 

x<-rnorm(n1)

x<-((x-mean(x))*sd1/sd(x)+mean1)

mean(x)

sd(x)

 

y<-rnorm(n2)

y<-((y-mean(y))*sd2/sd(y)+mean2)

mean(y)

sd(y)

 

On utilise la fonction t.test avec l'option d'égalité des variances :

 

var.equal= TRUE

t.test(x,y,var.equal=TRUE)

 

On peut aussi le stocker dans un objet et voir ce qu'il y a dedans. Il y a en effet souvent plus dans un objet que ce qui est affiché par défaut .

 

test<-t.test(x,y,var.equal=TRUE)

 

On regarde ce qu'il y a dedans :

 

str(test)

 

Exemple du paramètre statistic de l'objet test :

 

test$statistic

 

Exemple du paramètre parameter de l'objet test  :

 

test$parameter

 

On peut aussi regarder ce qui se passe si on rejette l'hypothèse d'égalité des variances.

 

t.test(x,y,var.equal=FALSE)

 

Résultat : Le cacul de la statistique T change un petit peu. C'est surtout le degré de liberté qui change beaucoup. La correction consiste surtout à recalculer (avec une formule barbare) le bon degré de liberté sous l'hypothèse d'inégalité des variances.

 

On peut d'ailleurs faire le test d'égalité des variances pour en avoir le coeur net.

 

var.test(x,y)

 

La probabilité de se tromper si on rejette l'égalité des variances est de 0.85. On n'a donc pas de raison de rejeter l'égalité des variances.

 

L'article fait un test de Fisher et non un test de Student. Le test de Fisher permet de tester l'égalité de deux ou plus moyennes. Quand il y a deux groupes, il est équivalent à un test de student.

 

 

age<-c(x,y)

sex<-c(replicate(123,1),replicate(18,2))

b<-data.frame(cbind(age,sex))

b$sex<-factor(b$sex)

anova(lm(b$age~b$sex))

 

On obtient le même résultat que le test de Student avec l'hypothèse d'égalité des variances .

 

Pourquoi obtient-on une p.value différente de 0.032 différente de celle de l'article ? C'est sans doute lié aux arrondis sur les moyennes et les écarts-types.

 

L'auteur a arrondi ses moyennes et ses écarts-types à un chiffre après la virgule. Imaginons par exemple des moyennes à peine différentes qui s'arrondiraient comme dans l'article :

 

mean1b<-37.95

sd1<-5.4

n1<-123

 

mean2b<-40.94

sd2<-5.3

n2<-18

 

xb<-rnorm(n1)

xb<-((xb-mean(xb))*sd1/sd(xb)+mean1b)

 

yb<-rnorm(n2)

yb<-((yb-mean(yb))*sd2/sd(yb)+mean2b)

 

t.test(xb,yb,var.equal=TRUE)

 

On obtient alors quelque chose plus proche des résultats de l'auteur.

 

Test du Chi2

 

Le tableau 2 contient des croisements de variables qualitatives (sauter une classe, passer le bac avant 18 ans, avoir la mention très bien) et des variables d'appartenance disciplinaires, sexuelles ou scolaires. Dans ce tableau, l'auteur explique que les chiffres en gras correspondent à des écart significatifs en termes de chi2.

 

TABLEAU 2 : TRAITS SAILLANTS DE LA SCOLARITÉ DES MATHÉMATICIENS ET DES SCIENTIFIQUES CONNEXES ; PROPORTION % DE PERSONNES AYANT DONNÉ UNE RÉPONSE POSITIVE


A sauté une classe à l'école primaire A passé le bac avant 18 ans A eu la mention TB au bac Effectif
Physiciens théoriciens et mécaniciens

34

44

25

63

Informaticiens

27

33

17

147

Didacticiens des mathématiques

38

59

6

16

Ensemble des scientifiques connexes

30

38

18

226

Mathématiciens

34

42

32*

526

anciens élèves de l'ENS

47

59

42

225

Autres

23

29

24

288

Hommes

31

40

32

414

Femmes

42

51

34

110

ENS hommes

45

57

40

177

ENS femmes

50

67

48

46

Autres hommes

20

26

24

228

Autres femmes

34

38

23

60

*en gras : pourcentage significativement plus élevé au seuil de 5 % que celui correspondant à la catégorie

Le tableau juxtapose plusieurs tableaux croisés. Sont représentés seulement les pourcentages en ligne des modalités positives et l'effectif. Mais ces informations sont suffisantes pour reconstituer les tableaux originaux.

 

On va s'occuper de la différence de parcours scolaire (le fait de sauter une classe) entre normaliens et autres étudiants.

 

Voici les données : 47% des 225 normaliens ont sauté une classe. 23% des 288 non-normaliens ont sauté une classe.

 

p1<-c(0.47,0.23)

n<-c(225,288)

 

Première étape on reconstitue le tableau initial en multipliant les pourcentages en ligne et leur complémentaire par l'effectif. On arrondit le tout pour avoir des nombres entiers.

 

saut<-round(p1*n,0)

norm<-round((1-p1)*n,0)

tab2<-cbind(saut,norm)

 

On rajoute les noms de ligne pour faire plus joli :

 

rownames(tab2)<-c("normaliens","autres")

 

Voilà notre tableau

 

tab2

 

Avec les marges :

 

addmargins(tab2)

 

Les pourcentages en ligne

 

prop.table(tab2,1)

 

Calculons le test du chi2 de ce tableau croisé avec la fonction chisq.test de R. Pour les tableaux 2*2, R rajoute par défaut une correction, la correction de Yates qui est controversée. On l'enlève.

 

chisq.test(tab2,correct=FALSE)

 

On fait l'hypothèse nulle que dans notre population abstraite le passage par l'ENS et le fait de sauter des classes sont deux phénomènes indépendants. On calcule la probabilité de constater sur un échantillon similaire au notre tiré dans cette population abstraite un écart aussi grand à l'hypothèse nulle que celui constaté empiriquement.

Cette probabilité est égale à 8*10 puissance -9. soit 0,0000008%.

 

On prend donc vraiment très peu de risques à rejeter l'hypothèse nulle d'indépendance entre le passage par l'ENS et le fait de sauter des classes.

 

On peut aussi stocker notre test dans un objet et voir ce qu'il y a dedans.

 

chi2<-chisq.test(tab2,correct=FALSE)

str(chi2)

 

Le tableau des effectifs observés est alors :

 

chi2$observed

 

Le tableau des effectifs attendus à l'indépendance :

 

chi2$expected

 

Le tableau des résidus, c'est-à-dire, des écarts pondérés par la racine de l'indépendance. NB : le carré de ces écarts est la contribution au chi2.

 

chi2$residuals

 

Refaisons ce calcul, étape par étape.

 

On peut représenter le calcul de la statistique de chi2 comme le résultat d'un calcul aux étapes suivantes :

  1. Calcul de l'effectif attendu (A)

  2. Calcul des écarts entre l'effectif observé et attendu (O-A)

  3. Calcul des écarts au carré pondéré par l'attendu (O-A)²/A

  4. Somme des cases du tableau (O-A)²/A

 

Le tableau des effectifs attendus s'obtient en faisant le produit des marges divisé par l'effectif total . Les fonctions, rowSums et colSums permettent d'obtenir ces sommes en ligne et en colonne. La fonction t() permet de transposer la matrice, et l'opérateur %*% de multiplier deux matrices ensemble.

 

expec<-rowSums(tab2)%*%t(colSums(tab2))/sum(tab2)

expec

 

Le calcul du tableau des différences est plus simple : une simple différence des deux matrices.

 

dif<-tab2-expec

dif

 

Le tableau des contributions au chi2 : différences au carré divisé par l'attendu .

 

contr<-dif**2/expec

contr

 

La statistique du Chi2 est égale à la somme des contributions au chi2.

 

d2<-sum(contr)

d2

 

Une fois calculé cette statistique empirique d2, on va voir à quel point un échantillon tiré dans une population abstraite conforme à H0 peut la dépasser.

 

Pour cela, il nous faut, là aussi, un degré de liberté. Il est égal au nombre de lignes - 1 multiplié par le nombre de colonnes - 1.

 

df<-(nrow(tab2)-1)*(ncol(tab2)-1)

df

 

Le test du chi2 est un test unilatéral. La fonction de distribution pchisq permet de calculer P(X<D2). Or nous ce qui nous intéresse, c'est P(X>D2)=1-P(X<D2). D'où le calcul suivant  :

 

p<-1-pchisq(d2,df)

p

 

On obtient bien le même résultat.

 

Pour aller plus loin :

En guise de prolongement, on pourra essayer de reproduire les autres tests contenus dans les tableaux de Bernard Zarca.



LES COMMENTAIRES | COMMENTS

Ajouter un commentaire
Add a comment

Votre (Sur-)nom |Your (Nick-)name


Votre courriel |Your mail
(Il ne sera pas affiché |It will not be displayed))


Votre Commentaire | Your comment


Pour montrer que vous n'êtes pas un robot spammeur, merci de recopier l'image suivante en sens inverse
To show that you are not a spamming robot, please copy the content of the following image in reverse order
:

<< Retour au Commentaires

Tweets (rarely/rarement): @OlivierGodechot

[Webmestre]

[Fil rss]

[V. 0.93]

HOP

A CMS


000

clics / mois.