Jerome Cornfield a écrit:
L'un des meilleurs fruits de la révolution des pêcheurs a été l'idée de la randomisation, et les statisticiens qui sont d'accord sur peu d'autres choses sont au moins d'accord là-dessus. Mais malgré cet accord et malgré l'utilisation généralisée des procédures d'allocation aléatoire en clinique et dans d'autres formes d'expérimentation, son statut logique, c'est-à-dire la fonction exacte qu'il remplit, est encore obscur.
Cornfield, Jerome (1976). "Contributions méthodologiques récentes aux essais cliniques" . American Journal of Epidemiology 104 (4): 408–421.
Tout au long de ce site et dans une variété de littérature, je vois constamment des affirmations confiantes sur les pouvoirs de la randomisation. Une terminologie forte telle que «cela élimine le problème des variables confondantes» est courante. Voir ici , par exemple. Cependant, plusieurs fois, des expériences sont effectuées avec de petits échantillons (3 à 10 échantillons par groupe) pour des raisons pratiques / éthiques. Ceci est très fréquent dans la recherche préclinique utilisant des animaux et des cultures cellulaires et les chercheurs rapportent généralement des valeurs de p à l'appui de leurs conclusions.
Cela m'a amené à me demander quelle est la qualité de la randomisation pour équilibrer les confusions. Pour ce graphique, j'ai modélisé une situation comparant les groupes de traitement et de contrôle avec une confusion qui pourrait prendre deux valeurs avec une chance de 50/50 (par exemple type1 / type2, masculin / féminin). Il montre la distribution du «% non équilibré» (différence en nombre de type1 entre les échantillons de traitement et de contrôle divisés par la taille de l'échantillon) pour les études d'une variété de petites tailles d'échantillon. Les lignes rouges et les axes de droite montrent l'ecdf.
Probabilité de divers degrés d'équilibre sous randomisation pour de petits échantillons:
Deux choses ressortent clairement de cette intrigue (sauf si je me suis trompé quelque part).
1) La probabilité d'obtenir des échantillons parfaitement équilibrés diminue à mesure que la taille de l'échantillon augmente.
2) La probabilité d'obtenir un échantillon très déséquilibré diminue à mesure que la taille de l'échantillon augmente.
3) Dans le cas de n = 3 pour les deux groupes, il y a 3% de chances d'obtenir un ensemble de groupes complètement déséquilibré (tous de type1 dans le contrôle, tous de type2 dans le traitement). N = 3 est courant pour les expériences de biologie moléculaire (par exemple, mesurer l'ARNm avec PCR ou les protéines avec western blot)
Lorsque j'ai examiné le cas n = 3 plus loin, j'ai observé un comportement étrange des valeurs de p dans ces conditions. Le côté gauche montre la distribution globale des valeurs de p calculant à l'aide de tests t dans des conditions de moyennes différentes pour le sous-groupe de type2. La moyenne pour le type 1 était de 0 et sd = 1 pour les deux groupes. Les panneaux de droite montrent les taux de faux positifs correspondants pour les «seuils de signification» nominaux de 0,05 à 0001.
Distribution des valeurs de p pour n = 3 avec deux sous-groupes et des moyennes différentes du deuxième sous-groupe par comparaison via le test t (10000 passages de monte carlo):
Voici les résultats pour n = 4 pour les deux groupes:
Pour n = 5 pour les deux groupes:
Pour n = 10 pour les deux groupes:
Comme on peut le voir sur les graphiques ci-dessus, il semble y avoir une interaction entre la taille de l'échantillon et la différence entre les sous-groupes qui se traduit par une variété de distributions de valeurs p sous l'hypothèse nulle qui ne sont pas uniformes.
Pouvons-nous donc conclure que les valeurs de p ne sont pas fiables pour des expériences correctement randomisées et contrôlées avec de petits échantillons?
Code R pour le premier tracé
require(gtools)
#pdf("sim.pdf")
par(mfrow=c(4,2))
for(n in c(3,4,5,6,7,8,9,10)){
#n<-3
p<-permutations(2, n, repeats.allowed=T)
#a<-p[-which(duplicated(rowSums(p))==T),]
#b<-p[-which(duplicated(rowSums(p))==T),]
a<-p
b<-p
cnts=matrix(nrow=nrow(a))
for(i in 1:nrow(a)){
cnts[i]<-length(which(a[i,]==1))
}
d=matrix(nrow=nrow(cnts)^2)
c<-1
for(j in 1:nrow(cnts)){
for(i in 1:nrow(cnts)){
d[c]<-cnts[j]-cnts[i]
c<-c+1
}
}
d<-100*abs(d)/n
perc<-round(100*length(which(d<=50))/length(d),2)
hist(d, freq=F, col="Grey", breaks=seq(0,100,by=1), xlab="% Unbalanced",
ylim=c(0,.4), main=c(paste("n=",n))
)
axis(side=4, at=seq(0,.4,by=.4*.25),labels=seq(0,1,,by=.25), pos=101)
segments(0,seq(0,.4,by=.1),100,seq(0,.4,by=.1))
lines(seq(1,100,by=1),.4*cumsum(hist(d, plot=F, breaks=seq(0,100,by=1))$density),
col="Red", lwd=2)
}
Code R pour les parcelles 2-5
for(samp.size in c(6,8,10,20)){
dev.new()
par(mfrow=c(4,2))
for(mean2 in c(2,3,10,100)){
p.out=matrix(nrow=10000)
for(i in 1:10000){
d=NULL
#samp.size<-20
for(n in 1:samp.size){
s<-rbinom(1,1,.5)
if(s==1){
d<-rbind(d,rnorm(1,0,1))
}else{
d<-rbind(d,rnorm(1,mean2,1))
}
}
p<-t.test(d[1:(samp.size/2)],d[(1+ samp.size/2):samp.size], var.equal=T)$p.value
p.out[i]<-p
}
hist(p.out, main=c(paste("Sample Size=",samp.size/2),
paste( "% <0.05 =", round(100*length(which(p.out<0.05))/length(p.out),2)),
paste("Mean2=",mean2)
), breaks=seq(0,1,by=.05), col="Grey", freq=F
)
out=NULL
alpha<-.05
while(alpha >.0001){
out<-rbind(out,cbind(alpha,length(which(p.out<alpha))/length(p.out)))
alpha<-alpha-.0001
}
par(mar=c(5.1,4.1,1.1,2.1))
plot(out, ylim=c(0,max(.05,out[,2])),
xlab="Nominal alpha", ylab="False Postive Rate"
)
par(mar=c(5.1,4.1,4.1,2.1))
}
}
#dev.off()