实验编程:PsychoPy从入门到精通
上QQ阅读APP看书,第一时间看更新

第1章 简介

本书的目的是带你入门,让你能够运用PsychoPy软件包编写和运行实验。无论你是学生、老师还是研究人员,我们都希望本书能为你提供一定帮助。虽然有些人认为计算机技术在某种意义上很具挑战性,但我们希望通过本书让你相信,即使你并不擅长计算机,也可以利用PsychoPy编写实验;即使你讨厌计算机,甚至无法理解计算机的某些高级功能,你也可以完成大多数标准的实验设计。

对于那些擅长计算机的人,我们希望本书能为你提供PsychoPy的一些高级用法,让你相信,PsychoPy能用简单的方式完成无聊的事情(例如,存储数据、追踪随机化内容等),与此同时还能实现一些简洁的效果(例如,用网络摄像头直播或呈现一个“跳动的心脏”之类的刺激[1])。

为满足广大读者的需要,我们这本书分为3部分。

第一部分(第1~9章)旨在介绍在设计行为科学实验时可能需要用到的基本技巧(以及一些高级技巧)。每一章都会通过一系列实验引入一些新的概念,你可以以此为基础进行更深入的研究。例如,我们将通过编写探究面孔倒置效应的实验来教你如何呈现和操作图片。

第二部分(第10~15章)涵盖了更多实验编写和运行的原理知识。如果你是一名科学家,并且想将PsychoPy运用在发表的研究成果中,那么该部分非常重要。对于任何领域内的科学专家来说,都推荐阅读该部分。

第三部分(第16~19章)涵盖了特别的专题研究。该部分只有一些人会用到,比如只有那些做f MRI研究或学习视觉感知的人,才会用到f MRI的内容。读者可以根据自身情况选读该部分。

1.1 编写实验

早期,心理学家还需要工程人员的帮助才能完成实验。教授还会深入车间并让工程人员制作一些能使光线以非常精确的频率闪烁的电子箱设备,或者从专业公司购买速示器(一种可以像照相机快门那样快速并在短时间内呈现视觉刺激的设备),然后在每次实验中安排博士生不停更换快门后面所呈现的刺激(如照片)。

后来,计算机出现了,许多之前用来做实验的硬件和电子方式因此过时了。大多数研究部门关闭了硬件制造车间。取而代之的是程序员,他们能按照需求操作计算机。教授每次想做一个实验,程序员就为这个实验写一个程序;不过当实验有了变化时,教授只能请程序员回来做必要的修改。

随着时间的推移,实验所用的编程语言也逐渐变得易于使用(先是C语言取代了汇编语言,现在C语言也逐渐被解释型的脚本语言所取代,例如Python、MATLAB和Java[2])。这些改变让那些有技术头脑的人,即使非计算机科学出身,也能够编写实验。

最近,一些软件包让你即使没有进行“编程”,或者说,至少不是传统意义上写代码的那种编程,也可以进行许多实验。现在,即使你不懂编程,也可以独立进行研究,尽管你会觉得这个说法匪夷所思。本书展示了如何利用PsychoPy(众多便利选择中的一种),来进行基础实验。对于那些需要进行高级实验的人,本书也会展示如何使用简单的编程来扩展这些图形化的实验。或许你会发现,编程并不像想象中那么难,你也许可以从中得到些许满足(后面会介绍相关内容)。

虽然本书会教你如何自己编写实验,但这并不意味着你完全不需要程序员和技术支持人员。如果你身边有擅长技术、擅长编程的人,这会对你很有帮助,尤其是在你的程序出现错误或者你想做一些更高级的实验时,他们能给予你及时的援助。身边有人懂这些技术总是好的。当然,如果你把力所能及的事情做好,只是让他们做最后的微调,他们也会感激不尽。

1.2 构建与编程

在使用一些实验设计软件(如Psychtoolbox和Presentation)编写实验程序时需要写很多行代码。虽然它们的功能很强大,但是要求你懂编程;即使你懂编程,采用这些软件编写实验也非常耗时,还经常出错。

其他的软件(如E-Prime、Psy Scope和Open Sesame)允许你用图形用户界面可视化地编写实验。对于简单的实验,这些工具一般很容易使用,但将其应用在复杂的实验上就不太可能了。你只有创建相当复杂的可视化图形才能得到你想要的结果。但是这样一来,你还不如学习编程。当图形化工具包不能帮助你编写特定的实验或者不能处理某种“随机但有少数例外”的刺激时,你可能会感觉很恼火,但能满足所有实验需求的图形用户界面太复杂,你又很难学会。

PsychoPy是我们在本书中一直提及的软件包,它提供了两种用户界面来编写实验:程序员可以使用Coder界面,而喜欢用图形界面的人可以使用Builder界面。Coder界面将为比较有能力的程序员提供强大的灵活性和齐全的功能,让他们完成他们喜欢的和具有任何可能的设计,享受完美的用户体验。与此相反,Builder界面则设计得非常简单,心理学的本科生(他们当中很多人不喜欢编程)也可以在其中编写和运行自己的实验。这样一来,用户就可以用简单的方式编写“标准”的实验。为了实现这个目标,我们设计了Builder界面,而事实上它也非常成功,它甚至能够编写比我们设想中更加复杂的实验。现在,许多大学将它用于本科教学,同时,许多经验丰富的科学家,甚至那些完全可以自己编写代码的研究人员,也使用Builder界面运行他们的大多数实验。虽然我们编写了PsychoPy软件包,这显得我们好像是比较专业的程序员,但其实我们也用Builder界面进行大多数的实验,因为用Builder界面能让实验更快地运行,而且没有许多需要修复的漏洞。

当Builder界面不能帮助你完成设想的实验时,单击“保存”按钮后,你在Builder界面里面做的所有工作都不会丢失,你可以通过继续添加代码来进行更高级的研究。也许你的硬盘不支持图形界面,也许你需要特定的刺激序列,可能不是简单的“随机”序列或“有序”序列,例如,刺激A在同一行不重复两次的随机序列。这些用图形用户界面很难办到,但编写代码通常是可行的(第8章将涵盖这些内容)。

此外,许多用户(包括我们)同时使用上述两种方法:首先在Builder界面下编写大部分实验程序(因为单个试次以及存储数据通常来说比较简单),然后简单地通过添加代码组件或进入Coder界面来处理不容易用图形用户界面建构的内容(例如,随机化的某些内容)。

对于很多用户来说,在PsychoPy中编写代码不仅提高了研究水平,还让他们学习了Python编程的基础知识。有一些人会发现编程并不是如他们一开始想象的“洪水猛兽”一般可怕(或者他们根本没有意识到他们正在编程),甚至有一些人发现编程还挺有趣。和玩数独一样,编程旨在解决问题,而且编程的结果十分有用。总而言之,相对于Builder界面来说,Coder界面是更加通用的一种工具,通过代码它不仅可以帮助你管理文件、自动执行任务、分析数据,甚至将研究成果可视化,还可以帮助你自动运行实验。

虽然能够编写代码非常好,但是在PsychoPy中编写大多数实验最快、最不易出错的方式是也使用Builder界面。

1.3 开源软件的优缺点

开源软件的兴起对于很多人来说是一件不可思议的事。一个人可以不要报酬去编写代码再将它免费地供他人使用,这种做法有点奇怪。人们也在怀疑这样的软件或许质量低下,或许缺少特性(如果软件精良,你就会选择卖掉,对吧?)。其他人则猜测这只不过是一种策略,如果该软件有足够大的市场,早晚都要开始收费。以上这些想法并不都是正确的。举个例子,可以看一看强大而专业的Mozilla组件(如雷鸟邮件客户端和火狐浏览器)。Python编程语言、R统计软件包和Linux操作系统是更好的例证:它们已经被证明是漏洞很少、可持续使用且功能强大的产品,而且不会花费你一分钱。

所以,这是怎么回事呢?他们为什么这么做?通常来说,开源软件是某些特定领域的发烧友所编写的,他们觉得现有的软件不能满足他们的需求,所以便开始自己编写软件。换位思考,如果你仅仅是为了把产品做好(记住,你现在是发烧友)而不是从中赚钱,让软件变得更好的一个方法就是让每个人都能看到代码。这或许能激励其他人参与其中并帮助修复漏洞以及给软件增加新的特性。当然,因为你给了每个人源代码,这也就意味着你无法售卖它,不过如果你不是为了钱,这就无所谓了。上述就是许多开源产品研发的根本动力。

传统的软件是公司收取软件费用,并招聘专业程序员编写代码,不过这两者有何区别呢?事实上,开源软件确实爱出毛病,而且因为它开源免费,所以程序员没有义务修复你关心的那些漏洞。他们希望软件变得更好,但他们的时间有限。而商业软件公司不希望发布的软件有漏洞,也担心被投诉,因此他们会事先投入大量时间做测试。开源软件的另一个潜在缺点是许多开源项目很快就无疾而终了,只剩下几个忠实的支持者。许多程序员开始了一个项目,然后觉得没意思就不做了。你肯定不想花时间学习几年后就消失的软件吧。以上这些就是目前开源项目的最大问题。不过,随着用户日渐增多,贡献者的数量也会增长,这意味着有更多的人参与到修复漏洞和增加新特性的工作中来,于是这个项目就不太可能烂尾了。

开源项目成功发布后会变得非常引人注目。这些发烧友免费为你编写软件。另外,他们也使用这些软件。在实验设计领域中,这意味着那些真正自己做实验的人在编写运行实验的软件,他们能了解其他学者的想法及其想要的是什么。

最后一个优点是,你能接触到所有代码。如果软件未能按照你的想法运行,你可以自己修改软件;如果你是一位喜欢什么都探究清楚的科学家,你也可以查看代码,探究一下。“开放”的科学家喜欢搞清楚他们手上到底是什么东西。

1.4 了解你的计算机

一些人对计算机的了解非常浅显。但如果你在乎研究的准确性,那么你在做实验时,对计算机有适当的了解是十分重要的。很多时候,实验结果不准确不是因为软件的问题,而是因为用户真的不了解他们的计算机。通过下面3个例子,我们可以了解导致实验结果不准确的常见误区。

计算机屏幕以精确且固定的频率刷新。通常,计算机屏幕以60Hz的频率刷新,而你只能在屏幕刷新期间更新你的刺激(例如,让它出现或消失)。这就意味着,刺激出现或消失的持续时间只能是某个特定值,我们一般把这些更新周期称为帧(Frame)。例如,你可以让刺激出现200ms(0.2s),因为在屏幕刷新频率为60Hz时0.2s正好对应12帧(0.2×60 = 12);你也可以让刺激出现250ms,也就是15帧(0.25×60 = 15)。然而,220ms并不是一个有效时长,因为这意味着你的刺激会占用13.2帧,这根本不可能实现。所以关于屏幕,还有更多值得你了解的事情。例如,计算机从屏幕顶端扫描到底端大约需要10ms,因此屏幕顶端的刺激总是比屏幕底端的刺激早出现10ms。

键盘的延时严重。虽然软件包可以提供亚毫秒级的时间精度,但你通常无法获得那种精度的实验数据,因为计算机键盘在检测按键按下时大约有30ms的延时和15ms的误差。参照计算机上精确的时钟,软件包也许确实可以提供“亚毫秒级”的时间精度,但如果这个方法不适用于每种情况,亚毫秒级又有什么用呢(因为没有软件能够适用于所有情况)?

延伸阅读:PsychoPy的起源

PsychoPy项目最初叫Psych Py,最早于2002年3月在sourceforge网站上注册,字母“o”是后添加的。它最初由乔纳森·皮尔斯(Jonathan Peirce)编写,从原理上论证了Python利用图形硬件加速(Open GL)程序可以作为传递实时刺激的有力工具。2003年,乔纳森开始在诺丁汉大学讲授心理学课程,决定进一步研发该项目并在实验室内进行实验。那个时候,在项目中用Python写的库函数仅仅是为了方便编程。

从2004年开始,乔纳森实验室里的所有实验都使用PsychoPy来运行。由于他本人及其博士生的需求,PsychoPy的功能迅速增加。然而,由于PsychoPy是为乔纳森的实验研发的,因此它对其他用户的支持很少。即,如果你觉得它有用,那很好;如果觉得没用,那就不要使用。渐渐地,人们开始思考:“我喜欢你们写的库,但是我想是不是可以……”。乔纳森乐于革新,而且人们要求的有些功能听上去很有趣,所以他就把它们一点一点地加上。

几年之后,乔纳森添加了一个独立的“应用”(application),而不仅是一个库。该应用包含一个代码编辑器,上面有一个绿色的“运行”按钮用于运行脚本。由于该应用很容易安装和试用,很多用户开始试用它。2007年,乔纳森撰写了第一篇描述该软件包的论文。到2009年,又有几百名热爱编程的人愿意修复PsychoPy的漏洞。逐渐地,这些用户[值得提及的是杰里米·格雷(Jeremy Gray)和迈克尔·麦卡斯基尔]开始着手修复漏洞、增加新的特性,并在用户论坛上互相帮助,共同优化软件包。

同时,乔纳森在本科教学中不愿教授学生如何使用E-Prime,并开始思考下一个大动作,即编写一个图形用户界面,以便学生能充分理解他的课程。他认为图形用户界面本质上是用来写Python脚本的。Builder界面在2010年已经基本可以使用,从2011年开始也应用于许多本科实验课堂。

随着Builder界面中新功能的增多,用户数量以及软件优化与维护的贡献者数量也急剧增长。在写本书时(2017年),该软件包已经拥有超过16000名用户(每个月通过IP地址来统计)和超过70名贡献者了(贡献程度不同)。

总而言之,PsychoPy开始没有如此庞大,它只是在不断地成长。看到这样一个有爱的社区伴随着PsychoPy成长,且我们能参与其中,我们感觉非常高兴和自豪。

从磁盘中加载图片不是瞬时的。如果你有一部500万像素的相机(按照现代标准,分辨率不算高),每个像素都用R.G.B值表示(事实上,还有一个alpha通道),那就意味着有1500万个数字需要从磁盘中加载、处理并发送到你的显卡上。虽然如今的计算机可以非常迅速地处理和移动数据,但并不能保证马上做到,总是会有一些延迟,尤其是在你从磁盘中加载数据的时候。

上面的问题都有解决方案,且这些解决方案在大多数情况下有效:你可以在多帧的间隔中呈现刺激,也可以购买更精确计时的仪器设备(尽管在大多数情况下,你并不需要你所认为的那种精确度),图片也可以预先加载,甚至比你想象中的更小而不损坏画质。重要的是,你需要了解这些问题,从而明白如何避免。

1.5 PsychoPy

PsychoPy是多个事物的集合。正如前面的“PsychoPy的起源”部分所解释的,以下部分逐步发展又相对独立。

●Python编程语言库(library)。

●Python编程语言的一个发行版(Python和其他依赖库各有独立的安装包,因此你没必要自己另外下载Python,而且先前安装的Python也不会受到影响)。

●代码编辑器(叫作“Coder界面”),它也是用Python编程语言写的。

●图形用户界面(叫作“Builder界面”),即,可视化的实验编写界面,它也可以将实验的可视化的内容转换成代码。

如上所示,“Python编程语言”的字样出现很多次。这里为不了解Python的人解释一下:Python是一种普适、高级的解释型脚本语言。简单来说,“普适”意味着Python可以在很多平台运行,mac OS和大多数Linux发行版把它作为操作系统的一部分,因为它真的非常好用。“高级”意味着你可以用简单的几行代码完成很多事情。与其他一些语言对比,这些代码可能非常易于阅读(当然,也取决于谁来写代码)。“解释型”意味着在你写完代码时,你不用将代码“编译”为“机器代码”,而且它还可以在多种计算机上运行。如果你曾经编译过C语言代码,或曾经尝试在不同的计算机平台上以相同的方式运行C语言代码,那么你会深刻体会到Python的简便性。

Python本身并不能为PsychoPy提供很多内容,但发烧友们为Python写了很多库。这样,PsychoPy的开发人员不需要自己编写代码。例如,要加载图像,可以使用Python图像处理库(PIL/Pillow,这由一些图像处理方面的发烧友编写);要操作图像,可以使用Python数值计算库(numpy,这由负责许多数据处理的人编写)。所有这些库都由所属领域的发烧友所写,并且免费开放。因此,PsychoPy在某种程度上是将这些不同的库编织起来的一个集成应用。这样一来,用户就不需要十分了解每一个库的编写了。

1.6 开始操作

为了能充分使用本书,你需要在计算机上安装PsychoPy软件。在PsychoPy网页上的右边有一个Download链接。但当你打开页面时,你会发现一系列不同选项,大多数初学者应该选择标记为“Standalone PsychoPy______”的链接。在写本书时,PsychoPy当前的版本是1.85,但是我们推荐你使用最新版本[3]

当你开始运行PsychoPy的时候,你会发现它是通过“Start Up Wizard”打开的,它会检查你的系统,看看计算机怎么样,你也可以跳过此步。

之后你可能会看到两个界面,即Builder和Coder。Builder界面将会是本书的重点,而Coder界面在我们需要查看某些Python代码时(我们必须这样做,代码其实并没有那么难)会偶尔出现。

1.7 更进一步

在读完本书后,如果你还有很多疑问,你可以在PsychoPy的用户论坛上找到很多信息,或者直接用搜索引擎搜索问题或错误消息,看看搜索引擎上有没有答案。实际上你会惊喜地发现,网上经常有答案[4]

在论坛里,请尽量相互理解。大多数回答问题的人只不过是热心的志愿者,他们在工作之外来回答问题,因此让他们帮你完成整个项目是不合适的。如果需要了解计算机的基本知识(例如,如何安装软件),你也许应该和身边的技术人员探讨而不是利用论坛。如果问题过于宽泛,你也许应该和身边的同学与老师进行探讨。当然,如果你知道其他人所问问题的答案,你也可以直接回答。

对于具体的问题来说,用户论坛是一个获取信息的绝佳地方。

解决方案:更新PsychoPy

独立安装包提供了Python发行版以及PsychoPy运行所需的所有依赖库,以及PsychoPy应用程序和库本身的代码。(我们希望你读懂了这句话,否则你可能需要再读一遍。)现在,如果你想更新至PsychoPy的最新版本——具备更少漏洞(我们希望是这样)和更多功能(大概是这样),你不需要下载或者安装整个独立软件包(大概有几百兆字节),通常你可以让PsychoPy自动更新到最新版本或者从菜单栏中选择Tools→Update并在弹出的同一个Update对话框里下载标记为“PsychoPy-_.__._.zip”的文件之一以安装特定版本。

你可能需要以管理员身份运行这一应用才能进行更新。在Windows操作系统里,在桌面上右击PsychoPy图标,选择“以管理员身份运行”。

解决方案:使用论坛

如果你在PsychoPy用户论坛上发布信息、寻求帮助,请说明清楚下面这些信息:

●你在使用Builder界面还是Coder界面工作;

● 你想要做什么;

● 软件在运行失败时的状态(单纯说明“它运行失败”没有任何帮助);

●你使用的操作系统及PsychoPy的版本。

1.8 本书的体例

本书正文中大部分的字体是宋体或新罗马体,但是一些需要在PsychoPy界面中输入的代码采用了代码体,如event.get Keys()。专业术语用楷体表示,而PsychoPy中的专业术语首字母大写[5],如“Routine”和“Flow”。

PsychoPy在Windows、mac OS、Linux系统上均可运行。然而,不同操作系统中的快捷键可能略有区别。我们一般描述的是Windows操作系统中的快捷键(例如,Ctrl-L表示切换视图),在mac OS系统上等同于Cmd(⌘)键[6]。当涉及按键时,可能会提到Return键。许多人把Return键称为Enter键,但严格来说,Enter键与Return键指的是不同的键,它通常在数字小键盘上方。Return键有一个先向下再向左指的箭头,这个词来源于“回车”,可追溯到打字机时代,在那时你需要将打字机的“字车”推回到一行开始的位置。

除了这些排版上的约定,还有一些特别的模块,内含解决方案、延伸阅读、实操方法、练习和拓展。希望你现在知道如何阅读这本书了。现在让我们开始一起学习吧。

解决方案:写给完美主义者

用于展示专业人士通常的做法。你可以选读,但是如果你能学习使用该知识,它就可以帮助你提高工作效率或者至少能赢得朋友的赞赏。

延伸阅读:写给好奇的人

这些信息并非你进行研究所需的信息,但你可能会感兴趣。这里可能会提供一些背景信息,也可能会提供一些浅显的科技信息。如果你不感兴趣,跳过不读即可。

实操方法:写给快速阅读的读者

即使你没有阅读本书中的任何其他内容,也请留意实操方法。这里会提示一些常见错误,或你在没有意识到的情况下做的一些糟糕事情。