手把手教你用E-Prime设计Stroop实验:从零到完整代码实现

📅 发布时间:2026/7/8 18:17:26 👁️ 浏览次数:
手把手教你用E-Prime设计Stroop实验:从零到完整代码实现
手把手教你用E-Prime设计Stroop实验从零到完整代码实现最近实验室新来了几位师弟师妹看着他们对着E-Prime界面一脸茫然让我想起了自己当年第一次接触实验编程时的样子。Stroop任务几乎是每个心理学研究者绕不开的经典范式它不仅是检验认知控制的金标准更是我们学习实验设计软件时绝佳的“练手项目”。很多人觉得E-Prime上手难代码逻辑复杂其实关键在于没有找到一个清晰、可复现的路径。今天我就把自己从无数次调试和修改中总结出的经验整理成一份详尽的实战指南。无论你是心理学、认知神经科学方向的研究生还是刚刚开始独立设计行为实验的初级研究者这篇文章都将带你避开我踩过的那些坑一步步构建出一个稳定、可用的Stroop实验程序。1. 实验逻辑拆解与E-Prime项目初始化在打开E-Prime软件之前我们必须像建筑师看蓝图一样把Stroop实验的内在逻辑彻底想清楚。经典的Stroop任务核心在于刺激-反应冲突当词语的语义比如“红”这个字与其书写颜色比如用蓝色墨水书写不一致时被试的反应时会变慢错误率会升高。我们的程序就是要精准地制造并记录这种冲突。一个完整的试次Trial流程通常包括呈现注视点Fixation让被试视线集中。呈现刺激Stimulus即一个用特定颜色书写的颜色词。收集被试的按键反应Response。根据反应的正确与否给予反馈Feedback可选。进入一个空屏Blank作为试次间隔。在E-Prime中我们通常用一个List对象来控制实验的整体流程和变量而用Slide对象来呈现视觉刺激。理解这两者的关系是成功的第一步。提示在开始设计前强烈建议在纸上画出实验的流程图。明确每个屏幕Slide的持续时间、触发条件以及它们之间的跳转关系这能节省你大量后期调试的时间。现在让我们打开E-Prime 3.0开始创建项目。新建项目与设置启动E-Prime选择“新建实验”New Experiment。在弹出的“实验向导”Experiment Wizard中我们可以先选择一个基础模板但为了彻底理解我建议选择“空白实验”Blank Experiment。将实验保存到一个你容易找到的文件夹命名为StroopTask.es3。理解核心对象在左侧的“工具箱”Toolbox中你会看到一系列对象。我们最先需要的是SessionProc这是实验的“总流程”所有其他对象都在这里被调用。List用于定义实验试次的结构和变量。我们可以创建一个List来定义刺激材料。Slide用于构建刺激呈现界面。我们需要创建多个Slide来实现注视点、刺激屏、反馈屏等。配置实验属性双击“Experiment Object”通常位于结构视图顶部打开实验属性窗口。在这里我们需要关注几个关键设置Display Mode: 设置为与你的显示器匹配的分辨率例如1024x768。Color Depth: 确保为True Color (32-bit)以保证颜色准确呈现。Sync To Refresh Rate: 建议勾选这能使刺激呈现与显示器的刷新率同步提高计时精度。完成这些基础设置后我们的E-Prime项目骨架就搭好了。接下来我们要往里面填充血肉——也就是定义实验材料和变量。2. 刺激材料、变量定义与List对象构建Stroop实验的刺激相对规整这正好让我们可以系统地学习E-Prime中变量的定义和使用方法。我们需要两类关键变量一是描述刺激本身的属性如词语内容、颜色二是记录实验过程的因变量如反应时、正确与否。首先我们来创建承载这些变量的List。创建刺激List从工具箱拖拽一个“List”对象到结构视图通常放在SessionProc下方将其重命名为StimList。双击打开它。定义自变量Independent Variables在List的属性表中我们需要添加以下几列Word: 颜色词的内容如“红”、“绿”、“蓝”。InkColor: 词语的书写颜色这里我们需要用E-Prime能识别的颜色名称或RGB值例如“red”, “green”, “blue”。Condition: 试次类型这是一个非常重要的变量用于区分一致条件Congruent词义与颜色相同和不一致条件Incongruent词义与颜色不同。我们可以用“C”和“I”来标记。CorrectResponse: 正确的反应键。例如我们设定“红”按“D”键“绿”按“F”键“蓝”按“J”键那么当InkColor为red时CorrectResponse就应该是“D”。一个简单的StimList内容示例如下WordInkColorConditionCorrectResponse红redCD红blueIJ绿greenCF绿redID蓝blueCJ蓝greenIF注意上表只是一个最小示例。在实际实验中你需要生成足够多的试次并对条件C/I和具体组合进行平衡通常采用伪随机化Nested或完全随机化Random的方式在List属性中设置。设置List运行属性在List的属性窗口中找到Procedure下拉菜单将其指向我们即将创建的试次流程例如TrialProc。在Sampling选项卡下选择你需要的试次抽样方式如随机Random或顺序Sequential并设置Weight试次数或Repeat重复次数。这个StimList就像一个数据表E-Prime在运行时会逐行读取并将每一行的值传递给对应的流程对象。接下来我们就来构建处理每一行数据的流程——试次流程Trial Procedure。3. 试次流程Procedure设计与Slide对象精讲Procedure是E-Prime实验的“剧本”它规定了在一个试次中各个刺激对象如Slide的呈现顺序和逻辑。我们从工具箱拖拽一个“Procedure”对象到结构视图重命名为TrialProc。双击打开后我们会看到一个空白的流程设计界面。现在我们从工具箱向TrialProc中拖入需要的对象并按顺序排列FixationSlide (注视点)拖入一个“Slide”对象重命名为Fixation。双击打开在Slide编辑器中使用“文本”Text工具在屏幕中央创建一个“”号。在Slide的属性中设置Duration持续时间为500-1000毫秒msPreRelease为0。这意味着“”号会精确呈现设定的时间后消失。StimulusSlide (刺激屏)拖入第二个“Slide”对象重命名为Stimulus。这是最核心的屏幕。打开Stimulus创建一个文本对象。关键步骤来了我们需要让这个文本对象的内容和颜色随着StimList中的每一行数据变化。设置文本内容在文本对象的属性中找到Text字段。不要直接输入文字而是点击右侧的[List]按钮然后选择StimList.Word。这样文本内容就会动态绑定到List的Word列。设置文本颜色同样在ForeColor属性中点击[List]按钮选择StimList.InkColor。在Slide属性中将Duration设置为0这代表无限等待。然后在Input Mask输入掩码选项中添加一个键盘输入Keyboard。在键盘输入属性中设置Allowable Keys为你定义的按键如“dfj”并将Timeout超时时间设为2000ms即2秒内无反应则自动跳转。注意将刺激屏的Duration设为0并依赖Input Mask来结束当前屏是E-Prime中收集反应的标准做法。Input Mask会“挂起”流程直到被试按下允许的键或超时。FeedbackSlide (反馈屏可选)拖入第三个“Slide”对象重命名为Feedback。这里我们需要根据被试的反应是否正确来显示不同的内容。这需要用到E-Prime的内嵌代码Inline Object。在Stimulus对象和Feedback对象之间从工具箱拖入一个“Inline”对象。双击打开这是一个可以编写E-Basic代码E-Prime的脚本语言的窗口。我们需要在这里写一段逻辑来判断反应正误并将结果存入一个变量供反馈屏使用。 判断反应是否正确 If Stimulus.Resp StimList.CorrectResponse Then ACC 1 正确ACC赋值为1 FeedbackText 正确 设置反馈文本 Else ACC 0 错误ACC赋值为0 FeedbackText 错误。 设置反馈文本 End If 记录反应时注意引用的是Stimulus这个Slide对象下的RespRT属性 RT Stimulus.RT然后打开FeedbackSlide创建一个文本对象将其Text属性绑定到我们在Inline中定义的变量FeedbackText输入方式[FeedbackText]。设置FeedbackSlide的Duration为500ms。BlankSlide (空屏)拖入最后一个“Slide”对象重命名为Blank。这个Slide什么都不放保持空白。设置其Duration为500-1000ms用于制造试次间的间隔防止疲劳和预期效应。现在TrialProc的流程应该是Fixation-Stimulus-Inline-Feedback-Blank。最后别忘了回到最初的SessionProc将StimList拖入其中这样整个实验才能运行起来。4. 数据记录、调试与常见问题排雷实验能跑起来只是第一步能准确、可靠地记录下我们需要的数据并且程序稳定不报错才是成功的标志。E-Prime的数据记录功能非常强大但配置不当也容易出问题。数据记录配置再次双击顶层的“Experiment Object”。切换到“Data Logging”选项卡。确保“Logging”是启用的。在“Output Files”部分你可以设置数据文件的保存位置和前缀。数据默认会以.edat3和.txt格式保存。最关键的一步是选择要记录哪些变量。点击“Edit Data Logging”。在弹出的窗口中你可以看到所有可记录的变量。确保勾选了我们需要的关键变量来自StimList的Word,InkColor,Condition,CorrectResponse。来自反应输入的Stimulus.RT反应时Stimulus.RESP按下的键。来自我们Inline代码的ACC正确率RT我们赋值后的反应时变量。 将这些变量拖拽到右侧的“Selected”区域。调试Debugging——程序员的日常 即使设计得再仔细第一次运行也难免出错。E-Prime提供了调试工具。运行F7或Run按钮直接运行实验。如果出错会弹出错误信息仔细阅读它通常会告诉你出错的对象和大概原因如变量未定义。生成F5或Generate按钮不运行实验而是检查整个项目的语法和逻辑错误。这是发现潜在问题如对象引用错误的好方法建议在每次大修改后都生成一次。预览Preview在流程设计界面右键点击某个对象如TrialProc选择“Preview”可以快速预览该流程而不运行整个实验非常适合局部调试。我遇到过的典型问题与解决方案错误变量未定义或对象引用无效场景在Inline代码或属性绑定中输入了错误的变量名或对象名。排查检查所有[List]绑定和Inline代码中的拼写。E-Prime对大小写不敏感但名称必须完全一致。确保List中的列名与代码中引用的名称一致。刺激颜色显示不对场景文本没有按InkColor变量显示颜色。排查首先检查StimList中InkColor列的值是否是E-Prime支持的颜色名称如“red”或有效的RGB字符串如“255,0,0”。其次确认在StimulusSlide的文本对象属性中ForeColor是否正确绑定了StimList.InkColor。反应时RT记录为0或空值场景数据文件中RT列全是0或空。排查这通常是因为反应收集的对象不对。确保你在记录和Inline代码中引用的RT是来自正确的Slide对象例如Stimulus.RT。另外检查StimulusSlide的Input Mask是否已正确设置Allowable Keys。实验流程跳转混乱场景屏幕一闪而过或者不按预定顺序呈现。排查逐一检查每个Slide对象的Duration和Input Mask设置。确认Fixation、Feedback、Blank等屏有固定的Duration而Stimulus屏的Duration为0且依赖于Input Mask。检查TrialProc中对象的顺序是否正确。当你的程序能够顺利运行并且数据文件里整齐地记录着每一试次的词、颜色、条件、反应时和正确率时那份成就感是实实在在的。从这个最经典的Stroop任务出发你可以尝试修改List来创建不同的实验条件比如加入中性词可以修改Procedure来增加练习阶段、休息提醒甚至整合声音刺激或外接设备。E-Prime的逻辑一旦打通你会发现设计其他实验范式也变得有章可循。最重要的是亲手从零搭建并调试成功一个实验这种经验远比只看教程或使用现成程序来得深刻。