如何在PsychoPy Builder中实现带条件分支的实验?

3 投票
1 回答
1921 浏览
提问于 2025-04-18 05:03

在心理学和神经科学的很多行为实验设计中,需要根据条件来决定接下来的步骤(比如,只有在初始练习阶段达到一定表现水平后,才能进入测试阶段)。PsychoPy的Builder视图可以让人通过图形化的操作生成一个Python脚本来运行实验。但是,它似乎没有内置的支持来处理这种条件分支。

那么,在Builder中是否可以通过在代码组件中使用Python小段代码来跳过某个特定的流程?还是说必须转到完整的Python Coder环境中去?

1 个回答

3

PsychoPy中的Coder视图让你可以完全使用Python编程语言,这样你就能设计出非常复杂的实验。

而PsychoPy的图形化Builder视图则更注重易用性和简单性,而不是灵活性。它直接不支持条件分支,但可以通过一些技巧间接实现。

假设你有一个三阶段的实验:首先是一个练习环节,然后是两个可能的实验环节,ConditionA或ConditionB。在完成练习环节后,表现好的参与者会被分配到ConditionA,而表现不好的参与者则会被分配到ConditionB。

要在Builder中实现这个,你需要创建三个例程来表示每个任务环节(练习、ConditionA和ConditionB)。每个例程都要放在一个循环中(分别叫做practice_loop、A_loop和B_loop)。另外,在练习和ConditionA之间插入一个例程(可以叫assignCondition)。

在assignCondition例程中,放一个代码组件。假设在练习例程中有一个表现分数计数器,我们可以用这个来改变后续例程的重复次数。也就是说,通过把循环的重复次数设置为零,我们可以确保这个循环里的例程不会被执行。因此,这些循环的重复次数不是固定的,而是一个变量(比如叫repetitionsA和repetitionsB)。

在assignCondition例程的代码组件的“开始例程”标签中,放入类似下面的Python代码:

if performanceScore > 25:
    repetitionsA = 50 # run this routine 50 times
    repetitionsB = 0 # don't run this condition at all
else:
    repetitionsA = 0 # vice versa: don't run this
    repetitionsB = 50 # do run this

Matt Wall在他的博客中对这种技巧有更详细的描述(以fMRI块设计为例,说明块的顺序需要是可变的):

http://computingforpsychologists.wordpress.com/2013/11/12/how-to-hack-conditional-branching-in-the-psychopy-builder/

撰写回答