我知道其他人过去曾问过类似的问题,但我仍然坚持如何解决问题,并希望有人可以提供一些帮助。使用PsychoPy,我想呈现不同的图像,特别是16个情绪试验,16个中性试验和16个面部试验。我想伪随机化循环,这样就不会有超过2个连续的情绪试验。我在Builder中创建了实验,但在阅读了伪随机化的先前帖子后编译了一个脚本。
我已经阅读过以前的帖子,建议创建随机的excel文件并使用它们,但考虑到我有多少试验,我认为这将是太多,并希望有一些编码方面的帮助。我试图实现并调整为我的实验发布的一些代码,但无济于事。
有没有人对我的情况有任何建议?
谢谢你, RAE
答案 0 :(得分:3)
这里的方法总是很快收敛,因为你有16种每种类型,只拒绝超过两次情绪试验。 @ brittUWaterloo建议离线生成试验是非常好的 - 这就是我自己常做的事情。 (我喜欢有少量的随机顺序,为某些主题做前进,为其他人做后退,并预先筛选它们以确保没有奇怪或无意的并置。)但是下面的算法肯定足够安全。如果您愿意,可以进行实验。
第一个示例假设您可以使用字符串表示给定的试用版,例如' e'对于情绪试验,' n'中立的,' f'面对。这适用于' emo',' neut'' face'同样,不只是单个字母,只需在代码中将eee
更改为emoemoemo
:
import random
trials = ['e'] * 16 + ['n'] * 16 + ['f'] * 16
while 'eee' in ''.join(trials):
random.shuffle(trials)
print trials
这是一种更通用的方法,其中试用代码不限于字符串(尽管这里的字符串是用于说明的字符串):
import random
def run_of_3(trials, obj):
# detect if there's a run of at least 3 objects 'obj'
for i in range(2, len(trials)):
if trials[i-2: i+1] == [obj] * 3:
return True
return False
tr = ['e'] * 16 + ['n'] * 16 + ['f'] * 16
while run_of_3(tr, 'e'):
random.shuffle(tr)
print tr
编辑:要从试用列表创建一个PsychoPy样式条件文件,只需将值写入如下文件:
with open('emo_neu_face.csv', 'wb') as f:
f.write('stim\n') # this is a 'header' row
f.write('\n'.join(tr)) # these are the values
然后,您可以以常规方式将其用作Builder循环中的条件文件。您也可以在Excel中打开它,依此类推。
答案 1 :(得分:0)
这不太对,但希望能给你一些想法。如果最后三个项目结果相同,我认为你偶尔可以在elif
语句中陷入无限循环,但你可以在那里添加某种计数器。无论如何,这显示了您可以适应的策略。我不是将它放在实验代码中,而是在命令行中单独生成试验序列,然后将成功的输出保存为实验代码中的列表以向所有参与者显示,并且知道事情不会在崩溃期间崩溃实际运行。
import random as r
#making some dummy data
abc = ['f']*10 + ['e']*10 + ['d']*10
def f (l1,l2):
#just looking at the output to see how it works; can delete
print "l1 = " + str(l1)
print l2
if not l2:
#checks if second list is empty, if so, we are done
out = list(l1)
elif (l1[-1] == l1[-2] and l1[-1] == l2[0]):
#shuffling changes list in place, have to copy it to use it
r.shuffle(l2)
t = list(l2)
f (l1,t)
else:
print "i am here"
l1.append(l2.pop(0))
f(l1,l2)
return l1
然后您可以使用newlist = f(abc[0:2],abc[2:-1])