问题:

我试图使用R生成随机研究设计,其中一半的参与者被随机分配给“治疗1”,另一半的参与者被分配给“治疗2”。但是,由于一半的受试者是男性,一半的受试者是女性,我也想确保每次治疗都接受相同数量的男性和女性,因此应将一半的男性和女性分配给“治疗1”,其余的一半应分配给“处理2”。

此设计有两个并发症:(1)这项研究为期一年,必须每天对参与者进行治疗。 (2)每位参与者必须在28天内至少接触10次“治疗1”。

甚至有可能在R接口(interface)中自动执行此操作?我以为是这样,但是我认为我作为R程序员的初学者身份使我无法自己寻找解决方案。我已经花了几天的时间来弄清楚如何实现这一点,并且浏览了该站点上许多听起来相像的帖子,但这些帖子在这里未能成功应用。我希望外面有人知道一些技巧,可以帮助我解决这个问题,任何建议将不胜感激!

我尝试过的内容:

具体信息

# There are 16 participants
p <- c("P01", "P02", "P03", "P04", "P05", "P06", "P07", "P08", "P09", "P10", "P11", "P12", "P13", "P14", "P15", "P16")

# Half are male and half are female
g <- c(rep("M", 8), rep("F", 8))

# I make a dataframe but this may not be necessary
df <- cbind.data.frame(p,g)

# There are 365 days in one year
d <- seq(1,365,1)

...不幸的是,我不确定如何从这里开始。

理想结果:

我预想的结果类似于该表:

基本上,每个参与者都有一列,每天都有一行。与每天相关联的是治疗1(T1)或治疗2(T2)的分配,其中8位男性中的4位和8位女性中的4位被分配给T1,其余部分分配给T2。每天将这些治疗重新分配1年。此图表中未描绘每个参与者在28天的时间内至少要暴露于T1的10次。如果还有其他意义,该表不必看起来像这样!

最佳答案

考虑使用by按天和性别划分数据帧,然后使用replicate运行100次足够的样本,以选择处理均衡的几种方法之一:

数据

df <- merge(data.frame(participant = p, gender = g),
            data.frame(days = seq(1,365)),
            by=NULL)

解决方案
df_list <- by(df, list(df$gender, df$days), function(sub){
  t <- replicate(100, {                                        # RUN 100 REPETITIONS OF EXPRESSION
    s <- sample(c("T1", "T2"), size=nrow(sub), replace=TRUE)   # SAMPLE "T1" AND "T2" BY SIZE OF SUBSET
    s[ sum(s == "T1") == sum(s == "T2") ]                      # FILTER TO EQUAL TREATMENTS
  })

  t <- Filter(length, t)[[1]]             # SELECT FIRST OF SEVERAL NON-EMPTY RETURNS
  transform(sub, treatment = t)           # ASSIGN RESULT TO NEW COLUMN
})

# BIND DATA FRAMES AND RESET ROW.NAMES
final_df <- data.frame(do.call(rbind.data.frame, df_list), row.names=NULL)

输出

第一天
head(final_df, 16)

#    participant gender days treatment
# 1          P09      F    1        T1
# 2          P10      F    1        T2
# 3          P11      F    1        T2
# 4          P12      F    1        T1
# 5          P13      F    1        T2
# 6          P14      F    1        T2
# 7          P15      F    1        T1
# 8          P16      F    1        T1
# 9          P01      M    1        T1
# 10         P02      M    1        T1
# 11         P03      M    1        T2
# 12         P04      M    1        T2
# 13         P05      M    1        T2
# 14         P06      M    1        T1
# 15         P07      M    1        T1
# 16         P08      M    1        T2

第365天
tail(final_df, 16)

#      participant gender days treatment
# 5825         P09      F  365        T2
# 5826         P10      F  365        T2
# 5827         P11      F  365        T1
# 5828         P12      F  365        T2
# 5829         P13      F  365        T1
# 5830         P14      F  365        T2
# 5831         P15      F  365        T1
# 5832         P16      F  365        T1
# 5833         P01      M  365        T1
# 5834         P02      M  365        T2
# 5835         P03      M  365        T1
# 5836         P04      M  365        T2
# 5837         P05      M  365        T2
# 5838         P06      M  365        T2
# 5839         P07      M  365        T1
# 5840         P08      M  365        T1

理想情况下,出于分析目的,您应将数据保留为长格式(即tidy data)。但是,如果需要宽格式,请考虑使用带有帮助程序和清理处理的reshape:
# HELPER OBJECTS
final_df$participant_gender <- with(final_df, paste0(participant, gender))
new_names <- paste0(p, g)

# RESHAPE WIDE
wide_df <- reshape(final_df, v.names = "treatment", timevar = "participant_gender",
                   idvar="days", drop = c("gender", "participant"),
                   new.row.names = 1:365, direction = "wide")

# RENAME AND RE-ORDER COLUMNS
names(wide_df) <- gsub("treatment.", "", names(wide_df))
wide_df <- wide_df[c("days", new_names)]

head(wide_df)
#   days P01M P02M P03M P04M P05M P06M P07M P08M P09F P10F P11F P12F P13F P14F P15F P16F
# 1    1   T1   T1   T2   T2   T2   T1   T1   T2   T1   T2   T2   T1   T2   T2   T1   T1
# 2    2   T1   T1   T2   T1   T2   T1   T2   T2   T1   T2   T2   T1   T2   T2   T1   T1
# 3    3   T1   T1   T2   T1   T1   T2   T2   T2   T1   T2   T2   T2   T1   T2   T1   T1
# 4    4   T1   T1   T1   T2   T2   T2   T1   T2   T2   T1   T1   T2   T2   T1   T1   T2
# 5    5   T1   T1   T2   T1   T2   T2   T1   T2   T1   T1   T2   T1   T2   T2   T1   T2
# 6    6   T2   T1   T1   T1   T2   T2   T1   T2   T2   T2   T2   T1   T2   T1   T1   T1

关于r - 使用R每天随机分配参与者参加治疗,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62109443/

10-09 12:52