Jerome Cornfield đã viết:
Một trong những thành quả tốt nhất của cuộc cách mạng Ngư dân là ý tưởng về sự ngẫu nhiên, và các nhà thống kê đồng ý về một số điều khác ít nhất đã đồng ý về điều này. Nhưng bất chấp thỏa thuận này và mặc dù sử dụng rộng rãi các quy trình phân bổ ngẫu nhiên trong lâm sàng và trong các hình thức thử nghiệm khác, tình trạng logic của nó, tức là chức năng chính xác mà nó thực hiện, vẫn còn mù mờ.
Cánh đồng ngô, Jerome (1976). "Những đóng góp về phương pháp gần đây cho các thử nghiệm lâm sàng" . Tạp chí Dịch tễ học Hoa Kỳ 104 (4): 408 Biến421.
Trong suốt trang web này và trong một loạt các tài liệu, tôi luôn thấy những tuyên bố tự tin về sức mạnh của sự ngẫu nhiên. Thuật ngữ mạnh như "nó loại bỏ vấn đề về các biến gây nhiễu" là phổ biến. Xem ở đây , ví dụ. Tuy nhiên, nhiều lần thí nghiệm được chạy với các mẫu nhỏ (3-10 mẫu mỗi nhóm) vì lý do thực tế / đạo đức. Điều này rất phổ biến trong nghiên cứu tiền lâm sàng sử dụng động vật và nuôi cấy tế bào và các nhà nghiên cứu thường báo cáo giá trị p để hỗ trợ cho kết luận của họ.
Điều này khiến tôi tự hỏi, sự ngẫu nhiên tốt như thế nào trong việc cân bằng các giới hạn. Đối với âm mưu này, tôi đã mô hình hóa một tình huống so sánh các nhóm điều trị và kiểm soát với một nhóm có thể có hai giá trị với cơ hội 50/50 (ví dụ: type1 / type2, nam / nữ). Nó cho thấy sự phân phối "% không cân bằng" (Sự khác biệt về # loại 1 giữa các mẫu xử lý và mẫu đối chứng chia cho cỡ mẫu) cho các nghiên cứu về nhiều cỡ mẫu nhỏ. Các đường màu đỏ và trục bên phải hiển thị ecdf.
Xác suất của các mức độ cân bằng khác nhau trong ngẫu nhiên cho các cỡ mẫu nhỏ:
Hai điều rõ ràng từ cốt truyện này (trừ khi tôi nhắn tin ở đâu đó).
1) Xác suất lấy mẫu cân bằng chính xác giảm khi kích thước mẫu tăng.
2) Xác suất lấy mẫu rất mất cân bằng giảm khi kích thước mẫu tăng.
3) Trong trường hợp n = 3 cho cả hai nhóm, có 3% cơ hội nhận được một nhóm các nhóm hoàn toàn không cân bằng (tất cả loại 1 trong kiểm soát, tất cả loại 2 trong điều trị). N = 3 là phổ biến cho các thí nghiệm sinh học phân tử (ví dụ: đo mRNA bằng PCR hoặc protein với Western blot)
Khi tôi kiểm tra trường hợp n = 3 hơn nữa, tôi quan sát thấy hành vi lạ của các giá trị p trong các điều kiện này. Phía bên trái cho thấy sự phân phối tổng thể của các giá trị tính toán bằng cách sử dụng các phép thử t trong các điều kiện của các phương tiện khác nhau cho nhóm con type2. Giá trị trung bình của type1 là 0 và sd = 1 cho cả hai nhóm. Các bảng bên phải hiển thị tỷ lệ dương tính giả tương ứng cho "ngưỡng ý nghĩa" danh nghĩa từ 0,05 đến 0,0001.
Phân phối giá trị p cho n = 3 với hai nhóm phụ và phương tiện khác nhau của nhóm phụ thứ hai khi được so sánh qua thử nghiệm t (10000 monte carlo chạy):
Dưới đây là kết quả cho n = 4 cho cả hai nhóm:
Với n = 5 cho cả hai nhóm:
Với n = 10 cho cả hai nhóm:
Như có thể thấy từ các biểu đồ ở trên, dường như có sự tương tác giữa kích thước mẫu và sự khác biệt giữa các nhóm con dẫn đến một loạt các phân phối giá trị p theo giả thuyết null không đồng nhất.
Vì vậy, chúng ta có thể kết luận rằng giá trị p không đáng tin cậy cho các thử nghiệm ngẫu nhiên và được kiểm soát đúng với kích thước mẫu nhỏ?
Mã R cho âm mưu đầu tiên
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)
}
Mã R cho các lô 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()