Vous trouverez ci-joint la version préliminaire d’un chapitre que Thomas Carrel et moi-même avons rédigé et qui devrait paraître dans la réédition du « Traité de Psychologie Sociale » de L. Bègue-Shankland.
Catégorie : Blog
P-value
#.Blog
–Extrait d’une discussion sur Facebook–
I don’t think many people have a good sense for just how much sampling variability there is in the p-value in all but high power situations.
Effectivement, c’est un peu compliqué pour le lecteur non averti de se faire une idée de la distribution de la « fameuse » valeur de p, et de la façon que celle-ci a de danser plus ou moins frénétiquement en fonction de la présence ou non d’un effet. Lors d’une discussion avec des étudiants de Master autour de l’article de Simmons et collaborateurs (2011), j’ai essayé de leur en faire la démonstration avec une simple simulation sur R. Nous discutions de la pratique (questionnable) qui consiste a augmenter la taille de l’échantillon jusqu’à l’obtention d’un effet significatif, l’optional stopping. Je voulais leur faire comprendre qu’en l’absence d’un effet, la valeur de p se distribue de manière uniforme et qu’il est aussi probable d’obtenir un p d’une valeur comprise entre .01 et .02 qu’un p d’une valeur comprise entre .98 et .99. Par conséquent, s’arrêter de collecter des données aussitôt que p passe sous le seuil fatidique de .05 est risqué.
Pour ce faire, j’ai créé une simulation qui fait varier la taille de l’échantillon de 5 à 100, et qui « dessine » la valeur de p, en l’absence d’un effet, en fonction de la taille de l’échantillon.
Pour ce premier essai, on voit que la valeur de p passe sous le seuil de .05 quand n=21, pour remonter autour de .80 quand n=22, puis redescendre en dessous de .05 à n=26, etc.
On peut retenter l’expérience plusieurs fois, en ne modifiant aucun paramètre de celle-ci, et voir qu’à chaque fois l’échantillon nécessaire (nMIN) pour obtenir un p < .05 change.
Si on introduit un effet de taille modérée (d = .5), la forme de la distribution change un peu.
Les valeurs de p extrêmement hautes se font plus rares, et les valeurs inférieures à .05 plus fréquentes, au delà de 30-40 participants.
La distribution change encore davantage quand on introduit un effet de taille importante (d = .80).
Afin d’aborder le problème différemment, j’ai décidé de fixer une taille d’échantillon (n = 100) et de refaire l’expérience un grand nombre de fois (100 fois) pour voir comment la valeur de p réagit.
Encore une fois, on voit que la valeur de p se promène dans tout l’espace compris entre 0 et 1, quand il n’y a pas d’effet.
Je peux faire beaucoup plus que 100 essais (par exemple 10000), pour que ce soit encore plus parlant.
On voit bien avec ces simulations ce que veut dire que, en l’absence d’effet, la distribution de la p-value est uniforme. Une autre représentation consiste à faire un histogramme de la fréquence de la distribution de la valeur de p.
On peut maintenant se demander ce qu’il se passe quand on introduit un effet, de taille faible, moyenne, ou importante, sur la distribution de p.
Pour un effet faible (r = .10) :
Pour un effet moyen (r = .20) :
Pour un effet important (r = .30) :
Comme la dernière fois, je vous mets le code (un peu brut de décoffrage) ci-dessous. N’hésitez pas à me dire si j’ai fait une erreur dans celui-ci, ou à me laisser un commentaire si besoin.
# Optional stopping
d <- 0
n_range <- 5:100
# --- Ne rien modifier sous cette ligne ---
p <- as.matrix(n_range)
for(n in n_range) {
p[n-4] <- t.test(rnorm(n,0, 1), y = rnorm(n, d, 1))$p.value
}
plot(n_range, p, type="l", ylim=c(0, 1))
abline(h=.05, col="red")
# P-curve
b <- 0
n <- 100
nSims <- 10000
# --- Ne rien modifier sous cette ligne ---
B <- NULL
P <- NULL
for(i in 1:nSims) {
set.seed(NULL)
x <- rnorm(n)
y <- rnorm(n,b*x, sqrt(1-b^2))
m<- summary(lm(y~x))
B[i] <- m$coefficients[2,1]
P[i] <- m$coefficients[2,4]
}
trial <- 1:nSims
plot(trial,P, xlab="Trial #", ylab="p-value", ylim = c(0,1))
abline(h=.05, col="blue")
hist(P, breaks=100)
abline(h=nSims/100, col="blue")
Corrélation et taille de l’échantillon
Aujourd’hui un collègue avait l’air étonné d’apprendre que pour tester de façon fiable une corrélation, il fallait un échantillon d’au moins 150 participants. Cette affirmation provient d’un article de Schönbrodt & Perugini (2014)[^1] qui vont même jusqu’à proposer un échantillon de 250 participants pour estimer une corrélation qui soit stable.
Cela m’a donné envie de jouer un peu avec R pour voir comment les corrélations « dansent » autour de la vraie valeur en fonction de la taille de l’échantillon (de n=6 à n=500).
Dans une première tentative, j’ai essayé avec une « vraie » corrélation r=0, pour voir comment se comportaient les corrélations estimées en fonction de la taille de l’échantillon.
On peut constater que plus la taille de l’échantillon augmente, et plus on se rapproche de la « vraie » corrélation, et que effectivement, lorsque la taille de l’échantillon est faible (n < 100), les valeurs que prend R semblent partir dans tous les sens. On constate également que, malgré la faible taille de l’échantillon, la valeur de r dépasse rarement la valeur critique, caractérisée par les lignes en pointillés, qui nous amènerait à déclarer que la corrélation est significative. Je reviendrai sur ce point prochainement.
Dans cette première tentative, je n’ai simulé qu’un seul échantillon pour chaque taille comprise entre 6 et 500 observations. J’ai donc recommencé en simulant 1000 échantillons par valeur de n.
Le constat semble se généraliser, plus la taille de l’échantillon augmente, et plus on semble se rapprocher de la valeur réelle de la corrélation. Là encore, les tailles d’échantillons relativement faibles semblent renvoyer des corrélations très éloignée de la « vraie » corrélation. La recommandation de Schönbrodt & Perugini (2014) semble tout à fait raisonnable, puisqu’autour de 200-250 participants, les corrélations semblent se stabiliser.
Dans ce second graphique, on a l’impression que le nombre de faux positifs (les valeur de r supérieure à la valeur critique) est important. Pour y voir plus clair, j’ai demandé au logiciel de compter le nombre de fois où la valeur de r calculée dans l’échantillon dépassait la valeur critique, divisée par le nombre d’échantillons, en fonction de n. On espère que cette valeur ne dépasse pas le seuil alpha de .05.
On peut constater que cet indicateur gravite autour de .05, mais qu’il le dépasse parfois (tout ce qui se trouve au dessus de la ligne rouge). Cependant, autre fait intéressant, c’est qu’il ne semble pas y avoir de relation entre l’erreur de type I et la taille de l’échantillon. Ces erreurs semblent se distribuer de manière relativement homogène autour de ce seuil de .05n quelle que soit la taille de l’échantillon.
Pour ces deux premières tentatives, j’ai fixé la vraie corrélation à 0, pour voir ce qu’il se passe. J’ai également joué sur la valeur de la vraie corrélation pour voir ce qu’il se passe.
On peut constater que plus la valeur de la corrélation est élevée, et plus elle semble se stabiliser rapidement. Cependant, au jugé, elle semble rarement stable en dessous de 100 participants.
Pour information, la taille de l’échantillon nécessaire pour atteindre une puissance statistique de .80 est n=193 pour une corrélation r=.20, n=28 pour r = .50, et n=9 pour r = .80.
Voilà qui conclue mes errances pour ce soir. Je vous colle le code que j’ai utilisé ci-dessous, mais je vous préviens, il est probablement illisible. Un jour peut-être, je prendrais le temps de le commenter. N’hésitez pas à me laisser un commentaire si vous constatez une erreur dans le raisonnement ou dans le code, je débute dans les simulations, et je voulais juste partager avec vous mes errances statistiques.
Bonne continuation.
### Correlations
R <- .80 #Vraie corrélation
n_range <- 6:500 #Sample Size
sim <- 1000 #Nombre de simulations
###
r <- matrix(,length(n_range),sim)
for(i in 1:sim){
set.seed(NULL)
for(n in n_range) {
x <- rnorm(n)
y <- rnorm(n,R*x, sqrt(1-R^2))
r[n-5,i] <- cor(x,y)
}
}
d <- c(r)
sample_size <- n_range
d <- cbind(sample_size, d)
### Valeur critique de R
critical.r <- function( n, alpha = .05 ) {
df <- n - 2
critical.t <- qt( alpha/2, df, lower.tail = F )
critical.r <- sqrt( (critical.t^2) / ( (critical.t^2) + df ) )
return( critical.r )
}
crit <- critical.r(n_range)
dx <- cbind(n_range, crit, 0-crit)
### Graph
graphics.off()
plot(d[,1], d[,2], ylim=c(-1, 1), ylab = "r", xlab = "n", pch=18)
abline(h=0, col="blue")
abline(h=R, col="red")
text(x=400, y=R+.03, "Vraie corrélation", col="red", cex=.75)
lines(dx[,1], dx[,2], col="red", lty =2)
lines(dx[,1], dx[,3], col="red", lty =2)
[^1]: Schönbrodt, F. D., & Perugini, M. (2013). At what sample size do correlations stabilize? Journal of Research in Personality, 47(5), 609–612. doi:10.1016/j.jrp.2013.05.009