Psychopy 环路精神病中的伪随机化

Psychopy 环路精神病中的伪随机化,psychopy,Psychopy,我知道过去也有人问过类似的问题,但我仍在思考如何解决这个问题,希望有人能提供一些帮助。使用心理疗法,我想展示不同的图像,特别是16个情绪试验、16个中性试验和16个面部试验。我想伪随机循环,这样就不会有超过2个连续的情绪试验。我在Builder中创建了这个实验,但在阅读了之前关于伪随机的文章后编译了一个脚本 我读过以前的文章,其中建议创建随机excel文件并使用这些文件,但考虑到我有多少试验,我认为这太多了,我希望在编码方面能得到一些帮助。我曾试图实现和调整一些为我的实验而发布的代码,但没有效果

我知道过去也有人问过类似的问题,但我仍在思考如何解决这个问题,希望有人能提供一些帮助。使用心理疗法,我想展示不同的图像,特别是16个情绪试验、16个中性试验和16个面部试验。我想伪随机循环,这样就不会有超过2个连续的情绪试验。我在Builder中创建了这个实验,但在阅读了之前关于伪随机的文章后编译了一个脚本

我读过以前的文章,其中建议创建随机excel文件并使用这些文件,但考虑到我有多少试验,我认为这太多了,我希望在编码方面能得到一些帮助。我曾试图实现和调整一些为我的实验而发布的代码,但没有效果

有人对我的情况有什么建议吗

谢谢,,
Rae

这不太正确,但希望能给你一些想法。我认为,如果最后三项结果相同,您可能偶尔会在
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])
的方法来运行它。考虑到每种类型有16次,并且只拒绝两次以上的情绪测试,这里有一种方法总是会非常快地收敛@brittUWaterloo建议离线进行试验,这是我自己的典型做法。(我喜欢有少量的随机顺序,对一些受试者进行前向排序,对其他受试者进行后向排序,并对它们进行预筛选,以确保没有奇怪或意外的并置。)但如果你愿意,下面的算法肯定足够安全,可以在实验中进行

第一个示例假设您可以使用字符串表示给定的试验,例如“e”表示情绪试验,“n”表示中性试验,“f”表示面部试验。这也适用于“emo”、“neut”、“face”,而不仅仅是单个字母,只需将代码中的
eee
更改为
emoemo

import random

trials = ['e'] * 16 + ['n'] * 16 + ['f'] * 16
while 'eee' in ''.join(trials):
    random.shuffle(trials)    
print trials
这里有一种更通用的方法,其中试用代码不限于字符串(尽管此处是用于说明的字符串):

编辑:要从试用列表创建一个心理变态风格的条件文件,只需将值写入如下文件:

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

然后,您可以按常规方式将其用作构建器循环中的条件文件。您也可以在Excel中打开此文件,以此类推。

欢迎使用so。请展示你迄今为止所做的一切。非常感谢你的帮助!!!我尝试使用第一个示例,因为Excel文件中的变量是字符串。在我的脚本开始时,我稍微修改并粘贴了您编写的代码行,它似乎运行得很顺利。但为了澄清你最后的评论,我有一个条件文件,我已经在循环中加入了一个关于刺激的专栏。您是否建议我创建第二个包含变量的文件以使其正确运行?再次感谢你!我说不出你是如何组织事情的,有几件事是可能的。一个循环应该只有一个条件文件(.xlsx或.csv文件),不要设置两个;您可能需要得到一个包含两列的文件。excel文件的内容是什么?示例?弦是怎么用的?我想是的,但不确定。循环中我的Excel(条件)文件大约有8列。其中一列提到“类型”,即审判是情绪化的、中立的还是面对面的。我该如何具体说明我希望将这些试验纳入我的随机化“类型”专栏?嗯,SO评论系统过于局限,无法正确讨论这一点。你能发到“心理变态用户”的邮件列表吗?如果你的脚本运行顺利,那就太好了。如果没有,请在发布到电子邮件列表时详细说明。当然,听起来很棒!再次感谢你!!非常感谢你的帮助!不幸的是,我很难适应我的实验。我试着把随机化编入实验脚本。我知道你写过离线做这个更好,但我想尝试在实验脚本中实现它。
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