Джером Корнфілд написав:
Одним з найкращих плодів рибальської революції була ідея рандомізації, і статистики, які погоджуються на кілька інших речей, принаймні погодились на це. Але, незважаючи на цю угоду і незважаючи на широке використання рандомізованих процедур розподілу в клінічній та інших формах експериментів, її логічний статус, тобто точна функція, яку він виконує, все ще залишається незрозумілою.
Cornfield, Jerome (1976). "Останні методичні внески в клінічні випробування" . Американський журнал епідеміології 104 (4): 408–421.
На всьому веб-сайті та в різноманітній літературі я послідовно бачу впевнені твердження про сили рандомізації. Поширені термінології, такі як "це усуває проблему заплутаних змінних", є загальними. Дивіться тут , наприклад. Однак багато разів проводяться експерименти з невеликими зразками (3-10 зразків на групу) з практичних / етичних причин. Це дуже часто зустрічається в доклінічних дослідженнях з використанням тварин та клітинних культур, і дослідники зазвичай повідомляють про значення p в підтримку своїх висновків.
Це змусило мене замислитися, наскільки хороша рандомізація при балансуванні меж. Для цього сюжету я моделював ситуацію, порівнюючи групи лікування та контрольної групи з однією плутаниною, яка може приймати два значення з шансом 50/50 (наприклад, тип1 / тип2, чоловік / жінка). Він показує розподіл "% неврівноваженого" (Різниця в # типу1 між обробкою та контрольними зразками, розділеною на розмір вибірки) для досліджень різних малих розмірів вибірки. Червоні лінії та права бічна вісь показують ecdf.
Ймовірність різного ступеня врівноваженості при рандомізації для малих розмірів вибірки:
З цього сюжету зрозуміло дві речі (якщо я десь не заплутався).
1) Імовірність отримання точно збалансованих зразків зменшується зі збільшенням розміру вибірки.
2) Імовірність отримання дуже незбалансованої вибірки зменшується зі збільшенням розміру вибірки.
3) У випадку n = 3 для обох груп є 3% шанс отримати повністю незбалансований набір груп (весь тип1 в контролі, весь тип2 в лікуванні). N = 3 є загальним для експериментів з молекулярною біологією (наприклад, вимірюють мРНК за допомогою ПЛР або білки з вестерн-блот)
Під час подальшого вивчення n = 3 випадку я спостерігав дивну поведінку значень p у цих умовах. Ліва сторона показує загальний розподіл значень обчислення за допомогою t-тестів в умовах різних засобів для підгрупи типу2. Середнє значення для типу1 становило 0, а sd = 1 для обох груп. На правих панелях відображаються відповідні помилкові позитивні значення для номінальних "обмежень значущості" від .05 до.0001.
Розподіл p-значень для n = 3 з двома підгрупами та різними засобами другої підгрупи при порівнянні за допомогою тесту t (10000 монто-карло)
Ось результати для n = 4 для обох груп:
Для n = 5 для обох груп:
Для n = 10 для обох груп:
Як видно з діаграм вище, виявляється взаємодія між розміром вибірки та різницею між підгрупами, що призводить до різноманітних розподілів p-значень під нульовою гіпотезою, що не є однорідною.
Тож чи можна зробити висновок, що значення p не є надійними для правильно рандомізованих та контрольованих експериментів з невеликим розміром вибірки?
R код першого сюжету
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)
}
R код для ділянок 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()