我如何在R中执行受约束的随机化,以自定义数量的研究因素嵌套?

我如何在R中执行受约束的随机化,以自定义数量的研究因素嵌套?,r,random,R,Random,简而言之:我希望在给定任意数量的因子的情况下,以嵌套方式实现样本的随机化 背景 在几种类型的生化分析中,由于仪器漂移或样品降解等原因,反应存在系统偏差。因此需要将分析序列顺序随机化。然而,我们也希望将来自同一个人的样本保持在一起,例如,处理紧密,以尽量减少这些样本之间的漂移。因此,我们可以采用约束随机化: 我们首先在个体之间随机分组 对于每个个体,我们在治疗之间进行随机分组 对于每种治疗,我们将不同的时间点随机分组 三因素情况下的一些伪代码: constRandom <- function

简而言之:我希望在给定任意数量的因子的情况下,以嵌套方式实现样本的随机化

背景 在几种类型的生化分析中,由于仪器漂移或样品降解等原因,反应存在系统偏差。因此需要将分析序列顺序随机化。然而,我们也希望将来自同一个人的样本保持在一起,例如,处理紧密,以尽量减少这些样本之间的漂移。因此,我们可以采用约束随机化:

  • 我们首先在个体之间随机分组
  • 对于每个个体,我们在治疗之间进行随机分组
  • 对于每种治疗,我们将不同的时间点随机分组
  • 三因素情况下的一些伪代码:

    constRandom <- function(metadata, factors) {
     for (i in factors[1]) {
        sample(factors[j]) # random order of the 2nd factor within the 1st factor
        for (j in factors[2]) {
          sample(factor[3]) # random order of the 3rd factor within the 2nd factor
        }
     }
    }
    
    constRand3 <- function(metadata, factors) {
     newMeta <- metadata # set up df for constrained randomized data
     uniq1 <- unique(metadata[, factors[1]]) %>% sample() # extract random order of 1st factor
     n1 <- length(uniq1) # Number of levels in 1st factor
     nSamp <- 0 # Index of where in newMeta to put in random samples
     # Loop thru randomized levels of 1st factor
     for (i in 1: n1) {
        level1 <- uniq1[i]
        meta1 <- metadata[metadata[,factors[1]]==level1,] # extract samples at the ith level of factor 1
        uniq2 <- unique(meta1[,factors[2]]) %>% sample() # extract random order of 2nd factor within 1st factor
        n2 <- length(uniq2)
        # Loop thru randomized levels of 2nd factor
        for (j in 1:n2) {
          level2 <- uniq2[j]
          meta2 <- meta1[meta1[,factors[2]]==level2,] # extract samples at the jth level of factor 2
          uniq3 <- unique(meta2[,factors[3]]) %>% sample() # extract random order of 2nd factor within 1st factor
          newMeta[(nSamp+1):(nSamp+nrow(meta2)),] <- meta2[match(meta2[,factors[3]], uniq3) %>% order(),]
          nSamp <- nSamp+nrow(meta2)
        }
     }
     return(newMeta)
    }
    
    仅在样本水平上执行完全随机化。或:

    constRand(df, 2:3)
    
    在个体和治疗之间随机化,但保持时间点顺序不变。或:

    constRand(otherDF, c(4,2,5,7))
    
    按四个因素按特定顺序随机分组(我希望你能原谅最后一个不是可重复的例子)


    但我不知道如何构造递归循环或拆分以适应用户定义的大量因素。使用for-loop方法,我不知道如何嵌套动态数量的级别。也许是使用eval/do.call或tidyverse进行拆分?

    您的目标是将每个因素组合随机分配给一个个体吗?例如,在两个因素的情况下,第一个是个体,第二个是治疗,我想分别为每个个体随机分配治疗顺序,以避免因顺序而产生的偏差。
    constRand(df, 2:3)
    
    constRand(otherDF, c(4,2,5,7))