Hello,
这里是行上行下,我是喵君姐姐~
最近在家实在无聊,所以只好安安心心学习啦。你最近在家干什么呢?
今天,继续邀请阿槑给你带来Psychopy系列教程,带来实验数据的收集与处理,希望你会继续喜欢并且一直支持哟~
1 相关概念的简单引入
在前几期,我们已经学习了Psychopy入门、数据类型与运算符、条件与循环、flanker范式的完整编程。
但是,在心理学实验中,除了要在屏幕上呈现想要的刺激,我们还希望计算机能够帮助我们收集被试基本信息、反应时以及正确率等指标。
那么如何达到这一目的呢?
2 被试信息录入
对于被试信息,我们将使用 psychopy 中的 gui 来进行收集,所谓 gui ,就是一个被试可以在其中填写信息的对话框,如图:
在导入 gui 后,我们使用 gui 中的 DlgFromDict 来进行功能的实现:
from psychopy import core, gui #导入
info = {
'observer':'01_xxx','gender':['m','f'],'age':18}
dlg = gui.DlgFromDict(info, title='flanker', order=['observer','gender','age']) #设置gui
if dlg.OK: #单击 OK 后的操作
pass #占位符
else:
core.quit()
可以看到,我们先定义了一个字典来储存需要填写信息的标题以及对应的默认内容,之后我们使用 DlgFromDict 将字典导入 gui 并设置 gui 的标题(title)以及内容顺序(order)。
最后用一个 if 函数来控制 OK 按键使其继续后面的操作,或者 Cancel 按键退出整个程序。因为这里的退出需要使用 core,因此同样需要在开头进行导入。
下一步,我们需要确定一下我们最终记录的数据文档的输出路径及文件名。
首先,我们在程序所在路径,也就是我们程序脚本所在的位置建立一个 data 文件夹用于存放数据。
之后,我们先以字符串的形式定义文件名,为了防止文件重复,将会通过 time 获取当前系统时间并添加到文件名中。
import time
date = time.strftime("_20%y_%m_%d_%H%M", time.localtime()) #获取当前时间
file = 'data/'+info['observer']+'_'+info['gender']+'_'+str(info['age'])+date #文档名(含路径)
这里的 ‘%y’ , ‘%m’, ‘%d’, ‘%H%M’ 被称为占位符。所谓占位符,可以理解为先占据一个位置,以便之后添加需要填进去的内容。当需要填入的内容过长或需要进行实时获取时,我们常用占位符来暂时补齐位置。
不同性质的内容需要不同的占位符,常见的占位符包括 ‘%s’ 字符串,’%d’ 整数,’%f’ 浮点数。
当我们获得了文件名以后,使用 with open…as… 进行相应的文档操作。
with open("%s.csv"%(file),'a') as D: #写入表头
D.write('flanker'+','+'center'+','+'RT'+','+'accuracy'+'\n')
简要分析如下:
一般来讲,实验过程中所输出的数据均写入 csv 文档中,csv 文档可以使用 excel 打开并比我们平时用的 xls 要更加简单。在 csv 文档中,不同单元格之间仅仅以逗号作为分隔符来进行分隔。
该段代码的输出效果如下:
除了所介绍的这种简便的方法,对于文件夹、文档的操作还可以使用 python 中的 os 来进行操作,但是 os 对于含有中文的路径不是特别友好,因此这里将不再介绍。
当我们准备好文档后,就可以使用 with open…as… 不断地对文档内容进行写入,只需要与表头相对应即可。
对于我们的例子 flanker 范式来说,我们所要收集的是被试的每次反应的反应时以及正确与否。
3 反应时记录
在 psychopy 的 Window 中,flip() 方法正好含有该方法运行时距离整个程序开始时的时间,因此我们只需要找到反应屏的 flip() 时间与前一个屏的 flip() 时间做差,就可以得到被试的反应时间。
from psychopy