查看原文
其他

R语言和Jspsych编写本地和在线心理学实验和问卷教程

喵君姐姐 壹脑云科研圈 2022-10-07


Hello,

这里是行上行下,我是喵君姐姐~


目前受新冠肺炎的影响,学校推迟开学,很多小伙伴的论文实验没办法照常开展。


所以是否可以通过线上来做实验呢?


答案是当然可以!


但是具体应该如何操作呢?


下面邀请“荷兰心理统计联盟成员-覃恺洋”从问卷与实验的编辑,到预处理,到分析,到可视化一条龙讲解。


Part1
相关概念简介


在进行心理学研究的时,不可避免的要接触各种各样的行为实验编程软件和编程语言。通常这些实验编程软件(如e-prime)都是独立的应用且拥有自带的用户图形界面(GUI)。用户可以通过拖动相应的模块来构建自己的行为实验或者问卷。


此外,一些研究者也选择编程语言中专门的包来构建实验(如python 中的psychopy 以及matlab中的psychtoolbox等)。


其中,psychopy提供了独立GUI 的psychopy builder ,它也可以使用拖动模块的方式进行心理学实验编程。上述方式都是进行实验室实验编程的方案。


近年来,随着电脑硬件的升级以及互联网的发展,网络版行为实验逐渐兴起,既给传统的心理学实验编程带来新的挑战,又给这些传统的实验编程包和软件带来了新的机遇和发展方向(如 psychopy builder 已经开始整合网络化行为实验的功能)。

本期首先,将介绍一个进行本地和网络心理学实验或问卷编程的包jspsych (javascript)以及配合R-markdown 使用的jspschr 包(R package)在R-markdown的环境下编写心理学实验和问卷。

如果你主要做网络行为实验或者网络问卷调查,那么jspsych可能是最佳选择。因为它写出的实验或者问卷可以在几乎所有浏览器上运行而不用考虑兼容性问题。

最后,本文将简要介绍jspsych本地心理学实验编程或问卷网络化编程的相关要点。


Part2
线上实验的优势


以问卷研究为例,有些读者可能会疑惑, 一些如问卷星或者googleform类似的平台已经提供了比较好的网络问卷发放方案, 为什么还要自己用jspsych来写呢? 

我认为就问卷研究而言, 使用jspsych能给研究者更大的自由度和灵活性去设计问卷的研究, 比如根据问卷一的得分来筛选被试去做问卷二或者问卷三, 再如把问卷研究和行为实验研究无缝整合到一起等等。

一些平台可能整合了一些例如随机化题目顺序之类的功能, 但是随着当前问卷研究方法的多样化和复杂化, 网络平台GUI工具的开发进度可能都跟不上这些方法的更新进度。

相比而言, 更有灵活性且可延展的jspsych可能更适合做网络平台问卷发放的研究 (如果你的研究设计比较复杂) 。


Part3
需要学习的成本


使用jspsych在R-markdown中构建心理学实验除了要用到jspschr包之外,还需要使用javascript语言的一个第三方包:jspsych。由于jspsych 是用javascript编写而成,故用户需要对JavaScript和html语言有一些了解。

然而,jspsych的官方网站提供了比较亲民的教程。该教程面向没有javascript背景的用户(详情见:https://www.jspsych.org)。另外,jspsych本身也提供了网页端app,该app采用GUI界面,用户只需要填写相应的参数和定义相应的模块即可(当然,如果需要复杂的实验操作,还是需要使用JavaScript代码)。

最重要的是,这款网页app同时支持本地实验和网页端挂载实验,不需要安装本地客户端而且完全开源免费(详情见:http://builder.jspsych.org)。

当然,如果你是R语言的深度粉丝,想完全依赖R 完成整个实验编程的workflow,可以尝试关注jaysire (https://github.com/djnavarro/jaysire)和xprmtnr(https://github.com/djnavarro/xprmntr)这两个包。这两个包本质上是jspsych在R上的封包,所以依然调用了jspsych。


Part4
线上实验的可靠程度


Jspsych的作者曾将jspsych的反应时测量同matlab psychtoolbox 的反应时测量相比较,发现jspsych的测量平均反应时比psychtoolbox多25ms ,但是反应时变异的分布和测量反应时的敏感度没有差异(de Leeuw et al., 2016)。

此外,Pinetet al(2017) 等人比较了网络实验和本地实验多次按键反应之间的时间间隔和反应时的可靠度。作者认为jspsych提供了可靠的反应时测量,即使是网络实验的反应时测量。

尽管已经有相关研究证明了jspsych在测量反应时上的可靠性,但是个人仍然不推荐使用该工具测量网络实验的反应时

反应时是一个相对脆弱的行为指标,受硬件条件和环境的影响较大,即使是实验室实验,实验者也必须小心翼翼的控制许多额外变量。

许多心理学效应落实到反应时上都只有几十ms的差异,在网络实验的条件下,硬件和环境因素都无法保障,造成的变异很可能叠加在实验效应里从而增加了实验噪音。

即使不以反应时为指标,收集一些metedata以了解受试者的测试环境也是非常必要的。这些参数主要包括:实验进行的时间(如:凌晨3点), 实验总耗时(如:1个小时), 浏览器型号, 浏览器窗口大小(如,同时开多个窗口,受试者可能分心), 浏览器窗口非激活时间和次数,(受试者在实验时做其他的事情), IP 地址(判断同一个受试者是否多次参加实验) 等等。

当然,使用jspsych本地实验室实验不存在上述问题(除了统一浏览器型号),实验者只需要像其他心理学编程软件或者编程语言一样操作即可。

Part5
线上实验实战指南


首先,打开R-studio 安装jspsychr, 由于这个包并没有发表到cran上,我们可以通过devtools 来进行安装:

# install.packages("devtools")
devtools::install_github("CrumpLab/jspsychr")

安装完jspsychr之后,jspsych也会自动安装完毕现在我们打开file—new file –R Markdown (如图):


可以看到在模板的列表里面有一个jspsychr的选项(如下图), 点击这个选项并按照自己的喜好修改name参数和location即可,然后点击ok.



然后,找到location的位置,可以看到如下的文件列表:



其中 ,experiment文件夹是实验的源文件,run.R 是启动实验的R代码, 也就是说我们只需要在每次本地实验的时候run 这个代码就行了。最后一个Rmarkdown文件是实验的说明文件, 仅用于交流之用, 并不干涉实验本身的进行。

打开 experiment 文件夹,可以看到里面有jspsych 文件夹(jspsych的源文件), jspsychr文件夹,和一个网页文件以及一个Rmarkdown文件.

我们只需要操作index.Rmd来编写实验程序即可,其他都不需要理会。另外,如果需要引用本地图片,可以将图片打包至一个文件夹放到experiment 文件夹下以方便实验引用。

现在,打开index.Rmd文件。首先,修改一下YAMLheader参数(jspsychr已经设置好了默认值,所以其他的参数不用管),即在css 参数的下方添加self_contained: false


添加这一参数的目的是有时候我们需要引用其他文件,故这里就是在告诉r-markdown生成的网页并不是独立的。

接下来就可以开始正式编写实验或者问卷了。

假设我们要编写一个李克特量表。

首先,要使用jspsychr导入相关插件(plugins),jspsychr在自动生成的模板当中已经为你导入了几个常用插件,你只需要依葫芦画瓢按自己的需要再次导入插件即可。如下图:

注:这里的插件为心理学实验或问卷中特定的模块,比如要编写问卷指导语,可以使用jspsych-instructions 这个插件,所以实验者可以根据自身需要选择预加载的插件,全部插件列表和具体参数可以在jspsych的官网找到,如下图

可以看到,我们导入了jspsych.js(jspsych的核心代码),jspsychr(jspsych转换为R语言的封包) 以及5 个其他插件,它们分别是键盘反应(xxxkeyboard-response.js 实验用,问卷可忽略), 图片键盘反应(image-keyboard-response.js, 实验用,问卷可忽略),全屏插件(xxfullscreen.js)指导语插件(xx-instructions.js)和李克特量表插件(xx-survey-likert.js),如果你只需要编写量表,那么在模板的基础上导入量表插件即可。

接下来就可以开始正式编写了,比如我们要先写一个李克特量表:

它的实现非常简单,只需要定义一个scale变量(如下图scale_1),然后定义一个survey-likert的对象即可(如下图的likert_page, 其他参数如type”,只需要照抄,最后在question参数里填入问题(prompt 参数)和labels(填入scale变量)即可。

实测发现中英文都支持,最后还可以调用randomize_question_order: true 随机问卷条目的顺序). 在完成这些步骤之后,我们需要通过timeline.push(likert_page)把这个量表模块导入到jspsych的时间线(timeline,也是使用jspsych编写心理学实验的核心概念,(详情见https://www.jspsych.org/).



网页显示结果如下图:



之后,我们可以通过设置jspsych.init对象来输出收集的数据。同样,实验者只需要在jspsych.init设置on_finish回调函数即可。

如下图:输入

 jsPsych.data.get().localSave(‘csv’,”filename.csv”), 来输出csv实验数据文件。在结束问卷填写后,你将会在浏览器下载文件夹里面找到生成的数据文件。



以上我们主要探讨了如果使用jspsych编写问卷, 我们同样编写了一个简单按键反应的实验demo。

感兴趣的朋友可以通过访问下面的网页获取所有代码(https://github.com/KiayangQ/demo_exp) 。该demo实验的网络版地址为: https://kiayangq.github.io/demo_exp/ 。

该demo可以通过手机访问但是不能进行行为实验部分(由于没有键盘) 。


Part6
实现问卷或实验网络化


那么怎么把已经编写好的实验或者问卷网络化呢,以下是几个比较成熟的渠道,供各位参考:
渠道: 1.Gorilla (https://gorilla.sc/)
  


渠道2. Pavlovia (https://pavlovia.org/)
  


上面两个网站都是由高校支持建立的专业行为实验和问卷发放平台,都支持jspsych 代码编写的实验挂载(将自己的代码复制粘贴然后根据这些网站自身的document 进行修改即可)。
另外,后者(pavlovia)支持psychopy builder 编写的实验网络化(但不支持纯代码编写的psychopy实验网络化)。
渠道3.自建后端数据库(http://www.psiturk.org/
可能你已经注意到了,上面两个平台都要收费。如果想免费挂载自己的网页端行为实验,需要自建一个后端数据库, psiturk 提供了一个良心的教程手把手教你免费建一个后端(基于Amazon Web Services), 如果你的经费有限, 可以考虑下面这个tutorial (http://www.psiturk.org/)。
PS:后台回复关键词线上实验教程即可获得所述的原始文献及相关教程啦!


文章转载自:荷兰心理统计联盟
本文作者:覃恺洋排版:喵君姐姐


参考文献及相关网址:【1】deLeeuw, J. R., & Motz, B. A. (2016). Psychophysics in a Web browser? Comparing response times collected with JavaScript and Psychophysics Toolbox in a visual search task. Behavior Research Methods, 48(1), 1-12.

【2】Pinet, S. , Zielinski, C. , S Mathôt, Stéphane Dufau, & F.-X, A. . (2017). Measuring sequences of keystrokes with jspsych: reliability of response times and interkeystroke intervals. Behavior Research Methods, 49(3), 1163-1176.

【3】jsPsych网页:https://www.jspsych.org/【4】jspsych app:http://builder.jspsych.org【5】jaysire:https://github.com/djnavarro/jaysire【6】xprmtnr:https://github.com/djnavarro/xprmntr【7】de代码:https://github.com/KiayangQ/demo_exp【8】demo网络版: https://kiayangq.github.io/demo_exp/ 【9】网络化渠道Gorilla 网址:https://gorilla.sc/【10】网络化渠道Pavlovia官网:https://pavlovia.org/【11】自建后端数据库指南网址:http://www.psiturk.org/



E-Prime教程 | 打mark标记
第0期:psychopy coder入门
第1期 | psychopy:数据类型及运算符
第2期 | psychopy:从Stroop看条件与循环

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存