PsychoPy入门_06_数据记录

不靠谱PsychoPy入门教程目录:

  1. PsychoPy入门00安装

  2. PsychoPy入门01文字和图片的呈现

  3. PsychoPy入门02按键等待&反应时

  4. PsychoPy入门03视频和音频的呈现

  5. PsychoPy入门04等级评定

  6. PsychoPy入门05循环和随机

  7. PsychoPy入门06数据记录

  8. PsychoPy入门07鼠标的使用

  9. 用PsychoPy做视觉搜索任务实验


之前一直在讲如何呈现刺激,接下来说说怎么来收集实验数据。辛辛苦苦的做实验,最终就是要那点儿数据呢嘛。

这部分主要介绍两个内容,一个是被试基本信息的录入,一个是实验数据,也就是被试反应的记录。

基本信息

在PsychoPy里有一个gui模块专门用来做被试基本信息的登记。gui也就是可视化的用户交互界面,它里面的gui.DlgFromDict()和gui.Dlg()函数可以产生一个对话框,用户填写的信息会保存在一个字典(dictionary)里。

下面我们来看一下怎么用gui.DlgFromDict()创建一个对话框。

首先建一个字典叫做info,里面放的是我们需要记录的被试信息。记着用到的模块要提前载入。

import gui
info = {'name':'', 'age':'', 'num':'2', 'task':['1','2','3','4']}

这里我们要记下他们的姓名、年龄、测试编号、任务类型。注意,名字要写成英文字母,直接写汉字的话会出错的。

字典里没有给value的话,就是一个空白框(冒号前面的'name'是key,冒号后面的是value)。可以设置默认值,比如'num':'2',这样输入框里就会出现2,而且是可以修改的。像'task'这样value是一个list的话,就变成下拉选项的形式了。

接下来要用gui.DlgFromDict()创建一个对话框,代码如下:

infoDlg = gui.DlgFromDict(dictionary = info, 
                          title = u'基本信息', 
                          order = ['name','age','num'])

dictionary用我们上面建的info,标题title叫基本信息,order用来确定它们的顺序。一般会按照创建的顺序呈现的,如果你想调整顺序的在order这里重新设置一下就行。

这样对话框就创建好了,运行一下的就会出现下面这样一个小对话框:



一般情况下我们会设置一个退出的选项,如果被试不打算接着做实验,他可以点cancel,这样程序退出,不再执行下面的代码。

if infoDlg.OK == False:
    core.quit()

现在程序里没有别的东西的话看不出差别来。等一下把之前的内容放一点进来再看看哈。

你填完信息点击OK之后,所有的信息就放在info这个字典里了。打印一下看看:

print core,info
# output
{'age': u'22', 'num': u'2', 'name': u'cc', 'task': u'1'}

好嘞,基本上就是这样,gui还可以用来打开和保存本地文件,有需要请自行查阅官方API。被试信息登记部分的完整代码如下:

#!/usr/bin/env python2
# -*- coding: utf-8 -*-

#载入所需要的库
from psychopy import core, gui

#被试信息记录窗口
info = {'name':'', 'age':'', 'num':'2', 'task':['1','2','3','4']}
infoDlg = gui.DlgFromDict(dictionary = info, title = u'基本信息', order = ['name','age','num','task'])
if infoDlg.OK == False:
    core.quit()
# print info

数据记录

PsychoPy里有专门保存和分析数据的模块psychopy.data,不过我呢只是做个行为实验,不需要搞那么复杂,所以也没去研究data的内容。下面呢简单说一下用open()函数创建文件保存数据的方法。老简单了。

首先建一个空白文档:

dataFile = open("%s.csv"%(info['num']+'_'+info['name']), 'a')

括号里东西挺长其实就两个参数,逗号前是文件名,我用测试编号和被试姓名来命名文件。这里建的是个逗号分隔符文件,csv。txt文本文件也行,excel就比较麻烦了。后边的参数'a'表示文件编辑模式,a是append的意思,在文件末尾添加内容。还可以是'w'(write),它是从文件开头写起,已经存在的内容会全部抹掉。

文件建好了,怎么往文件里写东西呢?这样:

dataFile.write(info['name']+','+info['age']+','+info['num']+'\n')

用.write()函数写入。括号里只能是一个字符串,所以如果有多个项目一起写进去的话用‘+’把它们粘结成一个字符串。如果是数值要转成字符型,用str()。

好的,我们现在可以运行一下。填上基本信息,点OK。之后打开你程序所在的位置就会看到一个新的csv文件,用excel打开,里面记录着你的姓名、年龄和编号3个数据。像这样:



记录数据的方法就是这样了。下面把上一篇中循环等级评定的代码赋值过来,循环次数设为了3次。注意载入模块的地方要修改一下,把需要的都加载进来。在每次评定完之后向dataFile里写入被试的选择结果。

# 放在呈现之前
dataFile.write('picName, feelRating, feelRT, likeRating, likeRT\n')

# scale1调用完之后
dataFile.write(pics[i]+', '+str(scale_1.getRating())+', '+str(scale_1.getRT())+', ')

# scale2调用完之后
dataFile.write(str(scale_2.getRating())+', '+str(scale_2.getRT())+'\n')

这里我要记录内容有五项:picName:图片名、feelRating:感受评定、feelRT:感受评定的反应时、 likeRating:喜欢程度的评定、 likeRT:喜欢程度评定的反应时。

好的,运行一下。打开scv文件:


解释一下,csv(Comma-Separated Values)就是用逗号来分割数据值的,我们在写入的时候用逗号进行分割,它就自动形成行列整齐的数据表了,直接拎出来做统计分析就可以了。记着用'\n'断行。


整体代码如下:

#!/usr/bin/env python2
# -*- coding: utf-8 -*-

#载入所需要的库
from psychopy import visual, core, event, gui
import random

#被试信息记录窗口
info = {'name':'', 'age':'', 'num':'2', 'task':['1','2','3','4']}
infoDlg = gui.DlgFromDict(dictionary = info, title = u'基本信息', order = ['name','age','num','task'])
if infoDlg.OK == False:
    core.quit()
# print info

#创建空白文档
dataFile = open("%s.csv"%(info['num']+'_'+info['name']), 'a')
dataFile.write(info['name']+','+info['age']+','+info['num']+'\n')

#创建窗口
win = visual.Window(fullscr = False, size = (1000,600),
                    color = (-1.0,-1.0,-1.0), units = 'norm', monitor = 'testMonitor')

#文字
text_1 = visual.TextStim(win, text = u'示例6', height = 0.12, pos = (0.0,0.2), color = 'pink')
text_2 = visual.TextStim(win, text = u'', height = 0.1, pos = (0.0,-0.2), color = 'skyblue')
text_2.text= u'被试信息与实验数据的记录'

#呈现文字刺激
text_1.draw()
text_2.draw()
win.flip()
core.wait(2)

#评定内容
pic = visual.ImageStim(win, image = 'test_1.jpg', pos = (0.0,0.4))
item = visual.TextStim(win, text = u'', pos = (0.0,-0.1))
item.text = u'这张图给你的感受是?'

#量表
scale_1 = visual.RatingScale(win, choices = [u'ugly',u'WTH',u'nice'], pos = (0.0,-0.6))
scale_2 = visual.RatingScale(win, scale = u'1=非常不喜欢 . . . . . . . . . . . 7=非常喜欢',
                                low =1, high = 7, precision = 1, pos = (0.0,-0.6),
                                marker = 'circle', showValue = True,
                                acceptPreText = u'请在横线上点击')
pics = ['test_1.jpg','test_2.jpg','test_3.jpg','test_4.jpg','test_5.jpg','test_6.jpg','test_7.jpg','test_8.jpg','test_9.jpg','test_10.jpg']
random.shuffle(pics)

#---------new------------ 
dataFile.write('picName, feelRating, feelRT, likeRating, likeRT\n')
#呈现
for i in range(3):
    pic.image = pics[i]
    scale_1.reset()
    scale_2.reset()
    item.text = u'这张图给你的感受是?'
    while scale_1.noResponse:
        pic.draw()
        item.draw()
        scale_1.draw()
        win.flip()
    #---------new------------ 
    dataFile.write(pics[i]+', '+str(scale_1.getRating())+', '+str(scale_1.getRT())+', ')
    item.text = u'评定你对着张图片的喜爱程度。'
    while scale_2.noResponse:
        pic.draw()
        item.draw()
        scale_2.draw()
        win.flip()
    #---------new------------ 
    dataFile.write(str(scale_2.getRating())+', '+str(scale_2.getRT())+'\n')

OK,数据记录的东西就这么多啦。有什么疑问或者建议,请在下方评论。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,049评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,494评论 18 139
  • 天际的晨灰 阻挡了星光 迷茫于昨夜的 睡梦,不安分的 青春,遗失在二十多年前的征战 蜇伏在心里 那音质有如崔健的破...
    昊水长天阅读 269评论 0 2
  • 谈到教育孩子,我们很容易想到鼓励,夸奖和表扬,可是当我们跟孩子说出口的时候却往往是直奔着另外一个方向——批评而去。...
    爱家心理阅读 468评论 0 1
  • 坚持做一件事有多难? 放弃一件事一定很容易吗? 爱情和面包总是对立吗? 即使为了健康,有没有不可抛弃的东西? 生活...
    做文字的朋友阅读 170评论 0 0