Перестановка списка с ограничением - PullRequest
5 голосов
/ 19 ноября 2011

Готовя новый психофизический эксперимент, у меня 48 оригинальных стимулов, отображаемых 4 раза (4 состояния), в результате чего получено 192 испытания.Пытаясь рандомизировать порядок представления во время эксперимента, мне нужно максимизировать расстояние между 4 отображениями одного и того же исходного стимула.

Пожалуйста, примите во внимание:

Table[{j, i}, {j, Range[48]}, {i, Range[4]}]

Где j - оригиналчисло стимулов и условие i

Образец вывода:

 {{1, 1}, {1, 2}, {1, 3}, {1, 4}, 
  {2, 1}, {2, 2}, {2, 3}, {2, 4},   
  ...
  {47, 1}, {47, 2}, {47, 3},{47, 4}, 
  {48, 1}, {48, 2}, {48, 3}, {48, 4}}

Как я могу перетасовать порядок представления этих 192 предметов, максимально увеличив расстояние между идентичными предметами относительно j, оригиналачисло стимулов?

Ответы [ 4 ]

9 голосов
/ 20 ноября 2011

Вы должны иметь компромисс между случайностью и ограничением максимального расстояния между исходными стимулами.Максимальное расстояние получается, когда вы размещаете стимулы в 4 идентичных рядах из 48 стимулов (неслучайное представление).Расстояние фиксировано на 48 для каждого исходного стимула в этом случае.

Если вы распределяете 192 пары полностью случайным образом, среднее расстояние между исходными стимулами в среднем составляет 38,6, с минимальным и максимально возможным расстояниями 1 и 144 соответственно:

t = Flatten[Table[i, {4}, {i, 48}]]; 

{Mean[#], StandardDeviation[#]} &@  
Table[
  rs = RandomSample[t, 192];
    Mean[Mean[Differences[Flatten[Position[rs, #]]]] & /@ Range[48]] // 
   N, {10000}
]

(* ==> {38.60370417, 1.397151004} *)

Вы можете сделатьэто по-другому.Сначала разделите 48 стимулов на 2 блока по 24 (1-24 [блок I] и 25-48 [блок II]).Затем генерируют случайные перестановки (p) I и II: p (I) p (II) p (I) p (II) p (I) p (II) p (I) p (II).

Среднее расстояние теперь становится:

{Mean[#], StandardDeviation[#]} &@  
Table[
  rs = 
    Join[RandomSample[Range[24]], RandomSample[Range[25, 48]], 
         RandomSample[Range[24]], RandomSample[Range[25, 48]],
         RandomSample[Range[24]], RandomSample[Range[25, 48]], 
         RandomSample[Range[24]], RandomSample[Range[25, 48]]
    ];
  Mean[Mean[Differences[Flatten[Position[rs, #]]]] & /@ Range[48]] //N, {10000}]

(* ==> {48., 0.} *)

Таким образом, у нас теперь гораздо более случайное представление, в то время как среднее расстояние все еще равно 48 (минимальное расстояние теперь равно 24, а максимальное расстояние равно 47).Обратите внимание на стандартное отклонение 0. В качестве упражнения я оставлю доказательство того, почему это должно быть так для вас.


Обновление 1
Здесь я разбил стимулы на две группы: 1-24 и 25-48.Я предлагаю вам использовать новое случайное начальное расположение для каждого предмета, прежде чем вы начнете разбиваться на две группы.Это добавит немного дополнительной балансировки по предметам.


Обновление 2
А теперь, код для генерации комбинации со стимулом-условием:

Во-первых, рандомизируйте условие по всем стимулам:

m = MapThread[
       List, 
       {
         Table[Range[48], {4}], 
         Table[RandomSample[{1, 2, 3, 4}], {48}]\[Transpose]
       }, 2
    ]

Затем разбейте их на группы по 24, перемешайте их и сгруппируйте в один список:

Flatten[RandomSample /@ Partition[Flatten[m, 1], 24], 1]

Чтобы рандомизировать порядок для каждогопредмет (как я предложил выше в обновлении 1) необходимо внести небольшие изменения в первую часть:

initialArrangement = RandomSample[Range[48]]; 
m = 
 MapThread[
    List, 
    {
       Table[initialArrangement, {4}], 
       Table[RandomSample[{1, 2, 3, 4}], {48}]\[Transpose]
    }, 2
 ]

Обратите внимание, что было бы неправильно вставлять первую строку (RandomSample[Range[48]]) внутри Table!


Для Mr.Wizard здесь версия нотации инфикса, показывающая, что я действительно пытаюсь; -)

m~Set~MapThread[List, (Range[48]~Table~{4}~
    List~((RandomSample[{1, 2, 3, 4}]~Table~ {48})\[Transpose])), 2]

и вторая часть:

(RandomSample /@ m~Flatten~1~Partition~24)~Flatten~1

Вариант первой части, как указано выше:

initialArrangement~Set~RandomSample[Range[48]]; 
m~Set~MapThread[List, (initialArrangement~Table~{4}~
    List~((RandomSample[{1, 2, 3, 4}]~Table~ {48})\[Transpose])), 2]

Кстати, забудьте о скобках во второй части, и результат, хотя и выглядит похожим, будет совершенно неверным.

3 голосов
/ 19 ноября 2011

Возможно:

a = RandomSample@Range@48;
Flatten[Array[Partition[Riffle[a, #1], 2] &, 4], 1]
2 голосов
/ 20 ноября 2011

Это боковая панель при создании исходного массива.

Эта форма излишне длинна: ​​

Table[{j, i}, {j, Range[48]}, {i, Range[4]}]

Вы можете написать просто:

Table[{j, i}, {j, 48}, {i, 4}]

Вы также можете использовать Array:

List ~Array~ {48, 4}

Или, если вы хотите, чтобы подсписки присоединились:

Tuples@Range@{48, 4}
2 голосов
/ 19 ноября 2011

Следуя пути Велизария, я бы лучше написал так:

RandomSample[Flatten[Table[{j, i}, {j, Range[48]}, {i, Range[4]}], 1]]
...