已分配治疗的组中的平等分组随机化

问题描述 投票:0回答:1

我有 80 名受试者的名单,已随机分为 4 组 (1-4)。现在,我想引入交叉设计,这样每个科目最终都会分在所有 4 个组中。尝试使用样本函数执行此操作,但我需要对剩余 3 个随机组的每种可能性进行均等分布。

例如: 受试者 A 已被随机分配到第 1 组。现在我需要随机分配剩余 3 组(2、3、4) 有 6 个选项可随机分配剩余 3 个组: 234 243 第324章 第342章 第423章 第432章

因此,我需要确保最初分配到第 1 组(20 名受试者)的每个受试者都能均匀分布上述 6 种排列之一。对于最初分配到第 2、3 和 4 组的每个受试者都是相同的

我试过了

#for loop going through each row of the dataframe for(x in 1:nrow(crossover)) { #TRIAL 2 #randomly selects an integer between 1 and 4 y<- sample(1:4, 1, replace = TRUE) #if it equals Assigned.Arm.Index, then randomly select again while (y == crossover$Assigned.Arm.Index[x]){ y <- sample(1:4, 1, replace = FALSE) } #set New.Arm.Index column to y crossover$Trial_2[x] <- y
crossover 是我的数据框的名称,signed.arm.index 是预制的初始随机化。我为我要填充的剩余随机化创建了 3 个新列。

当我就所有受试者的平等随机化寻求帮助时,我被告知要使用代表函数,例如:

sample(rep(1:6, 4) , rep= FALSE)
但这对我来说并不完全有意义。我是 R 新手,感谢任何帮助!

r dataframe random sample
1个回答
0
投票
如果我正确解释你的问题,本质上你想要的是一系列随机的拉丁方,足以让每个受试者都有一排 4 种不同的治疗方法。

rlatin()

 包中的 
magic
 功能非常适合您的需求。

由于您已经将受试者随机分为 4 组,我们将使用该列作为基础来加入每个受试者的剩余治疗值。在下面的示例中,“treatment1”是包含已随机化组值的列。

工作流程如下:

    在 df 中创建一个“ranjoin”列,并根据“treatment1”组添加 1 到 20 之间的唯一随机值。换句话说,每组中的每个受试者都被分配一个随机值。 “ranjoin”将与“treatment1”一起使用以加入剩余的治疗组
  1. 创建随机 4 x 4 拉丁方的 80 x 4 数据框 (df1),第一列对应 df 中的“treatment1”
  2. 正如您对 df 所做的那样,为 df1“treatment1”组分配随机“ranjoin”值
  3. 使用 df 和 df1 中的“treatment1”和“ranjoin”列来完成每个受试者的抽样治疗组
以第1组为例。 df 中有 20 名受试者,其“treatment1”值为 1,随机唯一“ranjoin”值为 1:20。 df1 中还有 20 个“treatment1”值为 1,同样具有随机唯一“ranjoin”值 1:20。如果“受试者”1 的“treatment1”值为 1,“ranjoin”值为 7,则 df1 中的相应行将连接到受试者“1”的行。这种方法的关键是“ranjoin”列是独立随机的。为了可复制性,我在整个示例中保持

set.seed(1)

 相同。在下面的代码块中指示的位置插入不同的 
set.seed()
 值,以确保更加随机的结果。

library(magic) library(dplyr) library(tidyr) # Example of your existing df where "treatment1" contains your existing group sampling # and subvar columns are just 'dummy' subject data set.seed(1) df <- data.frame(subject = 1:80, treatment1 = rep(sample(1:4, 4, replace = FALSE), 20), subvar1 = round(rnorm(80, 0, 10), 2), subvar2 = round(rnorm(80, 0, 10), 2), subvar3 = round(rnorm(80, 0, 10), 2)) # Assign random value between 1:n() so each treatment group has a random 'rank' # set.seed(sample(1e+08:1e+09, 1)) # Use something like this before running df <- df %>% group_by(treatment1) %>% mutate(ranjoin = sample(1:n(), n(), replace = FALSE)) %>% ungroup() head(data.frame(df)) subject treatment1 subvar1 subvar2 subvar3 ranjoin 1 1 1 12.72 -2.20 16.80 20 2 2 3 4.15 -4.25 7.80 8 3 3 4 -15.40 -4.19 7.13 5 4 4 2 -9.29 9.97 -5.43 15 5 5 1 -2.95 -2.76 8.86 9 6 6 3 -0.06 12.56 -3.49 2 # Create 4 x 80 random treatments and join to df # set.seed(sample(1e+08:1e+09, 1)) # Use something like this again before running df1 <- data.frame(rlatin(20, 4)) %>% # Create dataframe of 20 random 4 x 4 Latin squares mutate(names = paste0("treatment", 1:4)) %>% pivot_longer(-names) %>% pivot_wider(names_from = names, values_from = value) %>% group_by(treatment1) %>% mutate(ranjoin = sample(1:n(), n(), replace = FALSE)) %>% # Same as for df ungroup() %>% left_join(df, by = c("treatment1", "ranjoin"), keep = FALSE) %>% select(-c(name, ranjoin)) %>% relocate(subject) %>% arrange(subject) head(data.frame(df1)) subject treatment1 treatment2 treatment3 treatment4 subvar1 subvar2 subvar3 1 1 1 4 2 3 12.72 -2.20 16.80 2 2 3 4 1 2 4.15 -4.25 7.80 3 3 4 1 2 3 -15.40 -4.19 7.13 4 4 2 3 4 1 -9.29 9.97 -5.43 5 5 1 3 4 2 -2.95 -2.76 8.86 6 6 3 4 1 2 -0.06 12.56 -3.49 # Check treatment group sizes are equal per "treatment" column table(stack(df1[,2:5])) ind values treatment1 treatment2 treatment3 treatment4 1 20 20 20 20 2 20 20 20 20 3 20 20 20 20 4 20 20 20 20 # Check each subject has been assigned 4 different treatment values, 0 == TRUE sum(apply(df1[,2:5], 1, function(x) length(unique(x))) < 4) 0
    
© www.soinside.com 2019 - 2024. All rights reserved.