以伪随机方式在可能巨大的条件文件中仅选择少量试验
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" 才能实际显示文本。
我正在使用 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" 才能实际显示文本。