2015-06-02 2 views
0

Я использую PsychoPy Builder и использовал код только рудиментарный. Теперь у меня проблема, для которой, я думаю, кодирование неизбежно, но я понятия не имею, как это сделать, и до сих пор я не нашел полезных ответов в сети.Выбор небольшого количества проб в файле с потенциально огромным состоянием в псевдослучайном порядке

У меня есть эксперимент с фотографиями из 3 валентностей (отрицательный, нейтральный, положительный). В одном из углов изображений дополнительные снимки (буквы и цифры) могут отображаться (случайным образом в одном из 4-х позиций) в случайных задержках.

В целом, при всех комбинациях (учитывая личность букв/цифр), у меня более 2000 пробных возможностей. Но мне нужно только 72 испытания, при условии, что каждая валентность появляется 24 раза (или: каждая из 36 снимков 2 раза) и каждая латентность 36 раз. Таким образом, валентность и латентность должны уравновешиваться, но позиции и тождества букв и чисел могут быть случайными. Тем не менее, в определенной степени (в 25% испытаний) никакие буквы/цифры не должны появляться в углах.

Есть ли способ сделать это?

ответ

0

Добавление довольно простого компонента кода в построителе сделает это за вас. Я немного смущен об условиях, но вы, вероятно, получите общую идею. Предположим, что у вас есть 72 «фиксированных» условия в файле условий и цикл с подпрограммой, которая выполняется для каждого из этих условий.

Я предполагаю, что у вас есть TextStim в рутине стимула. Допустим, вы назвали его «letternumber». Тогда общая стратегия состоит в том, чтобы предварительно вычислить список рандомизированных символов и позиций для каждого из 72 испытаний, а затем просто отобразить их при прохождении эксперимента. Чтобы сделать это, добавьте компонент кода в верхней части рутины стимула и добавить под «начать эксперимент»:

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] 

Тогда под «начать процедуру» в компоненте кода, установите 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]) 

Вам может понадобиться поставить галочку «установить каждый повтор» для lettersnumbers компонента Builder для текста на самом деле показать.

+0

Поскольку я действительно новичок в этом, мне потребовалось некоторое время, чтобы узнать, что в «каждом испытании» (который называется «каждый кадр» в моей версии) компонент кода «испытания» означает имя петля. Но теперь это работает. Спасибо! – Sarah

+0

Ах, извините, это «начать рутину». И добавьте второй фрагмент кода в «begin procedure». Вам нужно всего лишь сделать это один раз за рутину, так что это сэкономит немного производительности, но что более важно, имеет больше смысла. Обновил ответ соответственно. –

+0

К сожалению, после нескольких испытаний я получаю сообщение об ошибке и программа останавливается. Обратная связь с ошибками: ... letternumbers.pos = pos_trial [trials.thisN] IndexError: индекс индекса вне диапазона – Sarah

0

Вот стратегия, которую вы могли бы попробовать, но поскольку я не использую построитель, я не могу интегрировать его в этот рабочий поток.

Подготовьте список, в котором вы хотите записывать числа типов. Вы можете ввести это вручную, если это необходимо. Например, mytrials = ['a','a',...'d','d'], где эти буквы представляют собой ярлык для комбинации типов проб, которые вы хотите.

Затем откройте консоль и переставьте этот список (т. Е. Перетасуйте его).

import random 
random.shuffle(mytrials) 

Это будет смещать 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> 

Есть программные способы построения списка с правильным числом повторов, но за то, что вы делаете, это может быть проще просто поедете с написанным вручную списком, а затем беспокойтесь о том, чтобы сделать его более привлекательным, когда это работает.

Смежные вопросы