Как вы реализуете эксперименты с условным ветвлением в PsychoPy Builder?
Многие поведенческие экспериментальные модели в психологии / нейробиологии требуют условного ветвления (например, переходить к фазе теста только в том случае, если на начальном этапе практики достигнут необходимый уровень производительности). Представление PsychoPy Builder позволяет генерировать сценарий Python для запуска эксперимента с использованием в основном графических элементов управления. Но, похоже, нет встроенной поддержки условного ветвления.
Может ли пропуск конкретной подпрограммы в данном прогоне быть реализован в Builder с использованием фрагментов Python в компоненте Code? Или это требует перехода к полной среде Python Coder?
1 ответ
Представление Coder в PsychoPy дает вам полный доступ к языку программирования Python, и, следовательно, вы можете реализовать произвольно сложные экспериментальные проекты.
Тем временем в графическом представлении PsychoPy подчеркивается простота использования и простота, а не гибкость. Одной вещью, которая не обслуживает непосредственно, является условное ветвление. Однако его можно взломать, чтобы достичь его косвенным путем.
Допустим, у вас есть трехэтапный эксперимент: тренировочный блок, за которым следуют два возможных экспериментальных блока, ConditionA или ConditionB. После завершения учебного блока высокоэффективные субъекты назначаются условию A, в то время как малоэффективные субъекты назначаются условию B.
Чтобы реализовать это в Builder, создайте три подпрограммы для представления каждого из блоков задач (практика, условие A и условие B). Каждый из них также будет окружен циклом (practice_loop, A_loop и B_loop соответственно.) Также вставьте подпрограмму между Practice и conditionA (называемой, скажем, assignCondition).
В процедуре assignCondition поместите компонент Code. Предположим в этом случае, что счетчик результатов работы был сохранен в рутине Практики. Мы можем использовать это, чтобы изменить количество повторений последующих подпрограмм. То есть, устанавливая номер повторения цикла в ноль, мы гарантируем, что подпрограммы внутри этого цикла не будут выполняться. Следовательно, число повторений этих циклов будет не фиксированным значением, а переменной (скажем, repetitionsA и repetitionsB).
На вкладке "Begin Routine" компонента Code подпрограммы 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
Более полное описание этого метода дан Мэттом Уоллом в сообщении в блоге здесь (на примере дизайна блока fMRI, в котором порядок блоков должен быть переменным):