ジェローム・コーンフィールドは書いている:
フィッシャー革命の最もすばらしい成果の1つはランダム化のアイデアであり、他のいくつかのことに同意する統計学者は少なくともこれに同意しています。しかし、この合意にもかかわらず、臨床やその他の実験形式でのランダム化された割り当て手順の広範な使用にもかかわらず、その論理的なステータス、つまり、それが実行する正確な機能は依然として不明です。
コーンフィールド、ジェローム(1976)。「臨床試験への最近の方法論的貢献」。American Journal of Epidemiology 104(4):408–421。
このサイト全体とさまざまな文献で、私はランダム化の力について自信のある主張を一貫して見ています。「交絡変数の問題を排除する」などの強力な用語が一般的です。たとえば、こちらをご覧ください。ただし、実際的/倫理的な理由から、小さなサンプル(グループあたり3〜10サンプル)で何度も実験が行われます。これは、動物や細胞培養を使用した前臨床研究では非常に一般的であり、研究者は一般に、それらの結論を裏付けるp値を報告します。
これにより、交絡のバランスをとる上でのランダム化はどの程度優れているのかと思いました。このプロットでは、50と50の確率で2つの値をとることができる1つの交絡(たとえば、type1 / type2、male / female)で処理グループとコントロールグループを比較する状況をモデル化しました。さまざまな小さなサンプルサイズの研究における「%不均衡」(処理サンプルとコントロールサンプル間のtype1の#の差をサンプルサイズで割ったもの)の分布を示しています。赤い線と右側の軸はecdfを示します。
小さいサンプルサイズのランダム化におけるさまざまな程度のバランスの確率:
このプロットから2つのことは明らかです(私がどこかで失敗した場合を除きます)。
1)サンプルサイズが大きくなると、正確にバランスの取れたサンプルが得られる確率は低くなります。
2)サンプルサイズが大きくなると、非常に不均衡なサンプルが得られる確率が低くなります。
3)両方のグループでn = 3の場合、完全に不均衡なグループのセット(コントロールのすべてのタイプ1、治療のすべてのタイプ2)を取得する可能性は3%です。N = 3は分子生物学実験で一般的です(例:PCRでmRNAを測定する、またはウエスタンブロットでタンパク質を測定する)
さらにn = 3の場合を調べたところ、これらの条件下でp値の奇妙な動作が観察されました。左側は、type2サブグループのさまざまな平均の条件下でt検定を使用して計算するp値の全体的な分布を示しています。type1の平均は0で、両方のグループでsd = 1でした。右側のパネルは、0.05から.0001までの名目上の「有意なカットオフ」に対応する偽陽性率を示しています。
t検定(10000モンテカルロラン)で比較した場合の2つのサブグループと2番目のサブグループの異なる平均を使用したn = 3のp値の分布:
両方のグループの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)
}
プロット2〜5のRコード
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()