简介这份资源是E-prime系列课程的第五讲配套样例包面向心理学、认知神经科学等方向需要开展计算机化行为实验的研究生与科研人员帮助解决实验设计中移动窗口、多字符反应、随机方位、N-back、双任务等常用技术难以落地的问题。压缩包共46个文件约4.2MB以es3实验文件、ebs3脚本、edat3数据文件、wndpos窗口位置文件、xml实验顾问报告及xsl样式表、txt说明和jpg示例图片为主覆盖从实验搭建到数据记录的完整环节。内容预览显示样例涵盖移动窗口技术、多字符反应问题、随机方位实验设计、同种材料不连续出现设计、鼠标选择实验技术、lnLine呈现刺激的反应时记录、N-back工作记忆实验设计及双任务实验设计等典型范式每个样例均配有可运行的实验文件与数据记录便于读者直接打开参考、修改复用。目前已有623人学习下载适合希望快速掌握E-prime实验设计常用技术、对照样例查漏补缺的读者。1. 从一份 E-prime 实验设计样例包说起它到底能帮你省下多少试错时间如果你正在用 E-prime 做心理学实验大概率经历过这样的场景Stroop 任务写完了发现反应时记录多了几十毫秒的延迟Go/No-go 范式跑通了但被试中途按错键导致整个 block 数据作废想加一个练习阶段结果 List 和 Procedure 的嵌套逻辑绕得自己都晕。E-prime 这个工具入门容易但真正要把实验设计做得干净、数据采得准、后期能直接导出分析中间隔着一堆没人明说的细节。这份「E-prime 系列课程 5实验设计常用技术」的样例包就是冲着这些细节来的。它不是一份从零开始的语法教程而是一组已经跑通的实验设计文件覆盖了心理学实验里最常出现的几种范式结构。适合谁适合已经能打开 E-prime、能拖几个控件、但一遇到复杂嵌套和刺激呈现时序就心里没底的人。你拿到的不只是几个 .es 文件而是一套可以拆开看内部逻辑的参照系。2. 拆开样例包E-prime 实验设计的核心结构与文件组织2.1 一个可运行的 E-prime 实验由哪些文件构成E-prime 实验的工程文件通常以 .es 为扩展名但真正跑起来的时候E-prime 会在同目录下生成或依赖若干配套文件。常见的有 .ebsE-Basic 脚本文件记录底层代码、.txt 或 .edat2数据输出文件、以及刺激材料文件夹图片、音频、视频。这份样例包里的结构我一般会先看三样东西主 .es 文件的 SessionProc 里挂了什么List 控件里放了哪些属性以及有没有独立的 Practice 阶段。很多新手拿到别人的实验文件直接双击运行结果报错说找不到图片路径就是因为刺激材料的相对路径没有跟着一起搬。样例包在这方面做了整理刺激材料统一放在子文件夹里.es 文件里用的是相对路径引用。你如果要移植到自己的实验里记住一个原则先建好文件夹结构再把 .es 文件放进去最后改路径。顺序反了E-prime 的路径检查会让你反复翻车。2.2 从 SessionProc 到 TrialProc实验流程的层级逻辑E-prime 的实验流程是一个树状结构。最顶层是 SessionProc它决定整个实验分几个阶段指导语、练习、正式实验、结束语。每个阶段往下挂一个 Procedure比如练习阶段挂 PracticeProc正式实验挂 BlockProc。BlockProc 里再挂 List 控件List 里定义每个 trial 的条件。TrialProc 才是真正控制单个试次内刺激呈现时序的地方。这份样例包的价值在于它把几个常用范式的层级关系直接摆出来了。比如在 Flanker 任务里TrialProc 里依次是注视点 500ms、刺激呈现直到反应、空屏 500ms、反馈 500ms。每个控件的 Duration 和 EndAction 设置都有讲究。Duration 设成 -1 表示无限等待直到被试按键才结束EndAction 设成 Terminate 表示按键后立即终止当前控件跳到下一个。如果你把刺激控件的 Duration 设成固定值比如 2000ms那被试在这 2000ms 内按键E-prime 会记录反应时但刺激不会立刻消失这就会污染后续的时序。样例包里所有需要按键反应的控件Duration 都是 -1EndAction 都是 Terminate这是标准做法。2.3 List 控件的属性设置Weight、Cycle 与 Nested ListList 是 E-prime 里最容易被低估的控件。很多人只会在 List 里填几行刺激然后让它按顺序跑。但 List 的 Weight 属性可以控制每个条件的呈现概率Cycle 属性可以控制整个 List 重复几轮。更关键的是 Nested List你可以在一个 List 里嵌套另一个 List实现「每个被试看到所有条件但顺序随机」或者「被试间设计每个被试只看到一部分条件」。这份样例包里有一个 Go/No-go 范式的设计Go 刺激和 No-go 刺激的比例是 7:3就是通过 List 的 Weight 属性实现的。具体操作是在 List 里建两行一行是 Go 刺激Weight 设成 7一行是 No-go 刺激Weight 设成 3。E-prime 会按权重随机抽取保证每个 block 里 Go 和 No-go 的比例大致符合预期。如果你不知道 Weight 这个属性可能会手动复制粘贴 70 行 Go 和 30 行 No-go不仅费时而且一旦要改比例就得全部重来。List 控件关键属性速查 - Weight控制该行被抽取的相对概率默认 1 - Cycle整个 List 重复执行的次数默认 1 - Reset/Exit控制 List 何时重置或退出 - Nested List在 List 中嵌套另一个 List实现多层随机提示Weight 是相对值不是百分比。如果你设了 7 和 3实际比例是 70% 和 30%如果你设了 14 和 6比例一样但总 trial 数会翻倍。3. 把样例跑起来从打开文件到采集第一组数据3.1 环境检查与文件路径修复拿到样例包后第一步不是直接双击 .es 文件而是先确认 E-prime 版本。E-prime 2.0 和 3.0 在文件格式上有差异2.0 的 .es 文件在 3.0 里打开可能会提示转换转换后部分控件属性会重置。如果你用的是 3.0建议先备份原始文件。确认版本后把整个样例文件夹复制到本地硬盘不要放在 U 盘或网络驱动器里运行E-prime 对路径稳定性要求很高网络延迟会导致刺激呈现时间抖动。然后打开 E-prime选择 File Open找到 .es 文件。如果提示找不到刺激材料检查 .es 文件里引用的路径是绝对路径还是相对路径。样例包里用的是相对路径比如Stimuli\image1.jpg你只需要保证 Stimuli 文件夹和 .es 文件在同一目录下即可。# 推荐的文件夹结构 Experiment/ ├── Flanker_Task.es ├── Stimuli/ │ ├── congruent/ │ ├── incongruent/ │ └── fixation.png └── Data/ └── (运行后自动生成)3.2 运行前必须检查的五个参数在点击 Run 之前有五个参数我每次都会过一遍。第一Screen 控件的 Refresh Rate 是否和显示器实际刷新率一致。E-prime 默认 60Hz但很多显示器是 144Hz 或 165Hz如果不改刺激呈现时间会按 60Hz 计算实际呈现时间比你设定的短。第二PreRelease 属性。这个属性控制 E-prime 提前多久加载下一个刺激默认是 0但在图片刺激较多时设成 1 或 2 可以避免加载延迟导致的时序抖动。第三Data Logging 里是否勾选了正确的变量。反应时、正确率、刺激类型这些都要勾上否则后期分析时发现数据里缺列只能重跑。第四Input Device 里键盘或反应盒的端口设置。如果是外接反应盒要确认端口号和 E-prime 里一致。第五Practice 阶段是否设置了正确的退出条件。有些样例的练习阶段是固定 trial 数有些是正确率达标才退出这个逻辑在 PracticeProc 的 List 里控制。运行前检查清单 1. Screen.RefreshRate 显示器实际刷新率 2. 刺激控件.PreRelease 1图片多时 3. Data Logging 勾选RT、ACC、StimType、Block 4. Input Device 端口与硬件一致 5. Practice 退出条件固定 trial 或正确率阈值3.3 数据导出与初步校验实验跑完后E-prime 会在 Data 文件夹里生成 .edat2 文件。这个文件不能直接拖进 SPSS需要先导出成 Excel 或 CSV。在 E-prime 里选择 E-DataAid File Export选择需要的变量导出格式选 CSV。导出后我一般会先做三件事第一看总 trial 数是否和设计一致。如果少了可能是被试中途按了 Esc 退出或者某个 List 的 Cycle 设错了。第二看反应时的分布。如果出现大量 0ms 或超过 2000ms 的反应时说明被试可能没认真做或者刺激呈现有问题。第三看正确率。如果某个条件的正确率低于 50%要么是刺激难度太高要么是按键映射写反了。样例包里有一个数据校验的 E-Basic 脚本片段可以在实验结束后自动计算每个 block 的正确率如果低于阈值就弹出提示。这个脚本在 .ebs 文件里你可以直接复制到自己的实验里。 E-Basic 片段实验结束后计算正确率 Dim totalTrial As Integer Dim correctTrial As Integer Dim acc As Double totalTrial 0 correctTrial 0 遍历所有 trial 数据 假设正确反应存在 Correct 变量中 If Correct 1 Then correctTrial correctTrial 1 End If totalTrial totalTrial 1 acc correctTrial / totalTrial If acc 0.5 Then MsgBox 正确率低于 50%请检查实验设计或被试状态 End If注意E-Basic 脚本在 E-prime 3.0 里需要放在 User Script 区域不是每个控件都能直接调用。如果你不熟悉 E-Basic可以先跳过脚本手动在 E-DataAid 里筛选。4. 避坑指南E-prime 实验设计里最容易翻车的五个地方4.1 刺激呈现时间不准Refresh Rate 与 PreRelease 的联动现象你设定了刺激呈现 200ms但实际记录的反应时分布异常或者刺激在屏幕上停留的时间明显不对。原因E-prime 默认按 60Hz 计算刷新周期如果你的显示器是 144Hz每个刷新周期是 6.94ms而不是 16.67ms。E-prime 会按 60Hz 的周期去凑你设定的时间导致实际呈现时间偏差。另外PreRelease 设成 0 时E-prime 在刺激呈现前才开始加载图片如果图片较大加载时间会挤占呈现时间。解决在 Screen 控件里把 RefreshRate 改成显示器实际值在刺激控件的 PreRelease 属性里设成 1 或 2让 E-prime 提前加载。如果还是不准可以用 Photodiode 或示波器实测但一般心理学实验用软件校准就够了。4.2 List 嵌套逻辑混乱Nested List 的 Reset 与 Exit 条件现象实验跑起来后某些条件重复出现或者某个 block 提前结束。原因Nested List 的 Reset 和 Exit 条件没设对。比如外层 List 的 Cycle 设成了 2内层 List 的 Reset 设成了 Never那内层 List 只会跑第一轮第二轮直接跳过。解决记住一个原则——外层 List 控制 block 数内层 List 控制 trial 数。外层 List 的 Cycle 设成 block 数内层 List 的 Cycle 设成每个 block 的 trial 数。内层 List 的 Reset 设成 Each Cycle保证每个 block 都重新随机。Exit 条件一般设成 Never除非你有特殊需求。4.3 按键映射写反Input Device 与 Correct 变量的对应现象数据导出来后正确率极低但被试反馈说「我都是按对的」。原因在 TrialProc 里Correct 变量的赋值和实际按键映射反了。比如你让被试看到「F」按左键看到「J」按右键但在 E-prime 里把左键设成了 Correct 1右键设成了 Correct 0。解决在 TrialProc 的 Feedback 控件之前加一个 InLine 脚本打印出被试的按键和 Correct 值跑几个 trial 看看。或者直接在 E-DataAid 里看原始按键记录和你的设计对照。这个坑很隐蔽因为被试往往不会主动说「我觉得你按键设反了」他们只会按自己的理解去按。4.4 数据文件缺失变量Data Logging 的勾选遗漏现象实验跑完了导出数据发现没有反应时列或者没有刺激类型列。原因在 Experiment Object 的 Data Logging 里没有勾选对应的变量。E-prime 默认只记录一部分变量像 StimType、Block、Condition 这些自定义变量需要手动勾选。解决在实验设计阶段就把所有需要分析的变量列出来然后在 Data Logging 里逐一勾选。如果已经跑完了才发现缺变量只能重跑。所以我在每次正式实验前都会先跑一个被试的 pilot导出数据检查列是否齐全。4.5 练习阶段与正式阶段的数据混淆现象导出数据后发现练习阶段的 trial 和正式阶段的 trial 混在一起分析时不知道哪些该剔除。原因练习阶段和正式阶段用了同一个 List或者 Data Logging 里没有区分阶段的变量。解决在 SessionProc 里练习阶段和正式阶段挂不同的 Procedure每个 Procedure 里加一个 InLine 脚本给数据打上 Phase 标签。比如练习阶段设 Phase Practice正式阶段设 Phase Formal。导出数据后按 Phase 筛选即可。样例包里有一个专门的 Practice 文件夹里面的 .es 文件就是独立练习阶段的写法你可以直接参考。5. 进阶技巧用 E-Basic 脚本实现条件随机与数据预处理5.1 用 InLine 脚本控制条件随机化E-prime 的 List 控件自带随机化功能但有时候你需要更复杂的随机逻辑。比如「每个 block 里Go 刺激和 No-go 刺激的比例固定但顺序完全随机且不允许连续三个 Go 刺激」。这种需求List 的 Weight 属性做不到需要用 E-Basic 脚本。常见做法是在 List 里把所有 trial 按顺序放好然后在 List 的 Before 事件里加一个 InLine 脚本用数组打乱顺序再按打乱后的顺序执行。下面是一个简化的示例假设你有 10 个 trial编号 1 到 10你想打乱顺序但不允许连续三个相同类型。 E-Basic 脚本打乱 trial 顺序避免连续三个相同条件 Dim trialList(1 To 10) As Integer Dim i As Integer, j As Integer, temp As Integer Dim lastType As String, repeatCount As Integer 初始化 trial 类型假设奇数 trial 是 Go偶数 trial 是 No-go For i 1 To 10 trialList(i) i Next i 简单的 Fisher-Yates 打乱 Randomize For i 10 To 2 Step -1 j Int((i - 1 1) * Rnd 1) temp trialList(i) trialList(i) trialList(j) trialList(j) temp Next i 检查连续三个相同类型如果出现则重新打乱 这里省略具体检查逻辑实际使用时需要循环直到满足条件这段脚本的核心是 Fisher-Yates 打乱算法E-Basic 里用 Rnd 函数生成随机数。参数说明trialList 数组存储 trial 编号i 和 j 是循环变量temp 用于交换。注意 E-Basic 的数组下标默认从 1 开始不是 0。如果你不熟悉 E-Basic可以先在 List 里手动打乱但一旦 trial 数超过 50手动打乱基本不可行。5.2 数据预处理在 E-prime 里完成反应时剔除很多人在导出数据后才在 Excel 或 R 里做反应时剔除。但其实 E-prime 的 E-Basic 脚本可以在实验过程中就完成初步剔除。比如「反应时小于 200ms 的 trial 标记为无效」「反应时大于 3 个标准差的 trial 标记为异常」。这样导出的数据里直接带一个 Valid 列后期分析省事。下面是一个示例脚本放在 TrialProc 的 After 事件里。 E-Basic 脚本标记异常反应时 Dim rt As Double Dim valid As Integer rt ReactionTime 假设 ReactionTime 是 E-prime 内置变量 valid 1 If rt 200 Then valid 0 End If 假设你已经计算了平均反应时和标准差 这里用固定阈值 3000ms 作为示例 If rt 3000 Then valid 0 End If 将 valid 写入数据文件 需要在 Data Logging 里添加 Valid 变量参数说明ReactionTime 是 E-prime 内置的反应时变量单位是毫秒。valid 是自定义变量需要在 Data Logging 里勾选。阈值 200ms 和 3000ms 是常见做法但具体值要根据实验任务调整。比如简单检测任务可以用 150ms复杂决策任务可以用 300ms。这个脚本的好处是数据导出后直接按 Valid 列筛选不用再写额外的预处理代码。5.3 用 E-Basic 实现自适应阶梯设计自适应阶梯Staircase是心理物理学实验里常用的方法比如测阈值。E-prime 本身没有内置的阶梯控件但可以用 E-Basic 脚本实现。核心逻辑是根据被试的反应动态调整下一个 trial 的刺激强度。比如「连续两次正确强度降低一档一次错误强度升高一档」。这个逻辑需要维护一个强度变量并在每个 trial 结束后更新。样例包里有一个简单的阶梯设计示例强度变量存在一个全局变量里每次 trial 结束后用 If 语句判断。如果你要做更复杂的阶梯比如 3-down-1-up逻辑类似只是判断条件变成「连续三次正确才降档」。 E-Basic 脚本简单 2-down-1-up 阶梯 Dim intensity As Integer Dim correctCount As Integer 初始化 intensity 10 初始强度 correctCount 0 在每个 trial 结束后调用 If Correct 1 Then correctCount correctCount 1 If correctCount 2 Then intensity intensity - 1 correctCount 0 End If Else intensity intensity 1 correctCount 0 End If 将 intensity 写入下一个 trial 的刺激控件 需要在 TrialProc 的 Before 事件里读取 intensity参数说明intensity 是刺激强度可以是音量、亮度、对比度等。correctCount 记录连续正确次数。2-down-1-up 的意思是连续两次正确降一档一次错误升一档。这个规则收敛到 70.7% 正确率。如果你要收敛到其他正确率可以改成 3-down-1-up 或 1-down-1-up。注意阶梯设计需要足够的 trial 数才能收敛一般至少 50 个 trial。5.4 验证脚本是否生效用 Pilot 数据快速检查写完脚本后不要直接跑正式实验。先跑一个 pilot5 到 10 个 trial 就够。跑完后导出数据检查三件事第一脚本里定义的变量是否出现在数据文件里。如果没有说明 Data Logging 没勾选。第二变量的值是否符合预期。比如 Valid 列应该有 0 和 1Intensity 列应该随 trial 变化。第三实验流程是否正常。脚本里的 If 语句如果写错可能导致实验卡死或跳过 trial。我一般会在脚本里加 MsgBox 调试比如在强度更新后弹出提示确认逻辑正确后再删掉。这个习惯帮我省了很多重跑的时间。从那以后我每次写完 E-Basic 脚本都强制走一遍 pilot 验证确认数据列和逻辑都对了再上正式被试。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?