gpt4 book ai didi

r - 每天使用 R 随机分配参与者进行治疗

转载 作者:行者123 更新时间:2023-12-03 07:36:00 26 4
gpt4 key购买 nike

问题:

我正在尝试使用 R 生成随机研究设计,其中一半的参与者被随机分配到“治疗 1”,另一半被分配到“治疗 2”。但是,因为一半的受试者是男性,一半是女性,并且我还想确保相同数量的男性和女性接受每种治疗,所以应该将男性和女性的一半分配给“治疗 1”,剩下的一半应分配给“治疗 2”。

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

这甚至可以在 R 界面中实现自动化吗?我认为是这样,但我认为我作为 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)

...不幸的是,我不知道如何从这里开始。

理想结果:

我正在设想一些近似于这张表的结果:
I do not have enough reputation points to embed images yet so here is the link, sorry!

基本上每个参与者有一列,每一天都有一行。与每一天相关的是分配到治疗 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)

输出

第 1 天
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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com