我有 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 新手,感谢任何帮助!
rlatin()
包中的
magic
功能非常适合您的需求。由于您已经将受试者随机分为 4 组,我们将使用该列作为基础来加入每个受试者的剩余治疗值。在下面的示例中,“treatment1”是包含已随机化组值的列。
工作流程如下:
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