Это трудно реализовать в обычном режиме работы Builder, который заключается в управлении испытаниями из фиксированного списка условий. Хотя порядок строк может быть рандомизированным для субъектов, пары значений в столбцах остаются постоянными.
Стандартный ответ на это — это то, на что вы ссылаетесь в своем комментарии выше: в коде перетасовывайте файл условий в начале каждого эксперимента, чтобы каждый субъект, по сути, проводил испытания, управляемые уникальным файлом условий.
Вы, кажется, рады сделать это в Matlab. Это будет работать нормально, так как это можно сделать еще до запуска PsychoPy. Но его также можно очень легко реализовать в коде Python. Таким образом, вы могли бы делать все в PsychoPy, и в этом случае не нужно было бы отказываться от Builder. Вы просто вставляете компонент кода с некоторым кодом для запуска в начале эксперимента, который настраивает файл условий.
Вам нужно будет создать три списка, а не два, т. е. вам также нужен список псевдослучайных вариантов, чтобы чередовать сохранение лица или эмоций от испытания к испытанию: если вы сделаете это полностью случайным образом, вы выйдете из равновесия, и исчерпать один из атрибутов раньше другого.
from numpy.random import shuffle
# make a list of 25 dictionaries of unique face/emotion pairs:
pairsList = []
for face in ['1', '2', '3', '4', '5']:
for emotion in ['1', '2', '3', '4', '5']:
pairsList.append({'faceNum': face, 'emotionNum': emotion})
shuffle(pairsList)
# a list of whether to alternate between preserving face or emotion across trials:
attributes = ['faceNum', 'emotionNum'] * 12 # length 24
shuffle(attributes)
# need to create an initial selection before cycling though the
# next 24 randomised but balanced choices:
pair = pairsList.pop()
currentFace = pair['faceNum']
currentEmotion = pair['emotionNum']
images = ['face_' + currentFace + '_emotion_' + currentEmotion + '.jpg']
for attribute in attributes:
if attribute == 'faceNum':
selection = currentFace
else:
selection = currentEmotion
# find another pair with the same selected attribute:
for pair in pairsList:
if pair[attribute] == selection:
# store the combination for this trial:
currentFace = pair['faceNum']
currentEmotion = pair['emotionNum']
images.append('face_' + currentFace + '_emotion_' + currentEmotion + '.jpg')
# remove this combination so it can't be used again
pairsList.remove(pair)
images.reverse()
print(images)
Затем просто запишите список images
в файл .csv с одним столбцом, чтобы использовать его в качестве файла условий.
Не забудьте установить цикл в Builder в фиксированном порядке, а не в случайном порядке, так как сам список имеет встроенную рандомизацию.
person
Michael MacAskill
schedule
30.04.2015