以伪随机方式在可能很大的条件文件中仅选择少量试验

时间:2015-06-02 12:56:15

标签: random psychopy experimental-design

我使用的是PsychoPy Builder并且只使用了基本的代码。 现在我遇到了一个问题,我认为编码是不可避免的,但我不知道该怎么做,到目前为止,我没有在网上找到有用的答案。

我有一个3种化合物(阴性,中性,阳性)图片的实验。 在图片的一个角落中,可以随机延迟出现其他图片(字母和数字)(随机出现在4个位置中的一个位置)。

总而言之,考虑到所有组合(考虑到字母/数字的身份),我有超过2000种尝试的可能性。 但我只需要72次试验,条件是每种化合物出现24次(或者:36张图片中的每一次出现2次),每次出现36次。因此,价值和潜伏期应该是平衡的,但字母和数字的位置和身份可以是随机的。但是,按照特定的比率,(在25%的试验中)角落里没有字母/数字。

有办法吗?

2 个答案:

答案 0 :(得分:0)

这是您可以尝试的策略,但由于我不使用构建器,因此无法将其集成到该工作流程中。

准备一个列表,其中包含您在写入数字中所需的试验类型。如果需要,您可以手动输入。例如mytrials = ['a','a',...'d','d'],其中这些字母代表您想要的试用类型组合的一些标签。

然后打开控制台并置换该列表(即将其随机播放)。

import random
random.shuffle(mytrials)

这会改变我的心房。你可以通过打印来看到它。如果您对使用某种循环(例如

)的代码中的粘贴感到满意
t in mytrials:
   if t == 'a':
      <grab a picture of type 'a'>
   elseif t == 'b':
      <grab a picture of type 'b'>
   else:
      <grab a picture of type 'c'>
   <then show the picture you grabbed>

有一些编程方法可以使用正确数量的重复来构建列表,但是对于您正在进行的操作,可能更容易使用手写列表,然后担心一旦有效就让它变得更加漂亮。 / p>

答案 1 :(得分:0)

在构建器中添加一个非常简单的代码组件将为您完成此操作。我对条件有点困惑,但你可能会得到一般的想法。让我们假设你有72&#34;固定&#34;条件文件中的条件和带有针对每个条件运行的例程的循环。

我假设你的刺激程序中有一个TextStim。让我们说你叫它'letternumber&#39;。然后,一般策略是预先计算72个试验中每个试验的随机字符和位置列表,然后在我们进行实验时显示它们。要做到这一点,请在激励程序的顶部添加一个代码组件,然后添加&#34;开始实验&#34;:

import random  # we'll use this module to pick random elements from below
# Indicator sequence, specifying whether letter/number should be shown. False= do not show. True = do show.
show_letternumber = [False] * 18 + [True] * 54  # 18/72=25%, 54/72=75%.
random.shuffle(show_letternumber)

# Sets of letters and numbers to present
char_set = ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g']  # ... and so on.
char_trial = [random.choice(char_set) if show_char else '' for show_char in char_set]  # list with characters

# List of positions
pos_set = [(0.5, 0.5),(-0.5, 0.5),(-0.5,-0.5),(0.5, -0.5)]  # coordinates of your four corners
pos_trial = [random.choice(pos_set) for char in char_trial]

然后在&#34;开始常规&#34;在代码组件中,设置lettersnumbers以显示该试用版character_trial的值以及pos_trial中的位置。

letternumbers.pos = pos_trial[trials.thisN]  # set position. trials.thisN is the current trial number
letternumbers.text = char_trial[trials.thisN]  # set text

# Save to data/log
trials.addData('pos', pos_trial[trials.thisN])
trials.addData('char', char_trial[trials.thisN])

您可能需要勾选&#34;设置每个重复&#34;对于Builder中的lettersnumbers组件,实际显示文本。