OpenSesame
Rapunzel Code Editor
DataMatrix
Support forum
Python Tutorials
MindProbe
OpenSesame videos
Python videos
Supported by

威斯康星卡片分类测验

基本步骤

/pages/zh/tutorials/img/wcst-python/wcst.png

Figure 1. 威斯康星卡片分类测验(WCST)是对执行功能的神经心理测试。

在本教程中,您将实现威斯康星卡片分类测验(WCST)。您还将学习如何在实验中嵌入Python代码。(关于此任务的OSWeb实现,请参阅此教程)。

在WCST中,参与者会看到四张刺激卡片,这些卡片在三个维度上有所不同:颜色(红色、绿色、蓝色、黄色)、形状(圆形、星形、三角形、十字形)以及图形数量(一、二、三或四)。参与者还会看到一张回应卡片,该卡片也有颜色、形状和数量。

参与者的任务是根据特定维度(例如颜色)或 匹配规则 将响应卡与正确的刺激卡进行匹配。最初,参与者不知道要在哪个维度上进行匹配,他们的任务是通过试误来找出匹配规则。

为了增加难度,在每五个正确响应之后,匹配规则都会发生变化。因此,参与者需要灵活地更新匹配规则。

步骤1:下载并启动OpenSesame

OpenSesame适用于Windows、Linux和Mac OS。本教程适用于OpenSesame 4.0或更高版本。

启动OpenSesame后,您可以选择模板实验,并且(如果有的话)会看到最近打开的实验列表(参见Figure 2)。

/pages/zh/tutorials/img/wcst-python/start-up.png

Figure 2. 启动时的OpenSesame窗口。

Extended template 对于创建使用区块试验结构的许多实验来说是一个很好的起点。然而,在本教程中,我们将从头开始创建整个实验,我们将使用已经加载的 "default template"(默认模板)(Figure 3)。所以,只需关闭 "Get started!" 和(如果显示) "Welcome!" 标签。

/pages/zh/tutorials/img/wcst-python/default-template.png

Figure 3. 在概述区域中看到的“默认模板”的结构。

步骤2:添加block_loop和trial_sequence

默认模板提供了三个项目:一个名为 getting_startednotepad,一个名为 welcomesketchpad以及一个名为 experimentsequence项目。我们不需要 getting_startedwelcome,因此立即将它们删除。要执行此操作,请右键单击这些项目并选择“删除”。不要删除 experiment,因为它是实验的入口(即实验开始时调用的第一个项目)。

我们的实验将具有非常简单的结构。在层次结构的顶部是一个loop,我们将其命名为 block_loopblock_loop 是我们定义自变量的地方。要将 loop 添加到实验中,请将 ITEM 工具栏上的 loop 图标拖到概览区域的 experiment 项目上。

一个loop项目需要另一个项目来运行;通常情况下,以及在这种情况下,这是一个sequence项目。将ITEM 工具栏上的 sequence 图标拖到概览区域中的 new_loop 上。OpenSesame会询问您是否要将sequence插入到loop中还是插入到loop后。选择 "插入到new_loop"。

默认情况下,项目的名称如 new_sequencenew_loopnew_sequence_2 等。这些名称并不具有很好的信息性,因此最好对它们进行重命名。项目名称必须由字母数字字符和/或下划线组成。要重命名项目,请双击概览区域中的项目。将 new_sequence 重命名为 trial_sequence 表示它将对应一个试验。将 new_loop 重命名为 block_loop,表示它将对应一个试验区块。

最后,点击"New Experiment"以打开"General Properties "标签。点击实验的标题,将其重命名为"威斯康星卡片分类测验"。

实验的概述区域现在看起来如在Figure 4

/pages/zh/tutorials/img/wcst-python/basic-structure.png

Figure 4. 第2步结束时的概述区域。

步骤3:导入图片和声音文件

对于这个实验,我们将使用扑克牌的图片。您可以从这里下载:

下载 stimuli.zip 文件并将其解压缩到某个地方(例如您的桌面)。接着,在OpenSesame中,点击主工具栏上的“显示文件池”按钮(或:菜单→视图→显示文件池)。这将在窗口右侧显示文件池。将刺激物从桌面(或您解压缩文件的地方)拖到文件池中是将刺激物添加到文件池中的最简单方法。另外,您可以点击文件池中的“+”按钮,然后使用出现的文件选择对话框添加文件。文件池将自动保存在您的实验中。

添加完所有刺激物后,您的文件池看起来如在Figure 5

/pages/zh/tutorials/img/wcst-python/file-pool.png

Figure 5. 包含刺激物的文件池。

步骤4:创建一个静态的纸牌展示

首先,我们将创建一个带有四张刺激卡片和一张响应卡片的显示。然而,现在,显示的卡片并不取决于变量;也就是说,我们将创建一个静态显示。

sketchpad拖到 trial_sequence,并将其重命名为 card_display。使用图像工具在显示器顶部附近的水平行中绘制四张卡片;这些将是刺激卡。在显示器底部附近画一张卡片;这将是响应卡。还可以添加一些文本来告诉参与者他或她需要做什么,即按 abcd 指示哪张刺激卡与响应卡匹配。具体的文本、布局和卡片由您决定!提示:您可以使用 scale 选项调整卡片的大小;您可以通过点击实验的顶层项目打开通用属性选项卡,从而更改背景颜色。

对我来说,结果看起来是这样的:

/pages/zh/tutorials/img/wcst-python/static-cards.png

Figure 6. 具有静态定义卡片的 sketchpad

步骤5:使响应卡片可变

现在我们总是显示相同的响应卡片(上例中的蓝色三角形)。但是,我们当然希望在每个试验中显示不同的响应卡片。为此,我们首先需要定义决定我们将显示哪张响应卡片的变量。我们将在 block_loop中进行此操作。

打开 block_looploop表现在是空的。为了确定响应卡片的颜色、形状和数字,我们可以手动创建三列( response_color,response_shaperesponse_number)以及64行,以涵盖所有颜色、形状和数字的组合。但这将是很多工作。相反,我们将使用全因素设计向导,您可以通过单击“全因素设计”按钮打开它。(全因素设计是一种所有可能的变量水平组合都会发生的设计。)在此向导中,为其中的三个变量创建一列,然后在下面的单元格中输入该变量的可能值(见Figure 7)。

/pages/zh/tutorials/img/wcst-python/design-wizard.png

Figure 7. 全因素设计向导可让您轻松生成与全因素设计相对应的大型loop表。

接下来,点击确定按钮。 block_loop 现在包含颜色、数字和形状的所有64种组合(参见Figure 8)。

/pages/zh/tutorials/img/wcst-python/loop-table-1.png

Figure 8. 第5步结束时的 block_loop

现在回到 card_display。OpenSesame中的每个项目都是通过脚本定义的。这个脚本是由用户界面自动生成的。有时候直接编辑这个脚本是很方便的(甚至必要的),我们现在也需要这样做!

要查看脚本,请单击“查看”按钮,然后选择“查看脚本”。 (查看按钮位于项目控件右上角的中间按钮。)这将打开一个脚本编辑器。

card_display 的脚本主要由 draw 命令组成,这些命令定义了五张卡片以及各种文本元素。找到与响应卡对应的行。您可以通过查看 Y 坐标(应为正数,即显示器的下方)或查看图像文件的名称来找到它。

draw image center=1 file="1-blue-triangle.png" scale=0.5 show_if=always x=0 y=192 z_index=0

现在,在我的例子中,响应卡的图像文件总是“1-blue-triangle.png”。但当然我们并不总是想展示一个蓝色的三角形。相反,我们希望图像文件取决于我们在 block_loop 中定义的变量。为此,请用 {response_number} 替换数字,用 {response_color} 替换颜色,用 {response_shape} 替换形状:(方括号表示这些是变量名)

draw image center=1 file="{response_number}-{response_color}-{response_shape}.png" scale=0.5 show_if=always x=0 y=192 z_index=0

单击应用以接受对脚本的更改。响应卡现在已被问号图标替代。这是因为OpenSesame不知道如何显示使用变量定义的图像的预览。但不用担心:当您运行实验时,图像将显示出来!

步骤6:使刺激卡片变量

刺激卡片应大致随机选择,但每个颜色、形状和数字只能出现一次;也就是说,永远不会出现两张红色卡片或两张带有三角形的卡片。(如果有,匹配过程会变得模棱两可。)为了实现这一点,我们可以使用水平洗牌,这是loop项目中一个功能强大但不寻常的特性。

首先,打开 block_loop,并创建12个(!)新列来定义刺激卡片:color1,用于第一张卡片的颜色,color2color3color4,以及shape1shape4,和number1number4。每个列在每一行上都有相同的值(参见 Figure 9)。

/pages/zh/tutorials/img/wcst-python/loop-table-2.png

Figure 9. 步骤6中的 block_loop

但我们还没有完成!现在,第一张刺激卡总在一个红色圆圈中,第二张为两个蓝色三角形,等等。要对此进行随机化,我们告诉OpenSesame随机交换四个颜色变量、四个形状变量和四个数字变量的值。为此,请打开 block_loop 的脚本。在倒数第二行(在 run trial_sequence 之前)添加以下命令:

shuffle_horiz color1 color2 color3 color4
shuffle_horiz shape1 shape2 shape3 shape4
shuffle_horiz number1 number2 number3 number4

单击应用以接受脚本。要查看是否有效果,单击预览按钮。这将显示在实验中如何随机化loop表格的预览。看起来不错吗?

现在回到 card_display,并让第一张刺激卡的图像根据变量color1shape1number1,其他刺激卡也类似。 (如果您不确定如何操作,请重新查看步骤5。)

步骤7:确定正确的响应(对于一个匹配规则)

暂时我们假定参与者始终按照形状进行匹配。(在Extra Assignments中要求对此进行改进。)

现在,card_display 的持续时间设为 “keypress”。这意味着 card_display 会一直显示,直到按下一个键,但它无法控制如何处理这个按键。因此,请将持续时间更改为0,并在 card_display 之后直接插入 keyboard_response。将 keyboard_response 重命名为 press_a,并指定正确响应为 'a' 以及允许的响应为 'a; b; c; d'。

/pages/zh/tutorials/img/wcst-python/press-a.png

Figure 10. 在第7步中定义的一个 keyboard_response 项目。

但这还不够!现在有一个单一的响应项目,它假定正确的响应始终为 'a'。我们尚未指定正确响应为 'a' 的条件,也没有考虑正确响应为 'b','c' 或 'd' 的试验。

为了实现这一点,首先创建三个更多的 keyboard_response 项目:press_bpress_cpress_d。除了为每个项目单独定义的正确响应之外,它们都是相同的,分别应为'b','c'和'd'。

最后,在 trial_sequence 中,使用 Run If 语句来决定在什么条件下应执行四个 keyboard_response 项目中的每一个(从而决定正确的响应是什么)。对于 press_a,条件是 shape1 应该等于 response_shape。为什么?那是因为这意味着第一个刺激卡片的形状等于响应卡片的形状,在这种情况下,正确的响应是 'a'。这个条件对应于以下的 run-if 语句:shape1 = response_shape。其他 keyboard_response 项目的 run-if 语句类似(见Figure 11)。

/pages/zh/tutorials/img/wcst-python/trial-sequence-1.png

Figure 11. 第 7 步结束时的 trial_sequence

步骤8:给参与者提供反馈

只要已经指定了正确的响应(正如我们在第 7 步所做的那样),OpenSesame 会自动记录响应是正确还是错误,通过将变量 correct 分别设为 1 或 0。我们可以利用这个功能向参与者反馈他们是否做出了正确的答案。

为此,在 trial_sequence 中添加两个新的sketchpad,并将它们命名为 correct_feedbackincorrect_feedback。然后,使用 run-if 语句确定应执行哪一个(见Figure 12)。

/pages/zh/tutorials/img/wcst-python/trial-sequence-2.png

Figure 12. 第 8 步结束时的 trial_sequence

最后,在这两个sketchpad中添加一些有用的内容。例如,对于 correct_feedback,您可以使用一个绿色的注视点,对于 incorrect_feedback,您可以使用一个红色的注视点,两者都显示 500 毫秒(将 sketchpad 的持续时间设置为 500)。彩色圆点是提供反馈的一种不显眼的方式。

步骤9:测试实验

至此,您已经创建了一个基本(但不完整!)的威斯康星卡片分类测试实现(您将在下面的额外作业中完成实现)。

要测试实验,点击快速运行按钮(蓝色双箭头)或全屏运行按钮(绿色箭头)。

Extra assignments

额外1(简单):添加记录器

OpenSesame 不会自动记录数据,而是需要您在实验中显式添加 logger 项目。在基于试验的实验中,logger 通常是 trial_sequence 的最后一个项目,这样就可以记录试验过程中收集的所有数据。

现在,我们的 WCST 没有记录任何数据。是时候解决这个问题了!

额外2(简单):查看数据文件

完成额外1才能进行

给实验做一个简短的测试运行。现在在 Excel,LibreOffice Calc 或 JASP 这样的程序中查看日志文件。确定相关变量,并思考如何分析结果。

提示:block_loop的重复值设置为0.1,以在测试期间减少试验次数。

额外任务 3(简单):添加说明和再见屏幕

一个好的实验需要附带明确的说明。而一个有礼貌的实验在参与者完成时要向他们说再见。您可以使用sketchpad来实现这一点。

额外任务 4(中等难度):通过Python内联脚本设置正确的响应和匹配规则

要在OpenSesame中包含Python脚本,您可以使用inline_script项目。

到目前为止,匹配规则始终是通过形状进行匹配。要更改此设置,在实验开始处添加一个inline_script项目,并使用以下脚本(在准备阶段)随机设置变量matching_rule为'shape'、'number'或'color'。

import random

matching_rule = random.choice(['shape', 'number', 'color'])

现在,在trial_sequence开始时添加另一个inline_script项目。 在准备阶段,添加一个脚本将correct_response变量设置为'a'、'b'、'c'或'd'。 为此,您需要一系列if语句,它们首先查看匹配规则,然后查看哪个形状与响应形状相对应(对于形状匹配规则)或哪个颜色与响应颜色相对应(对于颜色匹配规则)等。

为了开始实现这一点,这里是部分解决方案(但需要完善!):

if matching_rule == 'shape':
    if shape1 == response_shape:
        correct_response = 'a'
    # 还没完成
# 还没完成

# 让我们将一些信息打印到调试窗口
print('matching_rule = {}'.format(matching_rule))
print('correct_response = {}'.format(correct_response))

额外任务 5(困难):定期更改匹配规则

到目前为止,匹配规则在实验开始时随机确定,但在实验过程中保持不变。在真正的WCST中,匹配规则会定期更改,通常是在参与者做出固定次数的正确响应后更改。

要实现这一点,您需要另一个inline_script。以下是一些入门要点:

  • 使用一个计数器变量,在正确响应后递增1,在错误响应后重置为0。
  • 在更改匹配规则时,请确保它不是(偶然)再次设置为相同的匹配规则。

额外任务 6(非常困难):限制响应卡

目前,响应卡可以在多个维度上与刺激卡重叠。例如,如果其中一个刺激卡是一个蓝色圆圈,响应卡可能是两个蓝色圆圈,从而在颜色和形状上都重叠。在真正的WCST中,响应卡与每个刺激卡重叠的维度不得超过一个。

这一次就由你来完成,不再给出指示了!

解决方案

您可以从以下链接下载完整的实验,包括额外任务的解决方案:

Supported by