在组内随机分配R中的整数而无需替换

时间:2015-07-30 08:03:45

标签: r integer sampling experimental-design

我正在进行两项实验的实验:experiment_1和experiment_2。每个实验具有5种不同的处理(即1,2,3,4,5)。我们试图在组内随机分配治疗。

我们希望通过抽样来实现这一点,而不是在每个组内迭代替换。我们希望这样做是为了确保我们在治疗中获得尽可能平衡的样本(例如,我们不希望第1组中的4名受试者被分配到治疗2而没有人得到治疗1) 。因此,如果一个群体有23个受试者,我们希望将受访者分成4个5个子群组和1个3个子群体。然后我们想要在5个第一个子群体中随机抽样而不进行替换,因此每个人都被分配了1个治疗,为第二,第三和第四小组5做同样的事情,并为3个最终小组随机抽样而不做替换。因此,我们保证每项治疗分配至少4个科目,3个科目分配给该组中的5个科目。我们希望为实验中的所有组和两种治疗方法做到这一点。结果输出看起来像这样......

         group   experiment_1   experiment_2
    [1,]     1           5             3
    [2,]     1           3             2
    [3,]     1           4             4
    [4,]     1           1             5
    [5,]     1           2             1
    [6,]     1           2             3
    [7,]     1           4             1
    [8,]     1           3             2
    [9,]     2           5             5
   [10,]     2           1             4
   [11,]     2           3             4
   [12,]     2           1             5
   [13,]     2           2             1
      .      .           .             .
      .      .           .             .
      .      .           .             .

我知道如何使用sample函数,但不确定如何在每个组中进行无替换的采样,以便我们的输出对应于上述过程。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:1)

我认为我们只需要对样本ID进行随机播放,请参阅此示例:

set.seed(124)
#prepare groups and samples(shuffled)
df <- data.frame(group=sort(rep(1:3,9)),
                  sampleID=sample(1:27,27))

#treatments repeated nrow of df
df$ex1 <- rep(c(1,2,3,4,5),ceiling(nrow(df)/5))[1:nrow(df)]
df$ex2 <- rep(c(2,3,4,5,1),ceiling(nrow(df)/5))[1:nrow(df)]

df <- df[ order(df$group,df$sampleID),]

#check treatment distribution
with(df,table(group,ex1))
#       ex1
# group 1 2 3 4 5
#     1 2 2 2 2 1
#     2 2 2 2 1 2
#     3 2 2 1 2 2
with(df,table(group,ex2))
#       ex2
# group 1 2 3 4 5
#     1 1 2 2 2 2
#     2 2 2 2 2 1
#     3 2 2 2 1 2

答案 1 :(得分:1)

这个功能怎么样:

f <- function(n,m) {sample( c( rep(1:m,n%/%m), sample(1:m,n%%m) ), n )}

“n”是组大小,“m”是治疗次数。 每组治疗必须至少含有“n%/%m”次。 剩余的“n %% m”组成员的治疗数量是 任意分配而不重复。 载体“c(rep(1:m,n%/%m),样品(1:m,n %% m))”包含这些处理编号。最后是“样本”功能 扰乱这些数字。

> f(8,5)
[1] 5 3 1 5 4 2 2 1
> f(8,5)
[1] 4 5 3 4 2 2 1 1
> f(8,5)
[1] 4 2 1 5 3 5 2 3

这是一个使用上述函数创建数据帧的函数:

Plan <- function( groupSizes, numExp=2, numTreatment=5 )
{
  numGroups <- length(groupSizes)
  df <- data.frame( group = rep(1:numGroups,groupSizes) )

  for ( e in 1:numExp )
  {
    df <- cbind(df,unlist(lapply(groupSizes,function(n){f(n,numTreatment)})))
    colnames(df)[e+1] <- sprintf("Exp_%i", e)
  }
  return(df)
}

示例:

> P <- Plan(c(8,23,13,19))
> P
   group Exp_1 Exp_2
1      1     4     1
2      1     1     4
3      1     2     2
4      1     2     1
5      1     3     5
6      1     5     5
7      1     1     2
8      1     3     3
9      2     5     1
10     2     2     1
11     2     5     2
12     2     1     2
13     2     2     1
14     2     1     4
15     2     3     5
16     2     5     3
17     2     2     4
18     2     5     4
19     2     2     5
20     2     1     1
21     2     4     2
22     2     3     3
23     2     4     3
24     2     2     5
25     2     3     3
26     2     5     2
27     2     1     5
28     2     3     4
29     2     4     4
30     2     4     2
31     2     4     3
32     3     2     5
33     3     5     3
34     3     5     1
35     3     5     1
36     3     2     5
37     3     4     4
38     3     1     4
39     3     3     2
40     3     3     2
41     3     3     3
42     3     1     1
43     3     4     2
44     3     4     4
45     4     5     1
46     4     3     1
47     4     1     2
48     4     1     5
49     4     3     3
50     4     3     1
51     4     4     5
52     4     2     4
53     4     5     3
54     4     2     1
55     4     4     2
56     4     2     5
57     4     4     4
58     4     5     3
59     4     5     4
60     4     1     2
61     4     2     5
62     4     3     2
63     4     4     4

检查分发:

> with(P,table(group,Exp_1))
     Exp_1
group 1 2 3 4 5
    1 2 2 2 1 1
    2 4 5 4 5 5
    3 2 2 3 3 3
    4 3 4 4 4 4
> with(P,table(group,Exp_2))
     Exp_2
group 1 2 3 4 5
    1 2 2 1 1 2
    2 4 5 5 5 4
    3 3 3 2 3 2
    4 4 4 3 4 4
> 

答案 2 :(得分:0)

高效实验的设计本身就是一门科学,有一些R-package处理这个问题:

https://cran.r-project.org/web/views/ExperimentalDesign.html

我担心无论您如何创建样本,您的方法都不是最佳的资源......

然而,这可能有所帮助:

n <- 23
group <- sort(rep(1:5, ceiling(n/5)))[1:n]  
exp1 <- rep(NA, length(group))
for(i in 1:max(group)) {
    exp1[which(group == i)] <- sample(1:5)[1:sum(group == i)]
}

答案 3 :(得分:0)

不完全确定这是否符合您的所有限制,但您可以使用randomizr包:

library(randomizr)
experiment_1 <- complete_ra(N = 23, num_arms = 5)
experiment_2 <- block_ra(experiment_1, num_arms = 5)
table(experiment_1)
table(experiment_2)
table(experiment_1, experiment_2)

生成如下输出:

> table(experiment_1)
experiment_1
T1 T2 T3 T4 T5 
 4  5  5  4  5 
> table(experiment_2)
experiment_2
T1 T2 T3 T4 T5 
 6  3  6  4  4 
> table(experiment_1, experiment_2)
            experiment_2
experiment_1 T1 T2 T3 T4 T5
          T1  2  0  1  1  0
          T2  1  1  1  1  1
          T3  1  1  1  1  1
          T4  1  0  2  0  1
          T5  1  1  1  1  1