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

Selecting only a small amount of trials in a possibly huge condition file in a pseudo-randomized way

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

我用 3 价(负、中性、正)的图片进行了实验。 在图片的一个角落,额外的图片(字母和数字)可能会以随机延迟出现(随机出现在 4 个位置之一)。

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

有办法吗?

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

准备一个列表,在其中写入您想要的试验类型。如果需要,您可以手动输入。例如 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>

有一些程序化的方法可以构建具有正确重复次数的列表,但是对于您正在做的事情,使用手写列表可能会更容易,然后担心一旦可行就让它变得更漂亮.

在构建器中添加一个非常简单的代码组件即可完成此操作。我对这些条件有点困惑,但你可能会明白大概的意思。假设您在一个条件文件中有 72 个 "fixed" 个条件,一个循环包含针对每个条件运行的例程。

我假设您的刺激程序中有一个 TextStim。假设您将其命名为 'letternumber'。然后,一般策略是为 72 次试验中的每一次预先计算随机字符和位置列表,然后在我们进行实验时显示它们。为此,将代码组件添加到刺激例程的顶部并添加到 "begin experiment":

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]

然后在代码组件的 "begin routine" 下,设置 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])

您可能需要在 Builder 中为 lettersnumbers 组件勾选 "set every repeat" 才能实际显示文本。