我对随机化的理解有问题吗?

Am I understanding something wrong about randomization?

我想在治疗组和对照组之间进行随机化'equalizes all factors (whether observed or not)'。

为了测试这一点,我执行了下面的代码,发现在超过一半的情况下,随机化效果不佳——这意味着至少一个变量在随机分组的治疗组和对照组之间存在统计学差异。


set.seed(1234)
for (i in 1:1000){
  
  ind<-sample(2, 10000, replace=TRUE, prob=c(0.5, 0.5))
  
  a<-as.matrix(rnorm(10000, mean=0, sd=1))
  b<-as.matrix(rnorm(10000, mean=0.5, sd=1)) 
  c<-as.matrix(rnorm(10000, mean=1, sd=2))
  dt<-data.frame(cbind(a,b,c))
  dt$X4 <- dt$X1 + dt$X2
  dt$X5 <- dt$X1 * dt$X3
  
  dt1<-dt[ind==1,]
  dt2<-dt[ind==2,]
  
  a_pval[i]<-t.test(dt1[1,], dt2[1,])$p.value
  b_pval[i]<-t.test(dt1[2,], dt2[2,])$p.value
  c_pval[i]<-t.test(dt1[3,], dt2[3,])$p.value
  d_pval[i]<-t.test(dt1[4,], dt2[4,])$p.value
  e_pval[i]<-t.test(dt1[5,], dt2[5,])$p.value
}

pval<-data.frame(cbind(a_pval,b_pval,c_pval,d_pval,e_pval))

pval<-mutate(pval, adiff = ifelse(a_pval<0.05, 1,0))
pval<-mutate(pval, bdiff = ifelse(b_pval<0.05, 1,0))
pval<-mutate(pval, cdiff = ifelse(c_pval<0.05, 1,0))
pval<-mutate(pval, ddiff = ifelse(d_pval<0.05, 1,0))
pval<-mutate(pval, ediff = ifelse(e_pval<0.05, 1,0))
pval$diff<-pval$adiff+pval$bdiff+pval$cdiff+pval$ddiff+pval$ediff

table(pval$diff)

length(which(a_pval<0.05))
length(which(b_pval<0.05))
length(which(c_pval<0.05))
length(which(d_pval<0.05))
length(which(e_pval<0.05))

是不是我的代码有问题?

我认为测试并没有按照您认为的那样进行。您的 t 检验是针对矩阵的行而不是列进行的,因此分布不是正态分布,它是正态分布的退化混合。将t测试线改为

a_pval[i]<-t.test(dt1[,1], dt2[,1])$p.value
b_pval[i]<-t.test(dt1[,2], dt2[,2])$p.value
c_pval[i]<-t.test(dt1[,3], dt2[,3])$p.value
d_pval[i]<-t.test(dt1[,4], dt2[,4])$p.value
e_pval[i]<-t.test(dt1[,5], dt2[,5])$p.value

这将得到修复,您会看到大约 5% 的 p 值小于 0.05,正如预期的那样。

老实说,我不明白您希望在 pval$diff table 中看到什么。由于第 4 列和第 5 列基于前 3 列,因此这些列是相关的,您不应期望看到计数的标准分布。