|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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 .
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
*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 :
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.
|
English |
Français
News
![]() OgO: plus ici|more here [Publications] Neumann, Nils, Olivier Godechot et al. , , Rapid earnings growth in finance concentrates top earnings in a few large: plus ici|more here [Publications] Elvira, Marta and Olivier Godechot, Top earners are increasingly isolated at work – here’s why it matters, The conversation: plus ici|more here Tweets (rarely/rarement): @OlivierGodechot |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
HOP A CMS |