【问题标题】:Randomly Assign Integers in R within groups without replacement在组内随机分配 R 中的整数而不进行替换
【发布时间】:2015-10-21 11:41:22
【问题描述】:

我正在运行一个包含两个实验的实验: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 函数,但不确定如何在每个组内进行无替换采样,以便我们的输出对应于上述过程。任何帮助将不胜感激。

【问题讨论】:

  • 实验次数和组数是否相关,或者如果组1和实验1有解决方案,问题是否解决?
  • 感谢您的回复。实验的数量无关紧要——我们可以只使用第一个实验的解决方案,第二个实验和cbind。如果有第 1 组的解决方案,它应该可以简单地使用append 或 for 循环应用于所有后续组,对吗?棘手的部分是在组内生成处理序列(整数),因为并非所有组都是 5 的倍数。

标签: r integer sampling experimental-design


【解决方案1】:

不确定这是否满足您的所有限制,但您可以使用 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

【讨论】:

    【解决方案2】:

    这个功能怎么样:

    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), sample(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
    > 
    

    【讨论】:

      【解决方案3】:

      高效实验的设计本身就是一门科学,有一些 R-packages 可以解决这个问题:

      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)]
      }
      

      【讨论】:

      • 欣赏功能。我熟悉阻塞和其他随机化/实验设计工具以提高效率。但是,我不确定您的评论“关于资源不是最佳的”是什么意思。我们没有事前(调查的一部分)我们的主题的信息,这是一个试点实验。所以我们要做的就是随机分配组/集群内的治疗,并确保集群内的治疗分布尽可能均匀。
      【解决方案4】:

      我认为我们只需要洗牌样本 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-07
        • 2021-12-08
        • 1970-01-01
        相关资源
        最近更新 更多