5

准备一个新的心理物理实验,我有 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

4 回答 4

9

您必须在随机性和原始刺激之间的最大距离限制之间做出妥协。当您将刺激安排在 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 个刺激分为 24 个块(1-24 [块 I] 和 25-48 [块 II])。然后生成 I 和 II 的随机排列 (p):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]

顺便说一句,忘记第二部分中的括号,输出虽然看起来相似,但将是完全错误的。

于 2011-11-19T23:26:16.370 回答
3

也许:

a = RandomSample@Range@48;
Flatten[Array[Partition[Riffle[a, #1], 2] &, 4], 1]
于 2011-11-19T18:57:49.493 回答
2

按照贝利撒留的方式,我宁愿这样写:

RandomSample[Flatten[Table[{j, i}, {j, Range[48]}, {i, Range[4]}], 1]]
于 2011-11-19T19:07:30.350 回答
2

这是生成原始数组的侧边栏。

这种形式是不必要的长:

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

你可以简单地写:

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

你也可以使用数组:

List ~Array~ {48, 4}

或者,如果您希望加入子列表:

Tuples@Range@{48, 4}
于 2011-11-20T00:51:55.053 回答