Test binomial en langage R

L'essentiel de cette page,

Le test binomial permet de voir si un effectif correspond à la théorie ou non. On le réalise avec la fonction binom.test()

Voici la fonction binom.test()

binom.test(x=,n=,p=,alternative='l')

x : nombre de valeurs observées

n : taille de l'échantillon

p : valeur théorique

alternative : hypothèse nulle appliqué, permet de voir si une proportion diffère de la théorie (t), si elle est plus grande (g) ou plus petite (l).

Appliquons la fonction binom.test() pour voir si une proportion expérimentale correspond à une proportion théorique

Exemple : j'ai compté dans une classe d'étudiants 22 filles et 8 garçons : il y a donc 30 étudiants.

Normalement, nous avons 50% de filles dans la population. Est-ce que cet échantillon correspond ?

binom.test(22,30, p=0.5) 

Résultat : p-value = 0.01612, la proportion de filles de correspond pas à la répartition normale de la population de 50% de filles

En réalité, nous sommes dans une formation de biologie qui présente en moyenne 2/3 de filles pour 1/3 de garçons. Vérifions si l'échantillon coïncide :

binom.test(22,30, p=2/3) 

Résultat : p-value = 0.5622, l'échantillon correspond.

Par défaut ici, la p-value est de 0,5622, mais on raisonne dans les 2 directions : exclure les proportions trop basses ou trop hautes.

Si en revanche, on cherchait à démontrer que notre taux d'erreur est acceptable : on chercherait juste à montrer qu'il n'est pas trop haut avec l'alternative g comme greater :

Mon groupe de 25 a vu 15 étudiants se tromper alors qu'un taux normal est de 30% : voyons si c'est trop.

binom.test(15, 25, p=0.3, alternative="g"

La p-value n'est plus la même que par défaut puisque les 5% d'erreur tolérée ne sont plus réparties que sur le haut (seuil bleu) au lieu d'être sur les 2 extrémités de la distribution (seuils verts).

plot(0:25,dbinom(0:25,size=25,prob=0.3),type="h",col="red",lwd=2,xlab="nombre d'erreur",ylab="proba")

abline(v=qbinom(c(0.95),size=25,prob=0.3),col="blue")  # "g"

abline(v=qbinom(c(0.025,0.975),size=25,prob=0.3),col="green")  # "t" 2 côtés (test de base)

Les hypothèses alternatives :  g (greater), t  (deux côtés) et l (lower).

Raisonnons avec les probabilités de la loi binomiale

Quelques fonctions sont très utiles pour voir et comprendre les résultats que l'on peut s'attendre à voir dans différents scénarios discrets.

Prenons un  exemple bien utile : je fais une étude sur X variables (disons 20) que je cherche à corréler à un Y. Je compte ainsi retenir toutes les variables significativement corrélées avec un seul de p-value de 0,05... Oui, mais certaines variables seront faussement identifiée comme corrélées à causes du hasard !!! (erreur du type 1) : je peux donc prédire à combien de variables faussement corrélées je peux m'attendre ! Allons-y :

dbinom() donne la densité, pbinom() donne la fonction de distribution, qbinom() donne la fonction quantile et rbinom() génère des écarts aléatoires.

plot(0:8,dbinom(0:8,size=20,prob=0.05),type="h",col="red",lwd=2,

xlab="Nombre de variables faussement corrélées (erreur de type 1)",ylab="Probabilités")


On voit sur ce graphique qu'avec une p-value à 0,05, si on fait des analyses de corrélations entre Y et 20 variables différentes, on risque fortement d'avoir de fausses corrélations !!! Entre 1 et 3 variables... Peu de chance en revanche d'avoir 8 faux positifs.

Loi binomiale : variétés faussement significatives si on fait des corrélations de Y avec 20 variables.

qbinom(0.95,size=20,prob=0.05) # Renvoie la valeur 3

La fonction qbinom renvoie ici le quartile 95% (on aurait pu aussi demander un vecteur) : ainsi, si on applique une confiance à 95%, on voit qu'il sera probable avec 20 variables d'en avoir 3 erreurs de type 1.

SI je change le seuil de ma p-value à 0,01 : ce sera mieux, 1 seule erreur de type 1.

qbinom(0.95,size=20,prob=0.01) # Renvoie la valeur 3

Je souhaite ne pas avoir d'erreur de type 1, je me fixe ainsi pour objectif d'avoir dans 95% des cas 0 erreur, je tâtonne avec la fonction pbinom :

# La valeur 0 représente : 35% des cas avec p-value = 0.05, trop d'erreur !

dbinom(0,size=20,prob=0.05) 

# La valeur 0 représente : 81% des cas avec p-value = 0.01, trop d'erreur !

dbinom(0,size=20,prob=0.01) 

# La valeur 0 représente : 98% des cas avec p-value = 0.001, c'est mieux ! Risque d'avoir des erreurs de type 1 dans 2% des cas.

dbinom(0,size=20,prob=0.001) 

La fonction pbinom() marcherait aussi : elle donne des probabilités cumulées. Forcément dbinom(0...) aura donc le même retour que pbinom(0...).

Sans surprise, le tâtonnement va nous renvoyer vers une p-value de 0.0025 ici pour éviter les erreurs de type 1 dans 95% des cas.

==> Ce sera la même valeur qui sera renvoyée par la correction de Sidak !

p.value = 1 - 0.95^(1/20)