Psychopy中反应时任务的实验区块无法随机化问题求助
针对PsychoPy区块随机化与SOA整合问题的解决方案
问题背景
我目前正在开展一项反应时与准确率任务,核心是对比视觉呈现与听觉呈现的数字信息:
- 视觉数字信息分为三种形式:阿拉伯数字(如
5)、数字单词(如five)、非符号量级(如5个点的图片) - 视觉与听觉刺激依次呈现,第二个刺激呈现后,被试需判断两者数字信息是否一致:按
a表示一致,按l表示不一致 - 额外变量:刺激呈现异步性(SOA/刺激间时间间隔),设置7个水平:
±750ms、±250ms、±500ms及0ms - 实验结构:每组
fixation_cross与对应SOA的任务(如VA_750ms)构成一个区块,共7个区块;已完成区块内试次随机化,需实现区块间随机化
遇到的核心问题
- 尝试在外层添加名为
blocknames的循环,但实验正常运行却未实现区块随机化 - 创建了对应各条件的Excel文件(如
AV500ms.xlsx、VA750ms.xlsx,内容一致仅命名不同),仍未解决随机化问题 - 尝试用
$condsFile替代文件路径也未成功 - 不清楚如何在Builder中将SOA水平整合到Excel中
一、实现区块随机化的正确步骤(针对PsychoPy 2020.1.3)
你之前的思路方向是对的,只是可能在循环设置的细节上没踩对,按以下步骤来就能搞定:
- 准备区块索引文件
- 新建一个Excel文件(比如命名为
block_order.xlsx),只需要一列,列名设为block_file,每行填入对应区块的Excel文件名(比如AV500ms.xlsx、VA750ms.xlsx,把7个SOA条件的文件名都列进去)
- 新建一个Excel文件(比如命名为
- 搭建外层随机循环
- 在Builder界面最外层添加一个
Loop组件,命名为block_loop - 关键设置:在
Loop Type里选择Random(这是你之前可能漏掉的核心选项) - 在
Conditions模块中选择你刚创建的block_order.xlsx
- 在Builder界面最外层添加一个
- 关联内层任务与外层变量
- 找到你已经做好试次随机化的内层
Loop组件 - 把它的
Conditions路径替换为变量引用:$block_file(确保Excel里的文件名和实际文件路径完全匹配,文件都放在实验文件夹根目录的话直接写文件名就行)
- 找到你已经做好试次随机化的内层
- 快速验证效果
- 点击工具栏
Run旁的小三角,选择Test Loop,就能看到外层循环是否会随机读取不同的区块文件
- 点击工具栏
二、将SOA水平整合到Excel的高效方法
没必要为每个SOA单独建Excel文件,一个主文件就能覆盖所有条件,操作更简洁:
- 改造主试次Excel文件
- 添加两列:
- 列名
SOA:每行填入对应的SOA数值(比如750、-750、0,不带ms后缀,后续用代码处理) - 列名
stim_order:区分刺激呈现顺序(比如VA代表视觉先听觉后,AV代表听觉先视觉后)
- 列名
- 把所有试次的视觉/听觉刺激信息都整合到这个文件里
- 添加两列:
- 在Builder中控制SOA间隔
- 在视觉和听觉刺激组件之间,添加一个
Code组件 - 在
Begin Routine标签页写入控制代码(以视觉先呈现为例):from psychopy import core # 根据SOA值控制刺激间隔 if SOA > 0: # 视觉先呈现,间隔SOA毫秒后播放听觉刺激 visual_stim.draw() win.flip() core.wait(SOA/1000) # 转换为秒单位 auditory_stim.play() elif SOA < 0: # 听觉先呈现,间隔绝对值毫秒后呈现视觉刺激 auditory_stim.play() core.wait(-SOA/1000) visual_stim.draw() win.flip() else: # SOA=0,同时呈现两种刺激 visual_stim.draw() auditory_stim.play() win.flip()
- 在视觉和听觉刺激组件之间,添加一个
- 简化循环设置
- 现在只需要一个外层循环读取这个主Excel文件,就能自动根据
SOA和stim_order控制刺激呈现,同时轻松实现试次和SOA条件的随机化
- 现在只需要一个外层循环读取这个主Excel文件,就能自动根据
额外注意事项(针对2020.1.3版本)
- 确保所有Excel文件和你的
.psyexp实验文件在同一个文件夹下,避免路径错误 - 用变量引用文件名时,要保证Excel里的文件名和实际文件名完全一致(包括大小写,Win10虽然不区分,但PsychoPy偶尔会敏感)
- 测试时可以先只放2-3个区块,快速验证随机化是否生效,再扩展到7个完整区块
内容的提问来源于stack exchange,提问作者OSH




