循环心理学中的伪随机化

时间:2015-10-28 14:49:23

标签: psychopy

我知道其他人过去曾问过类似的问题,但我仍然坚持如何解决问题,并希望有人可以提供一些帮助。使用PsychoPy,我想呈现不同的图像,特别是16个情绪试验,16个中性试验和16个面部试验。我想伪随机化循环,这样就不会有超过2个连续的情绪试验。我在Builder中创建了实验,但在阅读了伪随机化的先前帖子后编译了一个脚本。

我已经阅读过以前的帖子,建议创建随机的excel文件并使用它们,但考虑到我有多少试验,我认为这将是太多,并希望有一些编码方面的帮助。我试图实现并调整为我的实验发布的一些代码,但无济于事。

有没有人对我的情况有任何建议?

谢谢你, RAE

2 个答案:

答案 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])

之类的方式运行它