这是我之前提出的问题的临时解决方案。它似乎有效,但当我看到ddply
的洗牌时,我想知道它是否真的是随机的。有些拆分似乎很不幸,比如块4中的BAAAAB
。我曾考虑过使用ddply
反复洗牌,但我有兴趣看到其他潜在的解决方案。
#### Load packages ####
require(plyr)
#### Create randomization ####
set.seed(1984)
nBlocks <- 1:9
sBlocks <- c( sample( c(rep(3,4), rep(6,3)) ), sample( c(3,6) ) )
trtGroup <- c("A","B")
trtRatio <- 2:1
rand <- data.frame( block=rep(nBlocks, sBlocks), treatment=rep(trtGroup, trtRatio) )
rand <- ddply(rand[sample(row.names(rand)), ], .(block))
rand
问题:
我最近学会了如何使用SAS计划程序在不同块大小的情况下执行排列块随机化。我一直在尝试如何使用R来做同样的事情。blockrand
和experiment
包不允许不同治疗组的患者数量不相等。
假设我想以2:1的比例将30名患者随机分配到实验组和对照组(即,实验组N=20,对照组N=10)。进一步假设我想要6个患者的3个区块和3个患者的4个区块,并且我想要随机改变区块大小。如何使用R?
关于:
set.seed(12345)
allocation <- NULL
block <- sample(c(rep(1,4),rep(2,3)),7)
for(i in 1:7){
tallocation <- sample(c(rep(0,block[i]),rep(1,block[i]*2)), 3*block[i])
allocation <- c(allocation, tallocation)
}
这在randomizr
:中很容易
install.packages("randomizr")
library(randomizr)
block <- c(rep(1:3, each = 6), rep(4:7, each = 3))
Z <- block_ra(block, prob = 2/3)
table(block, Z)
CCD_ 7是长度为30的向量。你可以看到治疗的分布:
> table(block, Z)
Z
block 0 1
1 2 4
2 2 4
3 2 4
4 1 2
5 1 2
6 1 2
7 1 2