准备一个新的心理物理实验,我有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的距离,即原始刺激数量?
发布于 2011-11-20 07:26:16
你必须在随机性和原始刺激之间的最大距离约束之间做出折衷。当您将刺激排列在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)。然后生成I和II的随机排列(p):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-20 02:57:49
也许:
a = RandomSample@Range@48;
Flatten[Array[Partition[Riffle[a, #1], 2] &, 4], 1]发布于 2011-11-20 03:07:30
按照Belisarius的方式,我更愿意这样写:
RandomSample[Flatten[Table[{j, i}, {j, Range[48]}, {i, Range[4]}], 1]]https://stackoverflow.com/questions/8195969
复制相似问题