信息速览
闭上眼睛从三千一百四十一开始,每次减四十二。三千零九十九,三千零五十七,三千零一十五……到第三个数的时候,脑子里的数字开始打滑,你得回去重算一遍。这段体验几乎每个人都有过,但它落在头皮上是什么样子,需要一台放大器才能看见。
基辅的两支团队在 2010 年代初做了一件很朴素的事:让三十六名大学生坐在椅子上,先安静地记录一分钟,再让他们做一分钟连续减法,把这两分钟各留一段六十秒的干净记录。库里没有复杂的范式、没有反馈界面、没有几百个通道,只有这两段被清洗过的脑电,和一张写着年龄、性别、减法次数的表格。
正因为朴素,它成了认知负荷研究里被反复取用的那一份。本篇按官方页面与文件本身的口径把这个库讲清楚:它是什么、结构如何、能做什么、在哪里会失灵。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 全名 | EEG During Mental Arithmetic Tasks |
| 库名缩写 | EEGMAT(MAT 指 Mental Arithmetic Task,不是 .mat 文件) |
| 发布方 | PhysioNet |
| 贡献者 | Igor Zyma、Sergii Tukaev、Ivan Seleznov 等七人 |
| 首次发布 | 2018 年 12 月 17 日,版本 1.0.0 |
| DOI | 10.13026/C2JQ1P |
| 配套论文 | Zyma 等,《Data》2019 年第 4 卷第 1 期,文章号 14 |
| 受试者 | 36 名健康大学生(16 至 26 岁,女 27 男 9) |
| 记录数 | 72 段,每人静息与心算各一段 |
| 每段时长 | 60 秒,官方称无伪迹片段 |
| 采样率 | 500 Hz(页面未写,见文件头) |
| 通道 | 官方称 23 通道系统;文件头 22 路信号(19 脑电 + A2-A1 + 心电 + 标注道另计) |
| 参考 | 互联耳电极 |
| 预处理 | 30 赫兹高通、50 赫兹陷波、独立成分分析去伪迹 |
| 标签 | 段级:静息/心算;受试者级:减法次数与好差分组 |
| 文件格式 | EDF,附 subject-info.csv |
| 体积 | 未压缩 175.1 兆字节 |
| 许可 | ODC-BY 1.0,免注册 |
| 缺什么 | 原始未清洗信号、逐题行为记录、官方划分、采样率说明 |
§1 它要解决的具体麻烦
1.1 心算是最便宜的认知负荷,也是最难量化的
让一个人进入"努力思考"的状态,实验室里有几十种办法:n-back、持续注意、情绪诱发、视觉搜索。它们各有代价——要程序、要显示器、要精密的计时、要经过验证的图片库。
连续减法几乎是所有办法里最便宜的一种。实验员口头给出两个数,受试者开始减,每减一次报一次结果,不需要屏幕,也不需要纸笔。正因为便宜,它在临床神经心理评估里用了几十年,一百减七就是简易精神状态检查的经典题。
便宜的另一面是难以量化。减法的速度取决于数字大小、算术熟练度、旁边有没有人听、错了要不要重来;同一个人在同一分钟里,也可能前半段极快、后半段卡住。这些差异落在脑电上,会和任务本身的效果搅在一起。这个库的贡献,就是把"任务"和"行为"分开记:脑电是两段各六十秒,行为压缩成两个受试者级的数字——四分钟内减了多少次,以及据此分到哪一组。
1.2 三条常见的错误期待
第一条,期待它是一个 .mat 格式的库。 这是库名最容易引发的误读。EEGMAT 的 MAT 来自 Mental Arithmetic Task,官方全名写得很清楚。文件清单里七十二个文件全部是 .edf,加一张逗号分隔表,没有一个是 MATLAB 的二进制 .mat。指望用 scipy.io.loadmat 打开的人,第一步就会卡住。
第二条,期待它包含原始记录。 公开的是清洗后的结果。官方原话是全部记录都是经独立成分分析处理过的无伪迹片段,处理掉的是眼、肌与心搏三类干扰。这带来了极干净的波形,也带走了原始信号:没有原始数据,就没有成分分离矩阵,也就无法比较"我的校正方法"与"他们的校正方法"谁更好。
第三条,期待它有逐题标注。 库里没有任何一个时间点被标成"这一题答对了"或"这一题卡住了"。任务期间只有一条连续六十秒的信号,行为数据在受试者表里是四个数字之一:减法次数。要研究"答错前后脑电怎么变",这个库给不了。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 静息与任务态的两状态对比 | 每人一对严格配对的六十秒记录 | 够,配平设计是它最大的优点 |
| 认知负荷的二分类基线 | 七十二段,标签干净 | 够做基线,跨人泛化难 |
| 频谱与相干分析 | 十九路脑电,耳电极参考,覆盖标准布点 | 够,这正是论文的分析对象 |
| 去趋势波动分析等时间尺度指标 | 六十秒连续片段,五百赫兹 | 够,长度与采样都支持 |
| 伪迹校正方法的比较 | 只有清洗后的结果 | 不够,没有原始信号 |
| 逐题的反应时与正确率 | 只有四分钟的总次数 | 不够,粒度太粗 |
| 个体内重复测量与稳定性 | 每人只有一段任务 | 不够 |
| 老年或临床人群的负荷评估 | 全部是十几到二十几岁的学生 | 不够,一点都没有 |
| 高密度空间滤波与源定位 | 十九路标准布点 | 勉强,只能做粗定位 |
| 在线负荷监测系统的训练 | 离线数据,无时间标签 | 可做离线原型,不能直接上线 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 你要做一个认知负荷检测的原型,手上没有任何数据 | 三十六人、两种状态、标签干净,够跑通管线 | 先按受试者留一做划分,拿到诚实的基线(§5.5) |
| 你在做脑电的频谱与相干分析,需要一个标准练手库 | 十九路标准布点,耳电极参考,处理流程清楚 | 直接复现论文的频段对比,看看结论是否成立 |
| 你在读心算相关的文献,想核对原文的数字 | 原始 EDF 与官方表格一一对应,可逐条核对 | 先打开一段(§4.3 的案例)确认字段含义 |
| 你想比较不同伪迹校正方法 | 它只能当"已经被清洗过"的参照 | 另找一个保留原始信号的库,把本库当上界参照 |
| 你在教学,要讲清楚一次认知实验的完整链路 | 从设备、布点、任务到文件命名,全部有据可查 | 用一段六十秒做演示,学生一次就能看懂 |
| 你需要做跨数据集的外部验证 | 体量小、免注册、格式标准 | 全量 175 兆,一次下完,当外部测试集用 |
| 你要研究不同参考方式的影响 | 耳电极参考已在文件里,脑电为单极导联 | 可以离线换成平均参考或重参考,做对照 |
| 你的课题要求受试者有年龄跨度 | 全部为 16 至 26 岁 | 换库,这里没有年龄分层 |
1.5 一句话判断
它不提供更多数据,而是提供一组配得最齐的对照片:同一个人、同一副电极、同一分钟长度,唯一的差别是算不算题。
1.6 不适合谁:四条边界
不适合拿它证明某类模型"能识别认知负荷"。 三十六个人、每人一对记录,任何在随机划分下取得的高准确率,都要先排除受试者泄漏。在这个库上报一个漂亮的数字很容易,报一个经得起留一受试者检验的数字很难。
不适合拿它做伪迹处理研究。 公开数据已经过独立成分分析,眼电、肌电与心搏成分都不在了。拿它评估一个去伪迹算法,相当于拿一篇已经改过的稿子去测校对软件。
不适合拿它做行为学推论。 行为只剩减法次数,而且是四分钟的总数,没有逐题记录。关于"心算难度如何随进度上升"、"出错后是否变慢"这类问题,库里没有可用的时间序列。
不适合拿它做临床或老年人群的结论。 受试者是基辅一所大学的学生,年龄集中在十八九岁。任何关于老年人认知衰退、注意力缺陷或术后谵妄的推论,都超出了这批数据的边界。
§2 数据构成与规格
2.1 一个扁平目录、七十二个文件
整个库的顶层结构简单到可以用一句话讲完:七十二个 EDF 文件,加上记录清单、校验和、说明文件与一张受试者表。没有子目录,没有分组文件夹,没有按任务或按年份拆开的结构。
文件名只有一种形态:SubjectNN_1.edf 与 SubjectNN_2.edf,NN 从 00 到 35 两位数字。后缀 _1 是任务前静息,_2 是心算。也就是说,受试者编号与段类型完全由文件名编码,读目录就够,不需要先读一张映射表。
| 顶层项 | 体积 | 作用 | 能否省 |
|---|---|---|---|
| Subject00_1.edf 至 Subject35_2.edf | 主体 | 七十二段六十秒记录 | 不能 |
| RECORDS | 1.1 KB | 七十二行文件清单 | 不能,是遍历入口 |
| README.txt | 2.7 KB | 协议、设备、预处理、任务说明 | 不能,是唯一的文字说明 |
| subject-info.csv | 1.0 KB | 受试者级元信息,三十六行 | 不能,标签都在这里 |
| SHA256SUMS.txt | 5.9 KB | 全库校验和 | 建议留,用于完整性核对 |
体积上有一条明显规律:多数 _1 文件是 3.7 兆字节,_2 文件是 1.3 兆字节,少数 _1 只有 1.6 兆字节。官方没有解释差别,它只影响存储,不改变标称时长。
2.2 字段与记录的完整字典
EDF 的头部分成两截:前 256 字节是固定字段,之后每路信号各占 256 字节。官方称系统是 23 通道,而文件头里报告的信号数是 22,头长因此是 256 + 22 × 256 = 5888 字节。以 Subject00 的静息段为例,固定字段的取值如下。
| EDF 固定字段 | 实际取值 | 含义与注意点 |
|---|---|---|
| 版本 | 0 后跟空格 | 标准 EDF 标记 |
| 患者标识 | Subject0 |
只有编号,被截在十六字符以内 |
| 记录标识 | 空 | 未填写运行名 |
| 开始日期 | 01-JAN-1990 | 官方另写了一句:全部文件的记录时间被设为 1 月 1 日 |
| 开始时间 | 0 | 与日期一样,是占位值 |
| 设备标识 | NeuroCom_Professional_3.0.0 |
采集软件与版本 |
| 保留字段 | EDF+C |
声明为连续记录 |
| 数据记录数 | 182 | 每秒一块,每块 500 点 |
| 记录时长 | 1 | 秒,即每个数据记录一秒 |
| 信号数 | 22 | 与官方所称 23 通道差一路 |
设备标识这一栏里另有一段串码 01.01.1100.00.005888,紧挨着还有一句 Startdate 01-JAN-2011。后者可能与实际的采集年份有关,但它是软件写入的自由文本,官方没有把它作为字段来解释,读取时不宜当成可靠日期。
每路信号再占 256 字节,字段顺序固定。把 22 路拆开来看,构成如下。
| 信号组 | 路数 | 标签 | 说明 |
|---|---|---|---|
| 脑电 | 19 | Fp1、Fp2、F3、F4、F7、F8、T3、T4、C3、C4、T5、T6、P3、P4、O1、O2、Fz、Cz、Pz | 10/20 国际系统的标准十九点 |
| 耳电极参考 | 1 | A2-A1 | 两侧耳电极的差分,官方称全部电极以此为参考 |
| 心电 | 1 | ECG | 一路心电,用于识别心搏伪迹 |
| 标注道 | 1 | EDF Annotations | 标准 EDF+ 标注通道,本库几乎为空 |
十九个脑电标签正好是 10/20 系统的经典十九点:额极两路、额四路、额外侧两路、中颞两路、中央两路、后颞两路、顶两路、枕两路,再加中线三路。这个布点覆盖了整个头皮,适合做从头前到枕区的梯度比较,但不支持高密度的空间滤波——采样点之间的距离太远。
2.3 一条记录的完整解剖
把 Subject00 的静息段完整拆开,一层层看下去,能看清这批数据的组织逻辑。下面这段代码只读文件头与首个数据记录,不需要把整个文件读进内存。
#-- 逐层解剖一段记录:头、通道、时长
import pyedflib
path = "Subject00_1.edf"
with pyedflib.EdfReader(path) as f:
print("信号数", f.signals_in_file)
print("采样率", set(f.getSampleFrequencies()))
print("时长秒", f.getFileDuration())
print("通道名", f.getSignalLabels())
#-- 前六路取前十个采样点,确认量纲
for i in range(6):
print(f.getLabel(i), f.readSignal(i)[:10].round(2))
#-- 标注道通常没有内容,取出来确认为空即可
print("标注条数", len(f.readAnnotations()[0]))
跑完会看到三样东西:22 路信号、统一的 500 赫兹、六十秒的时长。采样率是这批数据里最容易被忽略的一项——官方页面从头到尾没有写它,只能从文件头读出来。
再往下是数据区。每个数据记录是一秒,一秒之内按信号顺序把 22 路各若干采样点排开,路与路之间不是按时间交错,而是按通道整块排列。这意味着只想要某一路时,仍然要把整条记录读进来再抽列,不能像某些多通道格式那样跳读。
| 解剖层级 | 内容 | 数量 | 备注 |
|---|---|---|---|
| 库 | 一次实验的全部记录 | 七十二段 | 扁平存放 |
| 文件 | 一名受试者的一个状态 | 一段六十秒 | 后缀 _1 静息、_2 心算 |
| 数据记录 | EDF 的一个块 | 六十个 | 每块一秒 |
| 信号 | 一路电极 | 二十二路 | 十九脑电 + 耳电极 + 心电 + 标注 |
| 采样点 | 一路信号的一个时刻 | 与采样率相乘 | 见文件头 |
| 标签 | 段级任务状态 | 二类 | 由文件名后缀给出 |
2.4 受试者表:一行一个人,五列信息
subject-info.csv 是这个库唯一的结构化元信息。三十六行,每行一名受试者,六列。
| 列名 | 取值形态 | 说明 |
|---|---|---|
| Subject | Subject00 至 Subject35 | 与文件名前七字符一致,是连接键 |
| Age | 整数,16 至 26 | 官方论文称受试者年龄相当 |
| Gender | F 或 M | 以字母表示 |
| Recording year | 2010、2011、2012 | 三年分批采集 |
| Number of subtractions | 小数,带两位 | 四分钟内完成的减法次数 |
| Count quality | 0 或 1 | 1 为好数者,0 为另一组 |
最后两列是这个库最有信息量、也最容易被误读的地方。减法次数不是整数,说明它是一次换算的结果;计数质量是 0 或 1,官方页面把 1 解释为质量好的那一组、0 为另一组。
| 分组 | 官方定义 | 人数 | 四分钟内减法次数的官方均值 |
|---|---|---|---|
| 质量好的组 | 计数质量好,官方标签为 1 | 24 | 21 |
| 质量差的组 | 计数质量差,官方标签为 0 | 12 | 7 |
值得注意的是,同一份材料对这两个数字只给了均值与标准差,没有给出逐人明细的说明;而表里逐人的小数次数是可以直接读出来的。两类口径之间不需要互相验证,它们是同一件事的两种呈现——一个汇总在官方正文,一个展开在表里。
2.5 与同类资源的字段差异
同为脑电,认知任务库与临床库在字段设计上差别很大,而这些差别直接决定能做什么任务。
| 字段维度 | 本库 | 运动想象类库 | 情绪诱发类库 | 临床癫痫长程库 |
|---|---|---|---|---|
| 受试者规模 | 三十六人 | 百人量级 | 三十余人 | 数十至数百例 |
| 每人记录数 | 两段 | 十余次运行 | 数十个试次 | 数小时至数天 |
| 通道数 | 十九脑电 | 六十余导 | 三十余导 | 十九至二十余导 |
| 任务标签 | 段级二类 | 试次级四类 | 试次级多维 | 发作区间 |
| 行为数据 | 一个汇总次数 | 无 | 自评量表 | 临床记录 |
| 预处理状态 | 已做独立成分分析 | 多为原始 | 多为原始 | 原始 |
| 时长粒度 | 六十秒 | 数分钟一次运行 | 数十秒一段 | 连续数小时 |
它的信息密度集中在"配对整齐"这一列,其它维度的密度都偏薄,尤其是行为数据与原始信号。
2.6 一百七十五兆的体量与三次下载
官方页面给出的未压缩体积是一百七十五点一兆字节。对一个有七十二段、每段六十秒、二十二路信号的库来说,这个数字是合理的:每段约两兆字节,符合画面里 3.7 兆与 1.3 兆交替出现的观察。
同一页面上还列出了三条获取途径:整包 ZIP、wget 递归、AWS 命令行同步到开放桶。三条路径内容一致,差别只在断点续传与并行度。对一个一百多兆的库来说,这几乎是下载方式的全部区别——无论哪条路,几分钟内都能拿全。
2.7 用一个循环拼出全部七十二个文件名
#-- 枚举全部文件名,顺序与 RECORDS 一致
names = [f"Subject{n:02d}_{s}.edf" for n in range(36) for s in (1, 2)]
print(len(names), names[0], names[-1])
assert names == open("RECORDS").read().split()
最后一行把拼接结果与官方清单逐项比对,不通过说明某个编号有特殊处理。
§3 它是谁的数据:一支联合团队、一台高采样的机器
3.1 七位作者与两所学校
官方页面的作者栏列了五个人:Igor Zyma、Ivan Seleznov、Anton Popov、Mariia Chernykh、Oleksii Shpenkov,并在贡献者一栏另写三人:Igor Zyma、Sergii Tukaev、Ivan Seleznov,机构记为乌克兰国立技术大学「伊戈尔·西科尔斯基基辅理工」电子工程系。论文的作者列表则是七人,多出 Sergii Tukaev 与 Ken Kiyono 两位。
拼起来看,作者是一条横跨两所基辅高校、又牵到大坂的线:生理方向在舍甫琴科国立大学,信号方向在基辅理工,方法学合作在大坂大学。
| 角色 | 姓名 | 机构 | 出处 |
|---|---|---|---|
| 第一作者 | Igor Zyma | 基辅塔拉斯·舍甫琴科国立大学 | 论文与页面一致 |
| 贡献者 | Sergii Tukaev | 同上,脑与心理生理方向 | 论文与 README |
| 贡献联系人 | Ivan Seleznov | 基辅理工电子工程系 | 页面联系邮箱 |
| 贡献者 | Anton Popov | 基辅理工电子工程系 | 页面 |
| 贡献者 | Mariia Chernykh | 基辅塔拉斯·舍甫琴科国立大学 | 页面 |
| 贡献者 | Oleksii Shpenkov | 基辅塔拉斯·舍甫琴科国立大学 | 页面 |
| 方法学合作 | Ken Kiyono | 大坂大学基础工学研究科 | 论文作者列表 |
页面作者栏与贡献者栏并不完全重合,这是 PhysioNet 的常见现象:前者是元数据里的署名,后者是捐赠时的登记。两者都以官方页面为准并列,不存在谁更正的问题。
3.2 配套论文说了什么
官方推荐的引用是一篇发表在《Data》期刊的文章,标题直译是《心算任务执行期间的脑电图》。摘要里把动机写得很清楚:这项工作的目的是支撑对脑电的傅里叶功率谱、相干与去趋势波动特征的考察——也就是在完成心算任务时,这些特征怎么变。
摘要还交代了三件关键信息。第一,记录涵盖国际 10/20 系统的脑电,既有任务态也有对应的静息参照。第二,根据减法表现(次数与结果准确性),受试者被分成好数者与差数者两组,后者的心算需要付出更多努力。第三,受试者是三十六名年龄相当的健康志愿者,全部是基辅塔拉斯·舍甫琴科国立大学的学生,记录通过 PhysioBank 平台公开。
这篇论文属于"数据描述论文"这一类型:它的核心产出不是一项新发现,而是把数据本身连同采集协议、预处理流程与分析示例一起讲清楚,让后来者能复现。读它主要是为了理解字段与流程,而不是为了拿一个结论。
3.3 时间线
从采集到发布,这批数据跨了将近十年,中间几段时间长度差别很大。
| 时间 | 事件 | 依据 |
|---|---|---|
| 2010 至 2012 年 | 受试者分批采集,表中记录年份三年 | subject-info.csv |
| 2018 年 11 月 15 日 | README 文件的修改时间 | 文件清单 |
| 2018 年 12 月 12 日 | RECORDS 与受试者表的修改时间 | 文件清单 |
| 2018 年 12 月 17 日 | PhysioNet 正式发布 1.0.0 版 | 官方页面 |
| 2019 年 1 月 18 日 | 论文正式出版 | Crossref |
| 2019 年 3 月 20 日 | 校验和清单的最后修改时间 | 文件清单 |
有两个细节值得记住。第一,数据先上平台、论文后出版,中间隔了一个月,所以引用的规范是"数据 DOI 加论文 DOI"两条并列。第二,最后的修改是补校验和,说明信号与标签自发布起没被动过,只有一个版本号,没有修订说明。
3.4 采集现场:一台 23 通道系统、一副耳电极
官方对采集条件的描述不长,但每一句都对应一个后来会遇到的读取问题。
系统是 Neurocom 出品的 23 通道脑电仪,产地乌克兰。官方写明按 10/20 国际系统布点,银氯化银电极单极导联。参考方式是关键:全部电极以互联的耳电极为参考。这意味着文件里的脑电幅值不是相对某个导入电极的电位,而是相对双耳平均。要换参考,得自己动手。
预处理也写在数据说明里:30 赫兹高通、50 赫兹工频陷波,再做独立成分分析去掉眼、肌与心搏三类干扰。拿到的脑电既没有低频漂移,也没有工频噪声,也没有眨眼跳变。
| 采集要素 | 取值 | 后果 |
|---|---|---|
| 设备 | Neurocom 23 通道系统 | 官方通道数与文件头场数差一路 |
| 电极 | 银氯化银,单极导联 | 类似湿电极,阻抗需记录但未公开 |
| 布点 | 10/20 国际系统 | 十九个经典点,位于头皮全覆盖 |
| 参考 | 互联耳电极 | 脑电幅值相对于双耳平均 |
| 高通 | 30 赫兹 | 慢波与直流成分已被移除 |
| 陷波 | 50 赫兹 | 工频噪声已抑制 |
| 伪迹处理 | 独立成分分析 | 眼、肌与心搏成分已剔除 |
三十赫兹高通是一项特征很强的选择。它保留了伽马以上的一部分,但把 delta 与 theta 的低端大幅削弱。做 theta 频段分析时,这个截止频率会直接影响结果,必须知道自己用的是什么滤波器、原数据已经滤过什么,否则会重复滤波或误判能量分布。
3.5 两个口径:23 通道系统与 22 路信号
有一处必须摊开来讲,因为它会影响任何按通道做的分析。
官方页面与 README 的原话是:脑电记录使用 23 通道的 Neurocom 系统。按字面理解,文件里应该有二十三个信号道。
而文件头里报告的信号数是 22,逐路标签读出来是十九路脑电、一路 A2-A1、一路心电、一路标注道。合格的通道合计二十,加标注道二十一路,仍比官方说的二十三少两路。
| 口径 | 数量 | 构成 | 出处 |
|---|---|---|---|
| 官方描述 | 23 | 采集系统标称通道数 | 页面与 README |
| 文件头 | 22 | 信号字段的实际取值 | Subject00_1.edf 头区 |
| 逐路标签 | 22 | 19 脑电 + A2-A1 + 心电 + 标注 | 同上 |
差额从哪来,官方没有说明。常见的可能有两类:采集系统的 23 路里有一路是系统内部的参考或触发通道,未被写入 EDF;也可能有两路在导出时被合并。两种都只是推测。稳妥的写法是:做分析时以文件头为准,写方法学时同时交代两个数字。
这不是小事。如果你的流程按"二十三路脑电"设计通道数组,代码会在读入时直接报维度不匹配;如果按二十三路除以人数做统计,通道数与样本量的口径会对不上。
§4 它最独特的东西:把静息当成对照组
4.1 组内设计:同一副电极、同一分钟、只差一次任务
多数认知负荷数据集是组间设计:一部分人做任务、一部分人不做。这类设计的麻烦在于,任务态的差异可能混进时间、疲劳、阻抗变化这些与任务无关的因素。
这个库选了最省钱也最干净的做法:每个人都在同一次到访里,先记录一段静息,再做一段心算。两段用同一副电极、同一个参考、同一套滤波、同样的六十秒长度,唯一变化的变量就是"算不算题"。
代价也很明确。同一分钟里,后一段天然比前一段晚;受试者在任务段可能更紧张、更专注,也可能因为坐得久了而更疲惫。设计上没有用一个交叉顺序来平衡这个效应——官方没有提到有半数是先算题后静息。所以"任务态与静息态的差异"这个结论,严格说来包含了一部分时间效应。
| 设计选择 | 常见做法 | 本库做法 | 后果 |
|---|---|---|---|
| 受试者内对比 | 多条件、交叉平衡 | 只有两段,顺序固定 | 干净但含时间效应 |
| 每段长度 | 数十秒到几分钟不等 | 统一六十秒 | 可直接对齐、可直接叠加 |
| 伪迹处理 | 多数留原始信号 | 独立成分分析后交付 | 干净但不可再处理 |
| 行为记录 | 逐题反应时与正确率 | 只有四分钟总数 | 只能做粗粒度分组 |
| 任务难度调节 | 多档难度 | 一档,因人而异 | 难度是自然变异不是自变量 |
第四行是它最特殊的地方。难度的调节不是由实验者设定的,而是由受试者自己的表现自然形成的——官方据减法次数把三十六人分成好数者与差数者两组。这是把"行为变异"当成了分组标签,而不是当成受控的自变量。
4.2 好数者与差数者:一个自然形成的分组
官方据四分钟内的减法次数与结果准确性把受试者分成两组,描述里说差的那一组"心算需要付出更多努力"。
这个分组有两层用处:当协变量放进模型,看任务态差异是否主要体现在差数者身上;当稳健性检验,看某个结论是否只在好数者身上成立——若如此,它反映的可能是"算术熟练"而非"认知负荷"。
同样是四分钟,一组做了二十来次减法,另一组只做了七次。差额主要来自计算速度与是否卡住,这两者在脑电上可能对应完全不同的模式:一个流畅的连续加工,一个断续的重新起始。差数者只有十二人,以这一组为主体的分析统计功效有限。
4.3 案例:Subject00 的两分钟
拿一名具体受试者走一遍,比抽象描述有用。选 Subject00,因为它在清单第一行,任何人都能直接对上,且它的两段文件都在常规体积之列。
打开两段的头:都是 22 路信号、六十秒。第一段文件名后缀是 1,第二段是 2。在受试者表里找到第 00 行,年龄二十一岁、性别女、记录年份 2011、四分钟减法次数与计数质量各有一个值——她属于哪一组,从表里一眼可见。
把两段并排放在一张图上,能看到的不是"任务态更活跃"这么简单。三十赫兹高通已经削掉了慢波,工频噪声也不在,剩下的差异主要体现在节律的强弱与相位关系上,而这两样正是论文要量的东西:功率谱、相干、去趋势波动。
再看这两段缺什么。没有原始信号、没有眨眼时刻、没有每一道减法的起止、没有按键或口头报数的时刻。要研究"从静息进入任务的那几秒怎么过渡",数据里没有那段过渡——两段是分开截取的,中间可能隔了很久。
§4.3 的案例换个角度看:这两段合计两分钟,是全部十二分钟实验里被保留下来的六分之一。剩下的十分钟去哪了,官方没有交代,只说交付的是无伪迹片段。
两段之间只有一处差别:算不算题。
4.4 减法任务本身:四位数减两位数
任务形式决定了信号里会有什么。
官方描述是:每次试验开始时,实验员口头给出一个四位数(被减数)与一个两位数(减数),例如三千一百四十一与四十二。受试者接着连续相减,每一次的结果成为下一次的被减数。
被减数每次不同,意味着每道题的难度略有浮动;减数是两位数,借位在所难免;口头给出而非屏幕显示,意味着没有视觉诱发成分,也没有锁时事件。最后这点最重要:库里没有任何刺激时刻标记,所以做不了事件相关电位分析,只能做连续信号的统计特征分析。
受试者在不停地报数,口腔与颌部的肌电会很强。成分分析若不彻底,残余高频噪声会抬高高频段功率,影响跨组比较;做频谱分析时把伽马段单独看一眼,是个便宜的检查。
4.5 边界条件:什么情况下它不再适用
五种情况下这批数据会失效,且失效方式各不相同。
第一种,任务从"两状态"变成"多难度"。 库里只有一档难度,且难度是自然变异。要做负荷的连续估计或三档以上的分级,这里没有对应的标签。
第二种,需要时间分辨的标签。 六十秒是一整段,中间没有任何分界。想在秒级上标记"这一秒负荷高",只能自己造标签,而造出来的标签没有金标准。
第三种,需要比较伪迹处理。 交付物已经被清洗过,原始信号未公开。任何以"去伪迹前后的差异"为核心的课题都用不了。
第四种,需要人群推断。 三十六名基辅的大学生,年龄十六到二十六。任何关于老年人、儿童或临床患者的结论都超出范围。
第五种,需要重复测量。 每人只有一段任务。想估计个体内的稳定性,或想做前后测的干预研究,这里给不出第二条任务段。
§5 怎么拿到:从 curl 到可训练张量
5.1 目录结构与下载面
官方给三条路:浏览器点 ZIP、wget 递归、AWS 开放桶同步。文件是扁平的,脚本遍历非常直接——不需要先解析目录树,只要按 Subject00 到 Subject35 与两个后缀拼文件名即可。
| 下载方式 | 命令要点 | 适合场景 | 注意 |
|---|---|---|---|
| ZIP | 页面按钮 | 一次性拿全量 | 一百七十五兆,几分钟内完成 |
| wget 递归 | 加 -r -N -c -np |
需要续传 | 会连目录索引一起拉 |
| AWS 同步 | s3 sync --no-sign-request |
批量、可并行 | 需要装命令行工具 |
| 逐文件 | 直接拼 URL | 只取几段做实验 | 最省流量 |
因为体积小,三条路的差别远不如大库明显。真正值得挑的是"只下一部分"这个选项:做教学演示拿两三个人就够,做留一受试者验证才需要全量。
5.2 批量下载
下面这段把全量拉到本地,跳过已存在的文件,中断后重跑不会重复下载。
#-- 拉取全部七十二段,跳过已存在文件
BASE="https://physionet.org/files/eegmat/1.0.0"
mkdir -p eegmat && cd eegmat
curl -sSL -O "$BASE/RECORDS"
for n in $(seq -w 0 35); do
for seg in 1 2; do
f="Subject${n}_${seg}.edf"
if [ ! -s "$f" ]; then
curl -sSL --retry 3 -o "$f" "$BASE/$f"
fi
done
done
#-- 同时拿受试者表与校验和
curl -sSL -O "$BASE/subject-info.csv"
curl -sSL -O "$BASE/SHA256SUMS.txt"
#-- 核对文件数应为七十二
ls Subject*_*.edf | wc -l
seq -w 0 35 给出两位编号,正好对上 Subject00 到 Subject35。最后一行输出七十二说明下载完整。若某个文件只有几百字节,多半是网络中断留下的残片,删掉重下即可——校验和清单可以确认。
#-- 校验完整性,失败会打印文件名
sha256sum -c SHA256SUMS.txt --quiet || echo "有文件校验失败"
#-- 统计文件数,应为七十二
ls Subject*_*.edf | wc -l
5.3 读头、接表、确认采样率
读进来之后第一件事不是滤波,是先确认采样率与通道名。官方页面没有写采样率,必须从文件里取。
#-- 读一段,核对采样率、通道与时长
import pandas as pd, pyedflib
info = pd.read_csv("subject-info.csv").set_index("Subject")
with pyedflib.EdfReader("Subject00_2.edf") as f:
sfreq = f.getSampleFrequency(0)
labels = f.getSignalLabels()
dur = f.getFileDuration()
print("采样率", sfreq, "时长", dur, "路数", len(labels))
print("脑电通道", [x for x in labels if x.startswith("EEG")])
print(info.loc["Subject00"])
打印出来应能看到 22 路、六十秒、十九个以 EEG 开头的通道名,以及 Subject00 那一行的年龄、性别、年份与减法次数。三个数对不上的话,先回去确认文件是否下全,别继续往下走。
5.4 换参考与频段分析
参考方式决定幅值。文件里的脑电是相对互联耳电极的,如果要做平均参考,或者只保留十九路脑电做空间分析,这一步得自己补。
#-- 读入、转成平均参考、按频段算功率
import mne, numpy as np
raw = mne.io.read_raw_edf("Subject00_2.edf", preload=True, verbose="ERROR")
raw.set_channel_types({"ECG": "ecg"})
#-- 去掉非脑电通道后再设参考,避免把心电算进平均
eeg = raw.copy().pick([c for c in raw.ch_names if c.startswith("EEG")])
eeg.set_eeg_reference("average", verbose="ERROR")
bands = {"theta": (4, 8), "alpha": (8, 13), "beta": (13, 30)}
for name, (lo, hi) in bands.items():
psd = eeg.compute_psd(method="welch", fmin=lo, fmax=hi, verbose="ERROR")
print(name, round(float(psd.get_data().mean()), 3))
注意读取之后先用 pick 把心电与参考道排除,再做平均参考。十九路里混进一路心电,平均参考会被心电的尖峰带偏,进而污染每一路脑电。
另一个必须提醒的点是三十赫兹高通。官方在采集时已经滤过,读入后再滤一次并不会更干净,只会让三十赫兹附近的相位失真加倍。做频谱分析时,先看清原始数据已经滤掉了什么。
#-- 只读头区,批量核对时长与路数
for f in Subject*_*.edf; do
python3 -c "
import pyedflib, sys
with pyedflib.EdfReader(sys.argv[1]) as e:
print(sys.argv[1], e.getFileDuration(), e.signals_in_file)
" "$f"
done | sort | uniq -c | head
输出若出现与六十秒不符的行,先怀疑文件没下全。
5.5 切分与划分:按人,不按段
这个库最大的陷阱不在读文件,在划分。每人只有两段,一段静息一段任务,如果按文件随机切成训练集与测试集,同一个人极可能同时出现在两侧。
#-- 按受试者构造特征,留一受试者交叉验证
import numpy as np, pandas as pd
rows = []
for n in range(36):
sid = f"Subject{n:02d}"
for seg, task in (("1", 0), ("2", 1)):
rows.append({"sid": sid, "task": task,
"file": f"{sid}_{seg}.edf"})
meta = pd.DataFrame(rows)
print(meta.groupby("sid")["task"].sum().value_counts())
#-- 每人两段,求和恒为 1,确认没有缺段
folds = sorted(meta["sid"].unique())
for held in folds[:3]:
tr = meta[meta.sid != held]
te = meta[meta.sid == held]
print(held, len(tr), len(te))
这里的 groupby 求和应恒为 1:每人一段静息(0)加一段任务(1)。若某个编号出现 0 或 2,说明文件名后缀解析错了。划分时以 sid 为单位留一,测试集永远只含一个人的两段。
结果通常不好看,而这正是这个库的诚实之处。同一个人内部的两状态差异往往很大,跨人之后,任务态的脑电模式会向个体差异让位。无论报告什么数字,都要说明这是留一受试者的结果,而不是随机按段划分的结果。
5.6 五个最容易出错的地方
| 出错点 | 表现 | 原因 | 处理 |
|---|---|---|---|
| 当 .mat 文件读 | 找不到文件或格式错误 | 库名的 MAT 指心算任务 | 按 EDF 读,用 pyedflib 或 mne |
| 按段随机划分 | 测试准确率异常高 | 同一人两段跨集泄漏 | 按受试者留一(§5.5) |
| 假设采样率 | 时轴长度对不上 | 官方页面未写采样率 | 从文件头读,是 500 赫兹 |
| 把心电当脑电 | 平均参考后各路都带尖峰 | 未排除 ECG 与 A2-A1 | 先 pick 只要 EEG 通道 |
| 重复高通滤波 | 三十赫兹以下功率异常低 | 原数据已经过了 30 赫兹高通 | 读清预处理再决定滤不滤 |
最后一条值得多说一句。三十赫兹高通意味着原始数据里三十赫兹以下已经被大幅衰减,这会让 theta 与低频 alpha 的分析变得敏感——那里剩下的能量本就不多。若你的课题以 theta 为主,第一件事就是承认这个截止频率,并在方法里写清楚。
§6 与库内条目的关系
6.1 关系图谱
站内与脑电有关的记录已经不少,且分成了好几类。与本库真正需要划清界限的,是运动想象类、情绪诱发类、癫痫临床类与新生儿类这四族,以及一个容易混名的听觉注意库。
| 库内记录 | 与本库的关系 | 主要差别 |
|---|---|---|
| EEGMMIDB | 同为 PhysioNet 上的任务态脑电 | 它是运动执行与想象,百人量级,每人多次运行 |
| ltrsvp | 同为任务诱发,同为健康受试者 | 它是快速序列视觉呈现,八通道,二类目标检测 |
| DEAP | 同为三十余人的小样本任务库 | 它是情绪诱发,含主观量表与多路外围信号 |
| bonn-eeg | 同属二类分类用途 | 它是癫痫发作与间期的片段分类,不是认知任务 |
| tuh-eeg-corpus | 同为十九导临床布点 | 它来自医院连续记录,本库来自实验室实验 |
| eeg-dash | 同为运动想象,但是聚合镜像 | 它把多个来源打包,本库是单一实验 |
| auditory-eeg | 同属注意类任务 | 它研究听觉注意解码,有试次级标签 |
| eeg-power-anesthesia | 同属认知状态标签 | 它标的是麻醉意识状态,本库标的是算不算题 |
规律很清楚:本库是站内少数"任务极简、标签极粗、配对极整齐"的记录。其它任务态库用试次级标签换信息量,它则几乎放弃时间粒度,把全部信息压在"两状态对比"上。
6.2 检索路径
站内检索用 slug eegmat,或全名 EEG During Mental Arithmetic Tasks。中文关键词建议用"心算脑电"而不是"脑电",因为后者会返回一大批运动想象与癫痫库;用"认知负荷"也容易命中一批外部资源,需要再用"基辅"或"序列减法"收窄。
按需求找:要百人量级、多次运行的任务态脑电,去 EEGMMIDB;要试次级的视觉目标检测,去 ltrsvp;要带自评量表的情绪诱发,去 DEAP;要临床癫痫的片段分类,去 bonn-eeg;要两状态、配对干净、体量小到可以放进课程材料里的库,才轮到本库。
6.3 三张对照表:任务、标签粒度、处理状态
三个维度分开列,因为它们最容易混淆,也恰好决定了一个库能做什么。
第一张是任务与人群。
| 库 | 任务 | 受试者 | 样本量级 |
|---|---|---|---|
| 本库 | 连续减法心算 | 三十六名健康大学生 | 七十二段 |
| EEGMMIDB | 运动执行与想象 | 百余人 | 千余次运行 |
| ltrsvp | 快速序列图像目标检测 | 十余人 | 数次飞行 |
| DEAP | 音乐视频情绪诱发 | 三十余人 | 千余个试次 |
| bonn-eeg | 无任务,癫痫间期与发作 | 五名患者 | 五百段 |
第二张是标签粒度,决定能用什么统计单位。
| 库 | 最细标签 | 统计单位 | 是否支持事件相关分析 |
|---|---|---|---|
| 本库 | 段级二类(静息/心算) | 人 | 否,无锁时事件 |
| EEGMMIDB | 运行级任务类型 | 运行 | 是,有提示时刻 |
| ltrsvp | 试次级有无目标 | 试次 | 是,有呈现时刻 |
| DEAP | 试次级评价值 | 试次 | 是,有刺激起止 |
| bonn-eeg | 片段级二类 | 片段 | 否 |
第三张是预处理状态,这一维最容易被忽略,却直接决定能不能做方法学研究。
| 库 | 原始信号 | 滤波状态 | 伪迹处理 |
|---|---|---|---|
| 本库 | 不保留 | 已 30 赫兹高通与 50 赫兹陷波 | 已做独立成分分析 |
| EEGMMIDB | 保留 | 未滤或仅轻微滤波 | 未处理 |
| ltrsvp | 保留 | 未滤 | 未处理 |
| DEAP | 保留 | 已下采样至 128 赫兹 | 未处理 |
| bonn-eeg | 保留 | 已带通 | 已人工剔除 |
把三张表叠起来看,本库的位置很清楚:任务最简单、人群最单一、标签最粗、预处理最深。它占的是"干净但对照片"这个角。把它当 EEGMMIDB 的替代品,第一步就会撞上样本量;把它当原始信号库,第二步就会发现无可处理。
6.4 与站外心算资源的区别
站外常被拿来比较的有三类。第一类是情绪与认知负荷混合的多模态库,同步记录脑电、眼动、皮电与心率,外加量表。模态全,但个体差异被多路信号稀释,单模态分析反而多一层对齐。本库只有脑电与一路心电,对齐成本几乎为零。
第二类是驾驶、飞行模拟等自然场景的负荷监测数据,标签来自任务难度分级,生态效度高,但受试者少、场景不可控。本库条件可控,代价是生态效度低。
第三类是公开的算术任务基准,把心算与其他认知任务混在同一批人身上。它们能做任务间对比,但每个任务分到的受试者更少。本库只在心算一件事上做深。
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
先校正一个几乎一定会犯的误判:把"每人只有两段"读成"数据质量差"。
这两件事在这个库上方向恰好相反。每人两段是设计的结果,不是采集能力的上限:一次到访、同一副电极、两个状态、各截一分钟,目的是让"任务态与静息态"这对比较尽可能干净。把每人的任务段拉成十段,会引入阻抗漂移、注意力衰减与疲劳,配对优势随段数增加迅速稀释。
校正之后,五维评分的读法也要跟着变。规模分低衡量的是"能不能喂饱模型",不是"记录得规不规矩"。真正该扣分的地方在别处:通道数的两个口径对不上、采样率页面未写、原始信号没有留存、行为记录压缩成一个数字。这些是文档与留存的欠缺,与采集质量本身无关。
还有一个误判要提:把三十赫兹高通当成缺陷。对做慢波或睡眠分期的课题,它确实是障碍;但对心算这种以 alpha 去同步为主要现象的任务,三十赫兹以上几乎全是噪声,滤掉反而是加分。同一个参数在不同课题下的正负号不同,这是判断任何预处理选择时的基本前提。
7.1 五维评分
按 DAIMS 的常用维度打分,每项一至五分,分数针对"作为认知负荷两状态对比数据"这个用途。
| 维度 | 分数 | 理由 |
|---|---|---|
| 数据规模 | 2 | 三十六人、七十二段,训练不足,做配对分析够用 |
| 标注质量 | 3 | 段级标签干净可靠,但只有二类,无逐题记录 |
| 任务适配 | 3 | 两状态对比设计精良,但无原始信号、无法闭环 |
| 文档完整 | 3 | 协议与预处理好读,通道数口径冲突、采样率未写 |
| 可获取性 | 5 | 免注册、ODC-BY、体量小,三条下载路径都可用 |
合计十六分(满分二十五)。这个分布说明它不是全能选手:规模是硬伤,可获取性拉满,其余三项都在中间档。与同类任务态库相比,它在"容易拿到"上领先,在"能拿来做多少事"上落后。
“标注质量"若按"标签是否正确"打分可以给四分,文件名就是标签,不可能错;若按"能支撑多少分析"打分,三分都偏高。它的标签是"少而准”,不是"多而全"。
7.2 标注质量的两层
第一层是标签是否正确。后半句是"由文件名后缀编码",不需要任何解析:后缀为 1 即静息,为 2 即心算,全库七十二个文件无一例外。这比靠事件码或注释文件传递标签的库可靠,因为不存在"标注文件丢失"这种故障模式。
第二层是标签能承载多少信息。这一层它很薄。除了二类标签,唯一的次级标签是受试者表里的计数质量分组,而它是受试者级的,不是段级的,且样本量不对等。年龄、性别、记录年份、减法次数这四层同样都是受试者级的量,只能做分组或协变量,做不了逐段的回归。
7.3 已知的、可枚举的偏差
| 偏差 | 表现 | 影响 |
|---|---|---|
| 受试者少 | 三十六人,其中差数者仅十二人 | 留一交叉验证的方差极大 |
| 人群单一 | 同一所大学的学生,十六至二十六岁 | 不能外推老年或临床人群 |
| 性别不平衡 | 女二十七人、男九人 | 性别对比的分析功效不足 |
| 单中心单设备 | 一台 Neurocom 系统 | 设备差异无法从内部估计 |
| 顺序固定 | 先静息后任务,未见平衡说明 | 差异中混有顺序与疲劳效应 |
| 行为粒度粗 | 只有一个四分钟总数 | 无法做逐题或时间分辨分析 |
| 无原始信号 | 只交付清洗后结果 | 伪迹处理研究无法开展 |
| 标签层级单一 | 只有段级二类 | 无法做难度分级或多任务比较 |
| 采样率未写 | 页面与 README 均未提及,文件头为 500 赫兹 | 使用者须自行从文件头读取 |
前四条是结构性的,改不了;中间三条是设计选择带来的,可以规避或交代清楚;最后两条是文档问题,靠读取文件即可解决。
有一处统计上的提醒:这个库的天然统计单位是人,不是段。按段统计会把样本量翻倍到七十二,但同一个人的两段高度相关,独立性不成立,显著性会被高估。稳妥的做法是每人在两状态间取一个差,把这个差当一条观测,样本量压到三十六,结论才站得住。
7.4 外部验证矩阵
这个库在文献里的用法,可以归成四类角色。判断依据是官方说明与论文摘要,不涉及具体数值比较。
| 验证角色 | 做法 | 讲得通的地方 | 风险 |
|---|---|---|---|
| 认知负荷检测基线 | 在配对数据上跑二分类 | 标签干净、预处理统一 | 只有三十六人,跨人泛化难 |
| 频谱与相干方法示例 | 复现论文的功率与相干对比 | 十九导标准布点、耳电极参考 | 三十赫兹高通限定了可用频段 |
| 时间尺度指标验证 | 在六十秒片段上算去趋势波动 | 长度与采样率都够 | 单段估计的方差大 |
| 预处理效果演示 | 比较降采样或重参考的影响 | 预处理已统一,参照组可靠 | 不能评价去伪迹算法本身 |
第一类最常见,但要小心划分方式;第二类与第三类最贴合它的设计目的,因为它们正是论文的分析对象;第四类只适合做"后处理"的对照。
还有一个不常被提起却很合适的用法:教学。一次实验、两名状态、十九个经典电极、一个二类标签,链路每一环都能在一个课时里讲完,文件也小到可以直接发给学生。
7.5 它为何能持续(省掉的是一次到访)
它自 2018 年发布以来只有一个版本,作者也没有持续维护,却仍在被引用。原因不在规模,在于它把一个成本极高的环节替使用者省掉了:让同一个人同时出现在两种状态里,且两种状态用同一副电极、同一套处理。
要做这件事,得把三十六名学生请进实验室一次,每次十几分钟,加上电极安装与清洗。听起来不多,但它不可外包:别的库给不了"同一个人、同一次到访"的配对,跨库拼时设备与处理全都不同,优势立刻消失。
边界也很明确:只在"两状态对比"上成立。课题一旦转向难度连续估计、时间分辨监测或伪迹处理,短板立刻暴露。
成本也是原因。重做一次需要一台多通道脑电仪、一名实验员、三十六名受试者和一项伦理审批;下载只要一百七十五兆。
§8 生态位与历史
8.1 历史沿革
这批数据诞生在 PhysioNet 数据捐赠的一个特定阶段。那时平台上心电、重症监护、睡眠记录已经很多,但"范式化的认知实验"相对少:临床信号是监护中顺手录下的,认知实验则为研究目的专门设计,愿意公开的团队不多。
它的加入方式很典型:两所高校联合的小组做完分析后,把记录整理成平台能接受的格式捐出来,托管与版本管理交给平台。这让它在没有后续基金、没有维护团队的情况下活了八年多,也让文档停在"一次讲清"的状态——没有勘误,也没有补充说明。
从格式上也能读出年代。EDF 加一张逗号分隔的表,是那个时期平台的标准做法:文件自描述、元信息另附一张表。后来的大规模数据集往往改用更结构化的清单,这个库仍停在"文件列表加一张表"的朴素形态。
8.2 与挑战赛和聚合库的关系
它没有进过任何挑战赛。PhysioNet 历年挑战赛涉及的脑电任务集中在癫痫检测、睡眠分期与重症监测,心算任务从未成为赛题。这意味着它没有官方划分、没有排行榜、没有社区基线,也意味着它不会被"刷分"式的研究快速消耗。
它与聚合型资源的关系则相反。聚合库的价值在于规模与统一格式,代价是把单个实验的细节磨平。本库恰好相反,规模小,格式朴素,但每个字段都对应一次真实的采集决定。两者不是替代关系,而是粗细两层。
它的出现时机也值得一提:那正是去趋势波动分析从物理学进入神经科学的几年,一个六十秒、已被清洗过的片段恰好是这类方法理想的输入,而作者之一正来自该方法的推动方。这让它同时具备两个身份——认知负荷数据集,与时间尺度分析的标准样例。
8.3 生态位:粗标签的一端
把站内外的脑电库按"标签粒度"排:临床连续记录最粗,几小时到几天,标注稀疏;本库居中偏粗,段级二类;竞赛集更细,试次级事件码;事件相关电位库最细,逐次刺激带时刻。
因此它有两个稳定的用途:一是两状态对比的参照物,任何关于"认知负荷会让脑电怎样"的假设都能在这里先验一遍;二是教学素材,一次实验从设备到文件每一环都对得上,且全库小到可以直接分发。
这个位置不容易被替代。拼一个规模更大的负荷库不难,难的是"同一个人、同一次到访、同一副电极"这种配对——而这恰恰是扩大样本量时最先放弃的东西。
8.4 谁在用它,用来做什么
从公开文献摘要看,引用集中在三个方向:认知负荷检测的分类方法,把它当标准测试集;频谱与相干特征分析,承接论文原本的问题;预处理与降采样影响的评估,看中它统一的处理流程。
还有一类不常被提及的用法:读取库的回归测试。它简单到一个函数就能读完,又包含 EDF 固定字段、二十二路信号、多字符通道名与非标准日期这些真实的边界情况,拿来检验一个 EDF 读取器是否稳健很合适。
三类用法有一个共同点:都不要求大样本。课题一旦要求"至少几百人",它就会被换掉,而换成什么,往往取决于那个课题需不需要配对。
§9 使用指引
9.1 三种角色的路径
算法研究者的最短路径。 按 §5.2 下一两个受试者、按 §5.3 读采样率、按 §5.5 按人划分,跑一个逻辑回归拿到基线,再决定是否扩到全量。别一上来就按段随机切。
认知神经科学方向的最短路径。 先读 README 的预处理段,再挑一名受试者(推荐 §4.3 的案例)把两段并排画出来,确认自己理解了三十赫兹高通之后还剩下什么。然后按频段算功率,在差数者与好数者两组里分别看,比较结论是否一致。
工程落地方向的最短路径。 先确认要的是离线分析还是在线监测。离线可直接用;在线要自己定义负荷标签与时间窗,这批数据帮不上忙,把它当"两状态的离线上限"估计更合适。
| 角色 | 先做什么 | 别做什么 | 预期产出 |
|---|---|---|---|
| 算法研究者 | 两名受试者跑通全链路 | 按段随机划分 | 可信的跨人基线 |
| 认知方向 | 并排画一段的两状态 | 忽略了三十赫兹高通 | 频段与分组的对照 |
| 工程落地 | 确认离线与在线的差别 | 指望它给出时间标签 | 两状态的可分性上界 |
| 教学 | 用一名受试者做演示 | 用全库做课堂练习 | 完整链路的一次直观演示 |
9.2 先建一份本地索引
#-- 把文件清单与受试者表合成一张分析索引
import pandas as pd
meta = pd.read_csv("subject-info.csv")
rows = []
for _, r in meta.iterrows():
sid = r["Subject"]
for seg, task in (("1", "静息"), ("2", "心算")):
rows.append({"sid": sid, "file": f"{sid}_{seg}.edf",
"task": task, "age": r["Age"],
"group": r["Count quality"]})
idx = pd.DataFrame(rows)
print(idx.groupby("task").size(), idx["group"].value_counts().to_dict())
任务两栏各三十六,计数质量按官方分组为二十四与十二。
9.3 一条最短的可用流程
从零到第一个诚实可比的数字,下面这段够用。它不追求性能,只保证每一步都对得上。
#-- 最小可用流程:两名受试者的跨人基线
import numpy as np, pandas as pd, pyedflib
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score
def features(path):
with pyedflib.EdfReader(path) as f:
sf = f.getSampleFrequency(0)
idx = [i for i, l in enumerate(f.getSignalLabels())
if l.startswith("EEG")]
x = np.vstack([f.readSignal(i) for i in idx])
#-- 每一路去均值后取方差与零交叉率,作为最朴素的负荷特征
var = x.var(axis=1)
zcr = np.mean(np.abs(np.diff(np.sign(x), axis=1)) > 0, axis=1)
return np.concatenate([var, zcr, [sf]])
def person(n):
sid = f"Subject{n:02d}"
X = np.vstack([features(f"{sid}_1.edf"), features(f"{sid}_2.edf")])
y = np.array([0, 1])
return X, y
Xtr, ytr = person(0)
Xte, yte = person(1)
clf = LogisticRegression(max_iter=2000).fit(Xtr, ytr)
print("跨受试者 AUC", round(roc_auc_score(yte, clf.predict_proba(Xte)[:, 1]), 3))
这里刻意做跨受试者:Subject00 训练、Subject01 测试。每人只有两条样本,AUC 只能落在零、零点五、一这三个点上,几乎没有统计意义——它的意义在于把流程跑通,并让人亲手体会到"两条样本训不出东西"。要换成留一受试者,把两个 person 调用改成三十六个编号轮流当测试集即可。
9.4 引用方式
官方要求同时引用两件东西:原始论文与 PhysioNet 平台。论文那一条是 Zyma、Tukaev、Seleznov 等七人于 2019 年发表在《Data》第四卷第一期、文章号 14 的数据描述文章,DOI 为 10.3390/data4010014。平台那一条按 PhysioNet 的现行建议引用其 2026 年的平台综述。
数据本身建议写到版本级:数据集名称、版本号 1.0.0、DOI 10.13026/C2JQ1P、访问日期。许可为 ODC-BY 1.0,允许商用与再分发,条件是署名。若做了再加工(重参考、降采样、重新分段),应在方法里写清楚,因为这些步骤会改变别人复现的结果。
§10 AI 使用声明
| 项目 | 声明 |
|---|---|
| 文本生成 | 本文由 AI 辅助撰写,编辑负责结构与事实核对 |
| 数字来源 | 规模、结构、边界三类数字取自 PhysioNet 官方页面与官方文件 |
| 文件核验 | README、RECORDS、subject-info.csv、SHA256SUMS.txt 与单个 EDF 的头区经直接访问确认 |
| 口径冲突 | 官方称 23 通道系统,文件头报告 22 路信号,已在 §3.5 并列呈现 |
| 论文信息 | 仅参考 Crossref 返回的摘要与元数据,未读全文 |
| 未核验内容 | 全部七十二段的波形内容、各段标注道内容、精确采样率以外的采样细节 |
| 图像 | 无配图;封面为生成式提示词,不含真实脑电波形 |
| 免责 | 本文不构成任何临床或工程建议;使用须遵守 ODC-BY 1.0 署名条款 |
常见误读(避坑清单)
| 说法 | 实际 | 证据 |
|---|---|---|
| 「这是一个 .mat 格式的数据集」 | 全部是 EDF,无一 .mat | 文件清单与 RECORDS 七十二行 |
| 「MAT 指 MATLAB」 | MAT 指 Mental Arithmetic Task | 官方全名与页面标题 |
| 「它有几百名受试者」 | 三十六人,每人两段 | subject-info.csv 三十六行 |
| 「每段是几分钟的长记录」 | 每段六十秒 | README 与文件头时长字段 |
| 「采样率很高,适合做高频分析」 | 500 赫兹,且已 30 赫兹高通 | 文件头每记录采样点字段为 500 |
| 「它包含原始未处理信号」 | 只有独立成分分析后的片段 | README 明写预处理流程 |
| 「它有逐题的作答记录」 | 只有四分钟总数与好差分组的标签 | subject-info.csv 只有一列次数 |
| 「可以直接随机切分训练测试」 | 必须按受试者划分 | 每人两段且成对,随机切必泄漏 |
| 「它是癫痫或异常检测数据」 | 全部为健康受试者的任务态记录 | 招募标准排除精神神经科主诉 |
| 「两组人数一样多」 | 好数者二十四人,差数者十二人 | 官方页面分组说明 |
FAQ
Q1:它是 .mat 格式的数据集吗?
不是。库名 EEGMAT 里的 MAT 指 Mental Arithmetic Task,即心算任务,与 MATLAB 的 .mat 文件无关。全库是 EDF 文件加一张受试者表,没有任何 .mat。
Q2:一共多少受试者、多少段记录?
三十六名受试者,每人两段,合计七十二个 EDF。命名从 Subject00 到 Subject35,后缀为 1 的是任务前静息,为 2 的是心算。RECORDS 逐行列出这七十二个文件。
Q3:采样率和通道数是多少?
官方页面只写设备是 23 通道的 Neurocom 系统,没有给出采样率。文件头报告 22 路信号:十九路脑电、一路 A2-A1、一路心电,另有一路标注道。采样率必须从文件里读,不要硬编码。
Q4:能直接用它做二分类认知负荷检测吗?
可以做,但必须按受试者划分。每人只有一段静息与一段任务,随机按段划分会让同一个人的两段分处训练与测试两侧,模型学到的是个体指纹而非任务状态。
Q5:原始信号还在吗?
不在了。官方说明全部记录是经独立成分分析处理后的无伪迹片段,公开的只有清洗结果。想比较去伪迹方法,只能把它当参照组。
Q6:三十赫兹高通对我有影响吗?
看课题。做 alpha 与 beta 频段的分析影响不大,因为这些能量在三十赫兹以上仍有相当部分;做 theta 或慢波分析就要格外小心,低频能量已被大幅削弱,读到的是滤波器之后剩下的部分。
Q7:好数者与差数者两组能直接比吗?
可以比,但要记住两组人数不对等:二十四人对十二人。以差数者为主体的分析功效有限,报告时应给出每组的样本量,并说明结论是否在两组里方向一致。
Q8:记录年份在哪里找?
在 subject-info.csv 的 Recording year 一列,取值为 2010、2011 或 2012。EDF 头里的开始日期被统一设成 1 月 1 日,是占位值,不能用来判断采集年份。
Q9:可以用来做源定位吗?
勉强可以做,但精度有限。十九个电极是 10/20 经典布点,间距较大,且没有个体头模型与结构像。做粗略的皮层分区比较可以,做精细源成像不行。
Q10:许可允许商用吗?
ODC-BY 1.0 允许,包括商业用途,条件是署名。署名要覆盖数据集本身与 PhysioNet 平台两层,具体条款以官方许可全文为准。
Q11:官方有扩版计划吗?
页面只显示一个版本,2018 年底首发,2019 年 3 月补录校验和,之后没有更新说明。从文档形态看,扩版的可能性不大。
Q12:它和运动想象库能拼在一起用吗?
技术上可以,但意义有限。两者的任务、标签体系、参考方式、采样率都不同,拼起来只能做"多个任务的负荷代理"这类粗粒度工作;若要研究任务本身,还是分开分析更可靠。
术语表
| 术语 | 解释 |
|---|---|
| 心算任务 | 不借助外部工具完成的算术运算,本库用的是连续减法 |
| 序列减法 | 每次结果成为下一次被减数的连续相减,是心算负荷的经典范式 |
| 认知负荷 | 工作记忆被任务占用的程度,本库用算不算题来近似 |
| 静息态 | 任务之外的安静闭眼或睁眼记录,本库作为配对对照 |
| 10/20 国际系统 | 按颅骨标志点按比例布放电极的国际惯例,本库取其十九点 |
| 单极导联 | 每个电极相对一个共同参考测量,本库的参考是双耳 |
| 互联耳电极 | 两侧耳垂电极短接后作参考,本库写作 A2-A1 |
| 独立成分分析 | 把多通道信号分解为统计独立成分的盲源分离方法 |
| 眼电伪迹 | 眼球运动与眨眼产生的电位,幅度远大于脑电 |
| 工频陷波 | 针对电网频率的窄带滤波,本库为 50 赫兹 |
| 高通滤波 | 保留高于截止频率的成分,本库截止在 30 赫兹 |
| 功率谱密度 | 信号能量在频率上的分布,是论文的核心分析对象 |
| 相干 | 两路信号在某一频段上的相位一致性,衡量功能连接 |
| 去趋势波动分析 | 用标度指数刻画信号长期相关性的方法,论文的另一个核心对象 |
| 标度指数 | 去趋势波动分析输出的斜率,反映信号的自相似程度 |
| alpha 去同步 | 任务时 alpha 频段功率下降的现象,是最常见的负荷指标 |
| 事件相关电位 | 与特定刺激锁时的平均波形,本库无锁时事件,不适用 |
| 段级标签 | 标签覆盖整段记录而非其中某一时刻 |
| 受试者泄漏 | 同一受试者的样本同时出现在训练与测试集,导致成绩虚高 |
| 留一受试者 | 每次留一个人做测试、其余人做训练,衡量跨人泛化 |
| 组内设计 | 同一批受试者接受全部条件的实验设计 |
| 时间效应 | 由记录顺序或疲劳引起的偏差,与任务本身无关 |
| EDF | 欧洲数据格式,自描述的生理信号文件格式 |
| 数据记录 | EDF 中固定时长的数据块,本库为每秒一块 |
| ODC-BY | 开放数据共享署名许可,允许商用需署名 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 受试者数 | 36 | subject-info.csv 行数 | 官方文件 |
| 记录数 | 72 | RECORDS 逐行 | 官方文件 |
| 每段时长 | 60 秒 | README | 官方页面 |
| 信号路数 | 22 | Subject00_1.edf 头区 | 官方文件 |
| 脑电通道 | 19 | 头区通道标签 | 官方文件 |
| 辅助通道 | 1 路 A2-A1 与 1 路心电 | 头区通道标签 | 官方文件 |
| 官方标称通道 | 23 | 页面与 README | 官方页面 |
| 数据记录数 | 182 | 头区数据记录字段 | 官方文件 |
| 记录时长字段 | 1 秒 | 头区 | 官方文件 |
| 每记录采样点 | 500(每路) | 头区采样点字段 | 官方文件 |
| 采样率 | 500 Hz | 采样点除以记录时长 | 官方文件推算 |
| 头字节数 | 5888 | 256 + 22 × 256 | 官方文件推算 |
| 年龄范围 | 16 至 26 岁 | subject-info.csv | 官方文件 |
| 性别构成 | 女 27、男 9 | subject-info.csv 计数 | 官方文件 |
| 记录年份 | 2010 至 2012 | subject-info.csv | 官方文件 |
| 好数者人数 | 24 | 页面分组说明 | 官方页面 |
| 差数者人数 | 12 | 页面分组说明 | 官方页面 |
| 未压缩体积 | 175.1 MB | 页面文件区 | 官方页面 |
| 许可 | ODC-BY 1.0 | 页面许可栏 | 官方页面 |
| 数据 DOI | 10.13026/C2JQ1P | 页面发现栏 | 官方页面 |
| 论文 DOI | 10.3390/data4010014 | Crossref | 论文元数据 |
| 首发日期 | 2018-12-17 | 页面版本说明 | 官方页面 |
附录 B:数字的来源分层
第一层,官方页面与官方文件。 受试者数、记录数、每段时长、信号路数与通道标签、年龄范围、性别构成、记录年份、分组人数、体积、许可与 DOI,全部来自项目主页、README、RECORDS 与受试者表;头区字段来自对单个 EDF 的直接读取。这一层可直接引用,重查可得同样结果。
第二层,论文摘要与元数据。 受试者为基辅一所大学的学生、年龄相当、分析对象是功率谱与相干与去趋势波动,来自 Crossref 摘要;期刊与出版日期同样来自 Crossref。摘要能支撑"作者主张了什么",不能支撑"结论有多强"。
第三层,未核实。 全部七十二段的波形内容、标注道是否有内容、精确采样率、每段覆盖的减法次数、两段记录之间的间隔、是否有先算题后静息的受试者。正文中凡涉及这些的地方,都只做定性表述或明确标注为推断。
附录 C:完整参考文献
| 编号 | 文献 | 链接 | 用途 |
|---|---|---|---|
| 1 | EEG During Mental Arithmetic Tasks v1.0.0 | https://physionet.org/content/eegmat/1.0.0/ | 规模、结构、边界数据 |
| 2 | 该库文件目录 | https://physionet.org/files/eegmat/1.0.0/ | README、RECORDS、受试者表、头区 |
| 3 | Zyma I, Tukaev S, Seleznov I, et al. Data 2019;4(1):14 | https://doi.org/10.3390/data4010014 | 实验动机与分析对象 |
| 4 | 同上的 Crossref 元数据与摘要 | https://api.crossref.org/works/10.3390/data4010014 | 作者、机构、出版日期 |
| 5 | PhysioNet 平台综述(2026,Nature Health) | https://doi.org/10.1038/s44360-026-00096-z | 托管模式与引用规范 |
| 6 | ODC-BY 1.0 许可全文 | https://opendatacommons.org/licenses/by/1-0/ | 许可条款 |
| 7 | 10/20 国际系统电极布点惯例 | https://www.eeg.tuwien.ac.at/eeg.tuwien.ac.at_pages/events/ec20/EC20_program.htm | 十九点布点的来源 |
| 8 | EEGMMIDB(库内对照) | https://physionet.org/content/eegmmidb/1.0.0/ | §6.3 的规模与标签对比 |
附录 D:任务代码
把一名受试者的两段记录画成"频段功率对比",这段够用,不需要训练模型。
#-- 逐人比较静息与心算的频段功率
import numpy as np, mne
BANDS = {"theta": (4, 8), "alpha": (8, 13), "beta": (13, 30)}
def band_power(path):
raw = mne.io.read_raw_edf(path, preload=True, verbose="ERROR")
eeg = raw.copy().pick([c for c in raw.ch_names if c.startswith("EEG")])
eeg.set_eeg_reference("average", verbose="ERROR")
psd = eeg.compute_psd(method="welch", verbose="ERROR")
data, freqs = psd.get_data(), psd.freqs
out = {}
for name, (lo, hi) in BANDS.items():
m = (freqs >= lo) & (freqs < hi)
out[name] = float(data[:, m].mean())
return out
rows = []
for n in range(36):
sid = f"Subject{n:02d}"
a = band_power(f"{sid}_1.edf")
b = band_power(f"{sid}_2.edf")
rows.append({k: b[k] / a[k] for k in BANDS})
for k in BANDS:
v = np.array([r[k] for r in rows])
print(k, "中位比值", round(float(np.median(v)), 3),
"负项人数", int((v < 1).sum()))
输出的每一行是一个频段、三十六人任务态与静息态功率比值的中位数、以及有多少人的比值小于一。alpha 那一行通常会有明显的下降,这正是认知负荷最常见的脑电表现。
附录 E:如果只记五件事
第一,它是单实验室的心算任务脑电库,三十六名健康大学生,每人一段静息与一段六十秒心算,全部为 EDF,与 .mat 文件无关。
第二,它最大的价值是配对:同一副电极、同一长度、唯一变化的变量是算不算题,这个配对在别的库里买不到。
第三,它交付的是清洗结果,原始信号与成分分离矩阵都没有。
第四,通道数有两个口径:官方称 23 通道系统,文件头报告 22 路信号;采样率页面未写,须从文件读取。
第五,现实的用法是两状态二分类加留一受试者验证;按段随机划分得到的准确率几乎都来自同一受试者的泄漏。
编辑说明
核验时间 2026 年 10 月 28 日。核验方式:直接访问 PhysioNet 项目页,读取 README.txt、RECORDS 全表、subject-info.csv 与 SHA256SUMS.txt,并按字节区间读取 Subject00_1.edf 的头区,解析信号数、通道标签与固定字段;页面上的文件清单与体积亦逐一核对。论文信息仅取 Crossref 元数据与摘要。另读取 Subject01_1.edf 的采样点字段以确认每记录 500 点。未覆盖:全部七十二段的波形内容、标注道内容、两段记录之间的间隔。通道数的两个口径(23 与 22)按并列呈现,不作判断。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- earh — 共享标签:生理信号 / 脑电信号 / 神经科学
- earndb — 共享标签:生理信号 / 脑电信号 / 神经科学
- openneuro — 共享标签:生理信号 / 脑电信号 / 神经科学
- eeg-gaba-anesthesia — 共享标签:生理信号 / 脑电信号 / 神经科学
- seed — 共享标签:生理信号 / 医学问答与基准
- siena-scalp-eeg — 共享标签:生理信号 / 脑电信号 / 神经科学
- eeg-power-anesthesia — 共享标签:生理信号 / 脑电信号 / 神经科学
- ltrsvp — 共享标签:生理信号 / 脑电信号 / 神经科学
- ibl-brain-wide-map — 共享标签:生理信号 / 脑电信号 / 神经科学
- spikeinterface — 共享标签:生理信号 / 脑电信号 / 神经科学
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

