Jerome Cornfield ได้เขียน:
หนึ่งในผลไม้ที่ดีที่สุดของการปฏิวัติของชาวประมงคือความคิดของการสุ่มและนักสถิติที่เห็นด้วยกับสิ่งอื่น ๆ น้อยได้เห็นด้วยอย่างน้อยในเรื่องนี้ แต่แม้จะมีข้อตกลงนี้และแม้จะมีการใช้ขั้นตอนการจัดสรรแบบสุ่มในทางคลินิกและในรูปแบบอื่น ๆ ของการทดลอง แต่สถานะทางตรรกะของมันก็คือฟังก์ชันที่แน่นอนที่มันทำนั้นยังคงคลุมเครือ
ทุ่งนาเจอโรม (1976) "ผลงานล่าสุดกับระเบียบวิธีการทดลองทางคลินิก" วารสารระบาดวิทยาแห่งอเมริกา 104 (4): 408–421
ในเว็บไซต์นี้และในวรรณคดีที่หลากหลายฉันมักเห็นการอ้างสิทธิ์ที่มั่นใจเกี่ยวกับพลังของการสุ่ม คำศัพท์ที่แข็งแกร่งเช่น "มันกำจัดปัญหาของตัวแปรที่รบกวน" เป็นเรื่องปกติ ดูที่นี่ยกตัวอย่างเช่น อย่างไรก็ตามมีการทดลองหลายครั้งด้วยตัวอย่างเล็ก ๆ (3-10 ตัวอย่างต่อกลุ่ม) สำหรับเหตุผลเชิงปฏิบัติ / จริยธรรม นี่เป็นเรื่องธรรมดามากในการวิจัยพรีคลินิกโดยใช้สัตว์และเซลล์เพาะเลี้ยงและนักวิจัยมักรายงานค่า p เพื่อสนับสนุนข้อสรุปของพวกเขา
สิ่งนี้ทำให้ฉันสงสัยว่าการสุ่มตัวอย่างทำได้ดีเพียงใดในการสร้างสมดุลให้กับขอบเขต สำหรับพล็อตนี้ฉันจำลองสถานการณ์เปรียบเทียบกลุ่มการรักษาและกลุ่มควบคุมด้วยความสับสนที่สามารถรับสองค่าด้วยโอกาส 50/50 (เช่น type1 / type2, ชาย / หญิง) มันแสดงให้เห็นการกระจายตัวของ "% ไม่สมดุล" (ความแตกต่างใน # ของ type1 ระหว่างการรักษาและตัวอย่างการควบคุมหารด้วยขนาดตัวอย่าง) สำหรับการศึกษาความหลากหลายของตัวอย่างขนาดเล็ก เส้นสีแดงและแกนด้านขวาแสดง ecdf
ความน่าจะเป็นขององศาสมดุลต่างๆภายใต้การสุ่มตัวอย่างสำหรับตัวอย่างขนาดเล็ก:
มีสองสิ่งที่ชัดเจนจากพล็อตนี้ (ยกเว้นกรณีที่ฉันทำบางอย่างผิดพลาด)
1) ความน่าจะเป็นที่จะได้รับตัวอย่างที่สมดุลลดลงเมื่อขนาดตัวอย่างเพิ่มขึ้น
2) ความน่าจะเป็นที่จะได้รับตัวอย่างที่ไม่สมดุลลดลงเมื่อขนาดตัวอย่างเพิ่มขึ้น
3) ในกรณีของ n = 3 สำหรับทั้งสองกลุ่มมีโอกาส 3% ที่จะได้รับกลุ่มที่ไม่สมดุลอย่างสมบูรณ์ (type1 ทั้งหมดในการควบคุม, type2 ทั้งหมดในการรักษา) N = 3 เป็นเรื่องปกติสำหรับการทดลองทางอณูชีววิทยา (เช่นวัด mRNA ด้วย PCR หรือโปรตีนที่มี Western blot)
เมื่อฉันตรวจสอบอีกกรณี n = 3 ฉันสังเกตเห็นพฤติกรรมที่แปลกประหลาดของค่า p ภายใต้เงื่อนไขเหล่านี้ ด้านซ้ายแสดงการกระจายโดยรวมของ pvalues ที่คำนวณโดยใช้การทดสอบ t ภายใต้เงื่อนไขของวิธีการที่แตกต่างกันสำหรับกลุ่มย่อย type2 ค่าเฉลี่ยสำหรับ type1 คือ 0 และ sd = 1 สำหรับทั้งสองกลุ่ม แผงด้านขวาแสดงอัตราบวกที่ผิดพลาดที่สอดคล้องกันสำหรับ "การตัดนัยสำคัญ" เล็กน้อยจาก. 05 ถึง.0001
การกระจายของค่า p สำหรับ n = 3 ด้วยสองกลุ่มย่อยและวิธีที่แตกต่างของกลุ่มย่อยที่สองเมื่อเปรียบเทียบกับการทดสอบ t (10,000 monte carlo ทำงาน):
นี่คือผลลัพธ์สำหรับ 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()