2015-07-30 4 views
0

Я запускаю эксперимент с двумя экспериментами: experiment_1 и experiment_2. Каждый эксперимент имеет 5 различных обработок (то есть 1, 2, 3, 4, 5). Мы пытаемся случайным образом назначать лечение внутри групп.Случайное назначение целых чисел в R внутри групп без замены

Мы хотели бы сделать это с помощью выборки без замены итеративно внутри каждой группы. Мы хотим сделать это, чтобы гарантировать, что мы получим в качестве сбалансированного образца, насколько это возможно, в лечении (например, мы не хотим, чтобы в группу 1 попадали 4 человека, получавших лечение 2, и никто не получал лечение 1). Поэтому, если у группы есть 23 предмета, мы хотим разбить респондент на 4 подгруппы из 5 и 1 подгруппу из 3. Затем мы хотим случайным образом опробовать без замены в первой подгруппе по 5, поэтому каждому присваивается 1 из обработок, делать то же самое для второй, третьей и четвертой подгруппы по 5, а для конечной подгруппы из 3 случайных выборок без замены. Таким образом, мы гарантируем, что каждое лечение назначается по меньшей мере 4 предметам, а 3 - 5 субъектам данной группы. Мы хотели бы сделать это для всех групп в эксперименте и для обоих видов лечения. Полученный результат будет выглядеть примерно так ...

  group experiment_1 experiment_2 
    [1,]  1   5    3 
    [2,]  1   3    2 
    [3,]  1   4    4 
    [4,]  1   1    5 
    [5,]  1   2    1 
    [6,]  1   2    3 
    [7,]  1   4    1 
    [8,]  1   3    2 
    [9,]  2   5    5 
    [10,]  2   1    4 
    [11,]  2   3    4 
    [12,]  2   1    5 
    [13,]  2   2    1 
     .  .   .    . 
     .  .   .    . 
     .  .   .    . 

Я знаю, как использовать функцию sample, но я не уверен, как образец без замены внутри каждой группы, так что наш выход соответствует описанной выше процедуре. Любая помощь будет оценена по достоинству.

+0

Является ли количество экспериментов и количество групп релевантными, или проблема решена, если есть решение для группы 1 и эксперимента 1? – mra68

+0

Спасибо за ответ. Число экспериментов не имеет значения - мы можем просто использовать решение из первого эксперимента, для второго эксперимента и 'cbind'. Если есть решение для группы 1, оно должно быть просто применимо для всех последующих групп, используя 'append' или цикл for, правильно? Сложная часть генерирует последовательность обработок (целые числа) внутри группы, так как не все группы имеют кратность 5. – Thomas

ответ

1

Я думаю, что нам просто нужно перетасовать идентификаторы образцов, см следующий пример:

set.seed(124) 
#prepare groups and samples(shuffled) 
df <- data.frame(group=sort(rep(1:3,9)), 
        sampleID=sample(1:27,27)) 

#treatments repeated nrow of df 
df$ex1 <- rep(c(1,2,3,4,5),ceiling(nrow(df)/5))[1:nrow(df)] 
df$ex2 <- rep(c(2,3,4,5,1),ceiling(nrow(df)/5))[1:nrow(df)] 

df <- df[ order(df$group,df$sampleID),] 

#check treatment distribution 
with(df,table(group,ex1)) 
#  ex1 
# group 1 2 3 4 5 
#  1 2 2 2 2 1 
#  2 2 2 2 1 2 
#  3 2 2 1 2 2 
with(df,table(group,ex2)) 
#  ex2 
# group 1 2 3 4 5 
#  1 1 2 2 2 2 
#  2 2 2 2 2 1 
#  3 2 2 2 1 2 
1

Как насчет этой функции:

f <- function(n,m) {sample(c(rep(1:m,n%/%m), sample(1:m,n%%m)), n)} 

«п» является размер группы, «м» число лечения. Каждое лечение должно содержать по крайней мере «n% /% m» раз в группе. Числа обработки оставшихся членов группы «n %% m» равны , которые назначаются произвольно без повторения. Вектор «c (rep (1: m, n% /% m), образец (1: m, n %% m))» содержит эти номера обработки. Наконец, функция «выборка» пертурмирует эти числа.

> f(8,5) 
[1] 5 3 1 5 4 2 2 1 
> f(8,5) 
[1] 4 5 3 4 2 2 1 1 
> f(8,5) 
[1] 4 2 1 5 3 5 2 3 

Вот это функция, которая создает dataframe, используя описанную выше функцию:

Plan <- function(groupSizes, numExp=2, numTreatment=5) 
{ 
    numGroups <- length(groupSizes) 
    df <- data.frame(group = rep(1:numGroups,groupSizes)) 

    for (e in 1:numExp) 
    { 
    df <- cbind(df,unlist(lapply(groupSizes,function(n){f(n,numTreatment)}))) 
    colnames(df)[e+1] <- sprintf("Exp_%i", e) 
    } 
    return(df) 
} 

Пример:

> P <- Plan(c(8,23,13,19)) 
> P 
    group Exp_1 Exp_2 
1  1  4  1 
2  1  1  4 
3  1  2  2 
4  1  2  1 
5  1  3  5 
6  1  5  5 
7  1  1  2 
8  1  3  3 
9  2  5  1 
10  2  2  1 
11  2  5  2 
12  2  1  2 
13  2  2  1 
14  2  1  4 
15  2  3  5 
16  2  5  3 
17  2  2  4 
18  2  5  4 
19  2  2  5 
20  2  1  1 
21  2  4  2 
22  2  3  3 
23  2  4  3 
24  2  2  5 
25  2  3  3 
26  2  5  2 
27  2  1  5 
28  2  3  4 
29  2  4  4 
30  2  4  2 
31  2  4  3 
32  3  2  5 
33  3  5  3 
34  3  5  1 
35  3  5  1 
36  3  2  5 
37  3  4  4 
38  3  1  4 
39  3  3  2 
40  3  3  2 
41  3  3  3 
42  3  1  1 
43  3  4  2 
44  3  4  4 
45  4  5  1 
46  4  3  1 
47  4  1  2 
48  4  1  5 
49  4  3  3 
50  4  3  1 
51  4  4  5 
52  4  2  4 
53  4  5  3 
54  4  2  1 
55  4  4  2 
56  4  2  5 
57  4  4  4 
58  4  5  3 
59  4  5  4 
60  4  1  2 
61  4  2  5 
62  4  3  2 
63  4  4  4 

Проверить распределение:

> with(P,table(group,Exp_1)) 
    Exp_1 
group 1 2 3 4 5 
    1 2 2 2 1 1 
    2 4 5 4 5 5 
    3 2 2 3 3 3 
    4 3 4 4 4 4 
> with(P,table(group,Exp_2)) 
    Exp_2 
group 1 2 3 4 5 
    1 2 2 1 1 2 
    2 4 5 5 5 4 
    3 3 3 2 3 2 
    4 4 4 3 4 4 
> 
0

Конструкция эффективных экспериментов - наука o п собственных и есть несколько R-пакетов, занимающихся этим вопросом:

https://cran.r-project.org/web/views/ExperimentalDesign.html

Я боюсь, ваш подход не является оптимальным не в отношении ресурсов, независимо от того, как вы создаете образцы ...

Однако это может помочь:

n <- 23 
group <- sort(rep(1:5, ceiling(n/5)))[1:n] 
exp1 <- rep(NA, length(group)) 
for(i in 1:max(group)) { 
    exp1[which(group == i)] <- sample(1:5)[1:sum(group == i)] 
} 
+0

Оцените функцию. Я знаком с блокированием и другими инструментами рандомизации/проектирования экспериментов для повышения эффективности. Однако я не уверен, что вы подразумеваете под своим комментарием «не оптимальным в отношении ресурсов». У нас нет информации о наших субъектах ex ante (часть опроса), и это экспериментальный эксперимент. Таким образом, все, что мы пытаемся сделать, это случайным образом назначать процедуры внутри групп/кластеров и следить за тем, чтобы по возможности было равномерное распределение лечения внутри кластера. – Thomas

0

Не совсем уверен, если это отвечает на все ваши ограничения, но вы можете использовать randomizr пакет:

library(randomizr) 
experiment_1 <- complete_ra(N = 23, num_arms = 5) 
experiment_2 <- block_ra(experiment_1, num_arms = 5) 
table(experiment_1) 
table(experiment_2) 
table(experiment_1, experiment_2) 

производит вывод так:

> table(experiment_1) 
experiment_1 
T1 T2 T3 T4 T5 
4 5 5 4 5 
> table(experiment_2) 
experiment_2 
T1 T2 T3 T4 T5 
6 3 6 4 4 
> table(experiment_1, experiment_2) 
      experiment_2 
experiment_1 T1 T2 T3 T4 T5 
      T1 2 0 1 1 0 
      T2 1 1 1 1 1 
      T3 1 1 1 1 1 
      T4 1 0 2 0 1 
      T5 1 1 1 1 1