Используйте sample () с условиями в R - PullRequest
2 голосов
/ 05 мая 2020

У меня есть набор данных, который я создал для случайного назначения лечения экспериментальным объектам. Лица будут подвергнуты лечению трижды. Есть 7 процедур, и мне нужно убедиться, что один и тот же человек не получит одно и то же лечение более одного раза, при этом все еще назначен случайным образом. Всего 35 человек и 7 процедур, поэтому для каждой процедуры есть 5 повторов.

данные:

set.seed(566)
treatments<-rep(c(2,4,8,16,32,64,100), each=5)
random_design<-data.frame(individual=c(1:35), trial1=sample(treatments), trial2=sample(treatments), trial3=sample(treatments))

Как видите, некоторые люди подвергаются одинаковому лечению в разных испытаниях. Есть ли способ наложить условие на sample (), чтобы индивидуум x не мог лечиться так же, как в предыдущем испытании?

1 Ответ

1 голос
/ 05 мая 2020

Кажется, вы хотите сначала случайным образом назначить пациентам три лечения, поэтому, если есть K процедур, и вы хотите случайным образом выбрать 3 без замены, сделайте это для каждого человека, а затем объедините эффекты лечения. Например, используя ваши числа и data.table, вот решение:

set.seed(566)
library(data.table)

exp_num = 7
#set up a data.table to hold treatment effects
treat_dt = data.table("experiment_num" = 1:exp_num, "treatment_effect" = c(2,4,8,16,32,64,100))

#now create a datatable of subjectsXtrials
subj_dt = data.table(expand.grid("id" = 1:35, "trial" = paste0("trial",1:3)))

#now randomly assign three experiments without replacement by id
subj_dt[, exp_assigned := sample(1:exp_num,3, replace = F), by = id]

#now merge in effects with treat_dt by experiment...
subj_dt = merge(subj_dt,treat_dt, by.x = "exp_assigned",by.y = "experiment_num", all.x = T, all.y = F)

#and youre done! option to get back a dataset where each id is a single row
alt_dt = dcast(subj_dt[,.(id,trial,treatment_effect)], id ~ trial, value.var = "treatment_effect")

Тогда результат будет выглядеть следующим образом для alt_dt

> head(alt_dt)
   id trial1 trial2 trial3
1:  1    100     32      8
2:  2    100     64     32
3:  3      4     16      2
4:  4    100     64      8
5:  5      8     16      4
6:  6     64    100      8
...