信息速览
把耳机戴上,屏幕上跳出一个字母。你记着前一个是不是它,同时还要记着再往前两个。这时候背景里的音乐是大调还是小调、鼓点密不密,你觉得不影响判断——但手腕上的皮电和额头上的近红外探头未必同意。
休斯顿的一间实验室里,五个人各坐了两场。第一场放舒缓的音乐,第二场放激昂的音乐,两场里各有十六个区块,一半只要记一格,一半要记三格。就在这三十一分钟里,五台设备同时开着,把皮电、心电、皮温、呼吸、脉搏、肌电、前额血氧、脸部表情和每一次按键都记了下来。
这批记录 2025 年 2 月挂上 PhysioNet,编号 1.0.0。它的规模小得有点意外,结构却比多数同类库更杂——正是这种「小而杂」决定了它能做什么、不能做什么。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 全名 | A Multimodal Dataset for Investigating Working Memory in Presence of Music |
| 站点标识 | multimodal-nback-music |
| 发布方 | PhysioNet(MIT 计算生理学实验室维护) |
| 作者 | Saman Khazaei、Srinidhi Parshi、Samiul Alam、Md Rafiul Amin、Rose T. Faghih |
| 机构 | 纽约大学与休斯顿大学 |
| 首次发布 | 2025 年 2 月 26 日,版本 1.0.0 |
| DOI | 10.13026/6vh4-dk68 |
| 配套论文 | Frontiers in Neuroscience 2024 年第 18 卷,文章号 1406814 |
| 受试者 | 招募 11 人,留存 5 人(编号 3、4、6、8、11) |
| 任务 | 字母 1-back 与 3-back,每场 16 块、每块 22 试次 |
| 场次 | 两场:Calming 在前,Vexing 在后 |
| 单场时长 | 964 秒,约 16 分钟 |
| 生理模态 | 皮电、心电、皮温、呼吸、脉搏、肌电、fNIRS |
| 派生模态 | 面部表情评分、逐试次对错与反应时 |
| fNIRS 规格 | 44 通道,7.6294 赫兹,输出四种血红蛋白量 |
| 采集设备 | Biopac MP160、Empatica E4、NIRSport 2、FaceReader、E-Prime 配 Chronos |
| 许可 | ODC-BY 1.0,免注册 |
| 缺什么 | 脑电、原始录像、对照组、主观负荷评分 |
§1 它要解决的具体麻烦
1.1 想调一个人的状态,先得能看见他的状态
闭环脑机接口这条路子的设想很直白:测到状态偏离,就施加一个干预,把状态拉回来,然后再测。听觉刺激是最容易施加的一类干预——不需要电极贴到运动皮层,不需要受试者配合做动作,一段音乐放出去就行。
难点不在干预,在「看见」。工作记忆的负荷高低是一个藏在行为背后的量,你只能从按键对不对、按得快不快去反推,而反推的延迟以秒计,噪声又大。多记录几路生理信号,相当于多开几个观察窗口,让同一个隐藏状态在不同通道上留下不同的痕迹。
这个库就是为这件事准备的一组素材:同一个人的同一段任务,被七路生理信号、一路表情评分和一路行为同时盯着。它不提出新算法,也不给出结论,只把「多窗口同时观看」这件事做成了可下载的文件。
1.2 三条常见的错误期待
第一条,期待它里面有脑电。 库名里的 multimodal 很容易让人以为这是又一份脑电加外围信号的数据集。官方在背景段落里也确实并列提到过 PPG、EEG、fNIRS 与 EDA 四种模态,但那是在讲领域图景,不是讲这次采了什么。实际清单里没有任何脑电通道,神经层面只有 44 通道功能近红外。按「脑电 64 导」的思路写解析代码,第一步就会读不到文件。
第二条,期待它有十几二十个人。 摘要里写的是 11 人参与,这是招募数。方法与数据说明里另有一句:并非每位受试者都采全了所有传感器,模态太少的被整体剔除。附表中带勾的只有五行——编号 3、4、6、8、11。真正能用的样本是五个,其中编号 6 还缺面部表情这一路。
第三条,期待它有情绪或负荷的主观标签。 库里没有一份自评量表。官方的局限说明里明确写着「the lack of any cognitive state score provided by subjects」。能被当作标签的只有三层:场次(Calming 与 Vexing)、区块类型(1-back 与 3-back)、以及逐试次的判断对错。想在「高负荷」与「低负荷」之间画一条连续的线,这里没有刻度。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 多设备同步的原始信号 | 五台设备、六个文件夹、触发器对齐 | 够,同步信息是齐全的 |
| 工作记忆负荷的两档对比 | 1-back 与 3-back 区块各半 | 够做二分类,只有两档 |
| 背景音乐作为条件变量 | 两场,舒缓在前、激昂在后 | 能当条件,但与顺序混在一起 |
| 神经层面的直接观测 | 44 通道前额 fNIRS | 勉强,只有前额且时间分辨率低 |
| 逐试次的行为标签 | 对错序列与反应时 | 够,这是它最细的一层标注 |
| 面部表情的动态 | FaceReader 的状态与概率分布 | 部分够,五个人里只有四个有 |
| 脑电相关的任何分析 | 无 | 不够,一路都没有 |
| 主观负荷或情绪评分 | 无 | 不够 |
| 大样本的跨人泛化 | 五个人 | 不够,怎么切都薄 |
| 对照组比较 | 无对照组 | 不够,官方自己列为局限 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 你要做一个多设备同步的采集原型,缺一份「人家怎么对齐」的参考 | 触发器文件分区块级与试次级两层,时间轴统一置零 | 先读 §5.3 的对齐代码,把两路设备的时间戳对齐一次 |
| 你在做认知负荷的二分类,想找一份带 fNIRS 的公开数据 | 两档负荷、逐试次标签、44 通道前额血氧 | 按受试者留一划分,先拿五折的诚实基线 |
| 你在研究音乐对认知表现的影响 | 同一批人、同一任务、两种音乐,配对设计 | 注意顺序不可交换,只能当「场次效应」讲 |
| 你要做表情与生理的联合建模 | 四个人有表情评分,与生理可对齐 | 先把人数缩到四个,再谈模型 |
| 你在教学,要讲清一次多模态实验的全链路 | 从设备到目录到触发器,每一环都有文字说明 | 用一名受试者的一场做演示,两小时能讲完 |
| 你需要大样本训练深度模型 | 五个人、每人 704 试次 | 换库,或只把它当外部验证集 |
| 你要研究脑电的负荷指标 | 没有脑电 | 换库,看 §6.1 的对照 |
| 你的课题要求健康对照与患者对照 | 只有健康成人,无对照 | 换库,这里一条临床记录都没有 |
1.5 一句话判断
它不提供规模,提供的是一个罕见的组合:同一个人、同一段字母流、同一批电极,只换背景里的那段音乐。
1.6 不适合谁:四条边界
不适合拿它证明某个模型「能识别认知负荷」。 五个人的数据,无论报告多高的准确率,都要先回答一个问题:测试集里的人,训练时见过没有。把所有试次打散随机切分,同一个人会同时出现在两侧,模型学到的是这个人的皮电基线,不是负荷。这个坑在这个库上格外深,因为每人有 704 个试次,泄漏起来的样本量看着很充裕。
不适合拿它做神经影像层面的负荷定位。 fNIRS 只有 44 个前额通道,采样率 7.6294 赫兹,时间分辨率以秒计。n-back 的血氧响应本来就在数秒尺度上延迟,再叠上这个采样率,做「第几个试次负荷升高」这类分析基本无从下手。
不适合拿它做音乐的疗效结论。 两场音乐固定了顺序,第一场舒缓、第二场激昂,中间只隔两分钟。任何「激昂音乐让人表现更好」的说法,都无法与「第二场时人更熟练」分开。官方自己在局限里点了这一条,并提出需要打乱任务难度与音乐场次才能推广。
不适合拿它做人群推断。 五名健康成人,无年龄分层、无临床组、无对照。关于老年人、注意力缺陷或康复期患者的任何推论,都超出了这批数据的边界。
§2 数据构成与规格
2.1 六个文件夹、一套命名
整包解开后是六个顶层文件夹,每个文件夹对应一台设备或一类产物。没有按受试者分包,也没有按场次分包,跨文件夹的关系全靠文件名里的受试者编号与场次词。
multimodal-nback-music/
├── Behavioral_data/ #-- E-Prime 导出的行为与 Chronos 按键
├── Biopac_data/ #-- 有线生理,五个信号各一子目录
│ ├── EDA/ ECG/ PPG/ RESP/ EMG/
│ └── Timing/ #-- 区块级与试次级触发器
├── Face_reader_data/ #-- 每人一个子目录,表情状态与概率
├── fNIRS_data/ #-- 四种血红蛋白量与触发器表
└── Empatica_data/ #-- 腕带七类文件
命名有两套写法,官方在描述里分别给出过。行为数据写作「场次名 + 受试者编号 + .csv」,Biopac 与 fNIRS 写作「受试者编号 + 性别 + 下划线 + 类型」,Empatica 与表情则举例写作 subject_3F 这种带下划线的目录名。两套写法不是笔误,而是不同设备的导出习惯,落地时以目录里实际存在的名字为准,不要按某一套模板硬拼路径。
其中只有 Biopac 是先按信号类型分五个子目录、再按受试者平铺;表情与腕带是先按受试者分目录、再按内容分文件;行为与 fNIRS 完全扁平,靠文件名里的编号区分。三种组织方式并存,意味着遍历脚本不能只写一套通配。
2.2 字段与记录的完整字典
把官方数据说明逐条拆开,能得到下面这张对照表。左列是文件或字段,中列是官方给的口径,右列是读取时要注意的地方。
| 文件或字段 | 官方口径 | 读取注意 |
|---|---|---|
| Behavioral_data 的 CSV | 场次名 + 受试者编号,含行为与按键 | 场次词是 Calming 与 Vexing |
| Biopac EDA | 皮电,微西门子 | 与 Empatica 的 EDA 是两套独立测量 |
| Biopac ECG | 心电波形 | 原始采样 2 千赫兹 |
| Biopac PPG | 光电容积脉搏 | 与腕带 BVP 同源不同设备 |
| Biopac RESP | 呼吸带位移 | 反映胸廓收缩与扩张 |
| Biopac EMG | 表面肌电 | 贴附位置官方未细述 |
| Timing 的 block 文件 | 每个区块的起始触发器 | 用于切区块 |
| Timing 的 trial 文件 | 每个试次的触发器 | 用于切单试次 |
| fNIRS 的 tothb | 总血红蛋白,单位写作 mmol | 单位记法偏简,按官方原文 |
| fNIRS 的 ohb | 氧合血红蛋白 | 论文中记作 HbO |
| fNIRS 的 dohb | 脱氧血红蛋白 | 论文中记作 HbR |
| fNIRS 的 O2 | 血氧饱和度 | 与其他三路同表 |
| fNIRS 触发器表 | Excel,按会话与受试者 | 用于与 Biopac 对齐 |
| Empatica TEMP | 皮温,摄氏度 | 首行时间,次行采样率 |
| Empatica EDA | 皮电,微西门子 | 与 Biopac EDA 可互为校验 |
| Empatica BVP | 血容量脉搏 | 由它派生出 IBI 与 HR |
| Empatica ACC | 三轴加速度,单位 1/64 g | 量程正负 2 g |
| Empatica IBI | 逐搏间期,秒 | 无采样率,两列 |
| Empatica HR | 平均心率 | 由 BVP 抽取 |
| Empatica tags | 按键事件时刻 | 与状态灯点亮同刻 |
| 表情 state 文件 | 每帧最可能的状态 | 纯文本,逐行 |
| 表情 detailed 文件 | 每帧各状态的概率分布 | 与 state 一一对应 |
有一处需要留意:官方把 fNIRS 四种量的单位统一写作 mmol。血红蛋白浓度的常规写法会带长度量纲,这里只写了毫摩尔。这不影响读取,但写方法学时应照抄官方单位,不要自行补一个量纲上去。
2.3 一条记录的完整解剖
拿受试者 3 的 Calming 场次做例子,从目录走到一个具体数值,中间要经过四层。
#-- 逐层解剖:目录 -> 文件 -> 行 -> 采样点
from pathlib import Path
import pandas as pd
root = Path("multimodal-nback-music")
beh = pd.read_csv(root / "Behavioral_data" / "Calming_3.csv")
print(beh.shape, list(beh.columns)[:8])
#-- Empatica 的 csv 头两行是元信息,不是数据
emp = root / "Empatica_data" / "subject_3F" / "EDA.csv"
head = emp.read_text().splitlines()[:3]
print("首行起始时间", head[0])
print("次行采样率", head[1])
eda = pd.read_csv(emp, header=2, names=["eda"])
print("样本数", len(eda), "均值", round(eda["eda"].mean(), 3))
#-- fNIRS 每个量一个文件,44 列对应 44 通道
nir = pd.read_csv(root / "fNIRS_data" / "3F_ohb.csv")
print("fNIRS 形状", nir.shape)
跑完会看到三层不同的形状:行为表是「一行一个试次」,Empatica 是「一行一个采样点」且头部两行不是数据,fNIRS 是「一行一个时刻、一列一个通道」。这三种形状混在同一个库里,是这个数据集最先要适应的东西。
| 解剖层级 | 内容 | 数量 | 备注 |
|---|---|---|---|
| 库 | 全部留存受试者 | 五人 | 编号不连续 |
| 受试者 | 一个人的全部记录 | 两场 | Calming 与 Vexing |
| 场次 | 一次 964 秒的连续记录 | 每场 16 个区块 | 含区块间与场中休息 |
| 区块 | 一种 n-back 条件 | 22 个试次 | 块前 5 秒指令 |
| 试次 | 一个字母 | 0.5 秒呈现 + 1.5 秒注视 | 逐试次有对错与反应时 |
| 采样点 | 一路信号的一个时刻 | 因设备而异 | 2 千赫兹与 7.6294 赫兹并存 |
2.4 时序账:964 秒是怎么拼出来的
官方给的几个时间数字彼此咬合得很紧,值得单独核一遍,因为它是判断「文件是否完整」最省事的尺子。
单个区块 49 秒:开头 5 秒指令,然后 22 个试次,每个试次 0.5 秒字母加 1.5 秒注视十字,合计 5 + 22 × 2 = 49。区块之间另有 10 秒放松窗,屏幕显示注视十字。八个区块之后插入一次 20 秒的场中休息。
一场 16 个区块,于是:16 × 49 = 784,加 16 × 10 = 160,加 20 秒场中休息,正好 964。三个数字严丝合缝,说明 964 秒这个总时长把区块后的放松窗也算进去了,而不是只算任务段。
| 时段 | 单次时长 | 一场出现次数 | 小计 |
|---|---|---|---|
| 区块指令 | 5 秒 | 16 | 80 秒 |
| 字母呈现 | 0.5 秒 | 352 | 176 秒 |
| 注视十字 | 1.5 秒 | 352 | 528 秒 |
| 区块后放松 | 10 秒 | 16 | 160 秒 |
| 场中休息 | 20 秒 | 1 | 20 秒 |
| 合计 | — | — | 964 秒 |
#-- 用官方给的四个数复核总时长,对不上说明有一项理解错了
blocks, trials, instr, stim, isi, rest, mid = 16, 22, 5, 0.5, 1.5, 10, 20
block_len = instr + trials * (stim + isi)
total = blocks * block_len + blocks * rest + mid
print(block_len, total)
assert block_len == 49 and total == 964
两场之间还有一次 2 分钟的休息,官方没有把它计入 964 秒,所以两场之间的实际间隔比单场时长之外的空白更短。做跨场次拼接时,这 120 秒必须显式补进去,否则第二场的时间轴会整体前移两分钟。
2.5 与同类资源的字段差异
同为「任务态 + 生理信号」,不同库在字段设计上的取向差别很大,而这些差别直接决定能做什么。
| 字段维度 | 本库 | 心算脑电类 | 稳态视觉诱发电位类 | 穿戴压力类 |
|---|---|---|---|---|
| 受试者规模 | 五人 | 三十余人 | 十余人 | 十余人 |
| 神经信号 | 44 通道 fNIRS | 十九至六十四导脑电 | 八至十六导脑电 | 无 |
| 外周信号 | 六路 | 通常仅心电 | 通常无 | 三至四路 |
| 表情或视频 | 表情评分 | 无 | 无 | 无 |
| 行为粒度 | 逐试次对错与反应时 | 段级汇总 | 逐试次 | 段级 |
| 条件设计 | 两档负荷 × 两场音乐 | 单一任务 | 多频率刺激 | 多情境 |
| 采样率 | 2 千赫兹与 7.6294 赫兹 | 数百赫兹 | 数百至千赫兹 | 数十赫兹 |
它真正的稀缺处在最后三列之外的那一列:同时有神经、外周、表情、行为四层,且共享同一套触发器。代价是每一层的深度都不够。
§3 它是谁的数据:两所学校、一间实验室、五个人
3.1 五位作者与两个机构
作者栏是五个人,机构是两家:纽约大学与休斯顿大学。页面标注的隶属关系里,第一作者与通讯作者在纽约大学,中间三位在休斯顿大学电子与计算机工程系。这是一条跨州的合作线,采集地点在休斯顿。
| 角色 | 姓名 | 页面标注机构 |
|---|---|---|
| 第一作者 | Saman Khazaei | 纽约大学 |
| 作者 | Srinidhi Parshi | 休斯顿大学电子与计算机工程系 |
| 作者 | Samiul Alam | 休斯顿大学 |
| 作者 | Md Rafiul Amin | 休斯顿大学 |
| 通讯作者 | Rose T. Faghih | 纽约大学 |
五位作者同时也是 2024 年那篇论文的作者,顺序一致。数据集页面另有一句致谢,感谢 Dilranjan S. Wickramasuriya 在采集期间的贡献——他不在作者栏,属于采集协助。
3.2 配套论文说了什么
论文标题比数据集多一个尾巴:a pilot study。这三个词很关键,它把这份工作的定位说清楚了——这是一次可行性试验,不是一份确立结论的研究。
摘要给了四层信息。第一层是动机:解码音乐刺激与认知负荷共同作用下的隐藏脑状态,是闭环脑机接口的前提。第二层是方法:用皮电估计唤醒度,用行为估计表现,用氧合血红蛋白关联表现,并计算每个音乐场次的总血红蛋白信号能量。第三层是结果:唤醒度随任务难度变化不大,但随音乐类型变化明显;表现指数在激昂场次更好;氧合血红蛋白与表现的正相关在 3-back 条件下最强;总血红蛋白能量峰值出现在激昂场次。第四层是讨论:这些结果支持把音乐当作调节认知状态的一种干预手段。
读这篇摘要要分清两件事:它证明了作者在自己的五个人身上看到了什么,不等于这两件事在别人身上也成立。样本量已经在标题里自我标注了。
3.3 时间线
| 时间 | 事件 | 依据 |
|---|---|---|
| 2024 年 | 论文发表于 Frontiers in Neuroscience 第 18 卷 | 论文元数据 |
| 2024 年 | 同组另一篇方法论文发表于 IEEE OJEMB | 数据集页参考文献第 10 条 |
| 2025 年 2 月 26 日 | 数据集 1.0.0 版上线 PhysioNet | 项目页版本栏 |
| 2025 年之后 | 页面仅显示一个版本,无修订记录 | 项目页版本栏 |
数据晚于论文一年上线,这个顺序影响引用方式:引用数据要写版本号与 DOI,引用方法要写论文 DOI,两者不能相互替代。
3.4 采集现场:五台设备同时开
官方的设备清单写得很具体,逐条对应到文件,能还原出采集台上的样子。
| 设备 | 采集内容 | 关键参数 | 产出目录 |
|---|---|---|---|
| Biopac MP160 配 BioNomadix | 心电、皮电、呼吸、脉搏、肌电 | 原始 2 千赫兹,起点置零 | Biopac_data 五个子目录 |
| Empatica E4 腕带 | 皮温、皮电、脉搏、加速度、逐搏间期、心率 | 采样率逐文件写在第二行 | Empatica_data |
| NIRSport 2 | 前额 44 通道近红外 | 7.6294 赫兹,经 Nirslab 处理 | fNIRS_data |
| FaceReader(Noldus) | 面部表情状态与概率 | 逐帧,两种文本文件 | Face_reader_data |
| E-Prime 配 Chronos | 刺激呈现、按键、触发器 | 行为与时间戳 | Behavioral_data 与 Timing |
两套皮电同时存在,是这个库的一个隐含优势:Biopac 的有线通道与 Empatica 的腕带通道测的是同一个生理量,可以互为校验。如果两路在同一时段出现不一致的漂移,多半是电极接触或佩戴位置的问题,而不是生理变化。
3.5 现场布置:一台电视、一台笔记本、两台采集机
刺激呈现的链路是这样的:笔记本电脑经 HDMI 接到一台 65 英寸智能电视,字母与注视十字都显示在电视上;另一台笔记本接所有采集设备,负责记录。两台机器分开,是为了避免采集软件的负载影响刺激呈现的时序。
这个布置带来一个后果:刺激端与采集端的时钟是两台机器各自的。官方对此的处理是把 Biopac 与 fNIRS 的时间轴起点都置零,再用 Chronos 发出的触发器把两端对齐。所以对齐的锚点不是绝对时间,而是触发器。
| 现场要素 | 取值 | 对数据的影响 |
|---|---|---|
| 显示设备 | 65 英寸智能电视 | 视角大,视觉诱发更强 |
| 呈现端 | 笔记本经 HDMI 输出 | 与采集端时钟独立 |
| 采集端 | 另一台笔记本 | 记录所有设备 |
| 对齐锚点 | Chronos 触发器 | 时间轴置零后按触发器对齐 |
| 座椅与距离 | 官方未写 | 视角与照度无法复算 |
§4 它最独特的东西:把音乐当成自变量
4.1 两场音乐,两种唤醒
这个库和绝大多数工作记忆数据集的区别,就在背景里那段声音。多数 n-back 实验把环境噪声当作要消除的干扰,这里反过来,把它当成要操纵的条件。
音乐的来源也很特别:不是实验者选的标准化曲目,而是请受试者自己提供。官方说用了两类内容,一类舒缓,一类激昂,第一场放舒缓的,第二场放激昂的。这个做法有一个明显的好处和一个明显的代价。好处是每个人听到的都是自己熟悉的、愿意听的音乐,唤醒效果更真实;代价是曲目在人与人之间完全不同,「激昂」这个条件在不同人身上不是同一件事。
| 设计要素 | 本库做法 | 常见做法 | 后果 |
|---|---|---|---|
| 音乐来源 | 受试者自选 | 实验者指定标准曲目 | 生态效度高,可比性低 |
| 音乐类型 | 舒缓与激昂两类 | 单一背景或无音乐 | 有对照,但无中性基线 |
| 场次顺序 | 舒缓在前,激昂在后 | 随机或交叉平衡 | 与顺序效应混淆 |
| 场次标注 | Calming 与 Vexing | 通常用情绪维度命名 | 标注词与叙述词不一致 |
| 场次间隔 | 2 分钟休息 | 常更长 | 疲劳与残留效应难分离 |
值得注意的是标注词:第一场标 Calming,第二场标 Vexing。而摘要与方法的叙述里用的是 calming 与 exciting。Vexing 的语气比 exciting 更负面,两者不是同义词。这里不判断哪个更准确,只提醒:读文件名时看到的是 Vexing,读正文时看到的是 exciting,指同一个场次。
4.2 1-back 与 3-back 只差两格,负荷差很多
任务本身是字母版的 n-back:屏幕上一个字母接一个字母地出现,受试者判断当前这个是否与前第 n 个相同。n 等于 1 时,只需要把上一个字母留在脑子里;n 等于 3 时,要同时维持三个并不断更新。
这两个条件在脑力上的差别,比「一格」与「三格」的字面差距大得多。1-back 更接近感觉登记加简单匹配,3-back 才真正压到工作记忆的更新环节。多数 n-back 研究把 2-back 当标准难度,这里跳过 2-back 直接用 1 与 3,两端拉得更开,二分类的可分性可能更好,但也失去了中间档。
| 条件 | 需要维持的项目数 | 认知成分 | 每场区块数 | 每场试次 |
|---|---|---|---|---|
| 1-back | 1 个 | 维持与匹配 | 8 | 176 |
| 3-back | 3 个 | 维持、更新与抑制 | 8 | 176 |
| 合计 | — | — | 16 | 352 |
每个区块之前有 5 秒指令,屏幕会明确写出这一块是 1-back 还是 3-back。这一点很重要:条件标签不需要从文件里推断,区块起点与类型都可以从触发器与指令时段对上。
4.3 案例:受试者 3 的三十一分钟
拿一个人走一遍,比抽象描述有用。选编号 3,理由很实在:它是附表里第一行五列全勾的人,也是官方举例时用的目录名 subject_3F。
她的两场各 964 秒,合计 1928 秒,约三十二分钟。第一场 Calming,第二场 Vexing,中间 120 秒休息。每场 16 个区块、352 个试次,两场共 32 个区块、704 个试次。这 704 个试次里,一半是 1-back,一半是 3-back,每个试次都有一次判断、一个对错、一个反应时。
在这三十二分钟里,她身上的设备同时在记:Biopac 以 2 千赫兹记心电、皮电、呼吸、脉搏、肌电;腕带以各自采样率记皮温、皮电、脉搏、加速度与逐搏间期;NIRSport 2 以 7.6294 赫兹记前额 44 个通道;摄像头录下她的脸,事后由 FaceReader 转成逐帧表情;E-Prime 记下每次按键。
§4.3 的案例换个角度看,它也是这个库最小的完整单元:一个人、两场、九类记录。全库只有五个这样的单元,其中编号 6 少了表情那一路,所以真正「九类齐全」的只有四个。
她在两场之间的差别,正是这个库想捕捉的东西:同样的字母流、同样的按键规则,只有背景里的音乐换了。但这个差别里还混着别的东西——第二场时她已经做过一遍,按键更熟练,坐姿可能更僵,也可能更放松。官方没有交叉平衡顺序,所以严格说来,场次差异是一个复合量。
4.4 九类记录怎么对上同一条时间轴
多设备数据集的第一道坎不是建模,是把时间对上。这个库的解法分三步,每一步都能在文件里找到落点。
第一步,把连续记录的时间轴起点置零。Biopac 与 fNIRS 都从 0 开始,官方明写。第二步,用 Chronos 发出的触发器标记每个区块与每个试次的起点,触发器文件分 block 与 trial 两层。第三步,对无法置零的设备(腕带与表情录像),保留一个去标识后的绝对起点,靠这个起点反推相对偏移。
#-- 三步对齐:置零记录 + 触发器 + 绝对起点换算
import pandas as pd
#-- 第一步:Biopac 从 0 开始,直接按采样率还原时间轴
fs_bio = 2000
trig = pd.read_csv("Biopac_data/Timing/3F_Triggers_trial.csv")
trig["t_bio"] = trig["sample"] / fs_bio
#-- 第二步:fNIRS 也从 0 开始,但采样率不同
fs_nir = 7.6294
trig["t_nir"] = (trig["t_bio"] * fs_nir).round().astype(int)
#-- 第三步:腕带只有绝对起点,差值即相对时刻
onset = float(open("Empatica_data/subject_3F/EDA.csv").readline())
trig["t_emp"] = trig["unix"] - onset
print(trig[["t_bio", "t_nir", "t_emp"]].head())
这段的关键不是代码,而是那个 round()。7.6294 赫兹不是整数,一秒落不到整数个采样点上,任何按秒取整的做法都会累积漂移。正确做法是先把时间换算成采样点索引,再按索引切窗。
| 对齐环节 | 依据 | 精度 | 风险 |
|---|---|---|---|
| Biopac 时间轴 | 起点置零,2 千赫兹 | 0.5 毫秒 | 设备内部时钟漂移 |
| fNIRS 时间轴 | 起点置零,7.6294 赫兹 | 约 131 毫秒 | 非整数采样率累积误差 |
| 腕带时间轴 | 首行绝对时间戳 | 取决于采样率 | 与采集端时钟偏移 |
| 表情时间轴 | 首段视频起点 | 逐帧 | 视频分段接续的间隙 |
| 跨设备锚点 | Chronos 触发器 | 与触发器同精度 | 触发器丢失则整段错位 |
4.5 边界条件:什么情况下它不再适用
第一种,任务从两档变成连续难度。 只有 1-back 与 3-back 两个点,中间没有 2-back,也没有更难的四格。要画一条负荷与生理指标的曲线,两个点只能定一条直线,谈不上形状。
第二种,需要把音乐效应单独拎出来。 顺序固定、曲目自选、没有中性基线。三个条件叠在一起,音乐效应、顺序效应、曲目熟悉度效应无法分开。
第三种,需要秒级以下的神经响应。 fNIRS 的血流动力学响应本身滞后数秒,采样率又只有 7.6294 赫兹。事件相关式的分析在这里没有立足点。
第四种,需要人群层面的统计。 五个人,其中四个有完整九类记录。
第五种,需要原始视频或可复算的表情。 官方明确不公开录像,只给 FaceReader 的导出结果。想换一个表情识别模型重跑,做不到。
§5 怎么拿到:从授权到可训练张量
5.1 访问面:一个页面能开,目录打不开
这是使用这个库时最先遇到、也最容易被误判成「链接写错」的一件事。
项目页可以正常打开,摘要、方法、数据说明、参考文献全都在,许可写着 ODC-BY 1.0,访问政策写着「任何人只要遵守许可条款即可访问」。但文件目录这一层,在当前网络位置返回 403,页面上的文件区显示的是另一句话:该数据因法律或政策限制在本地区不可用。
| 入口 | 返回 | 说明 |
|---|---|---|
| 项目页 /content/multimodal-nback-music/ | 200 | 文档齐全,可读全文 |
| 文件目录 /files/multimodal-nback-music/1.0.0/ | 403 | 区域限制,非登录问题 |
| 页面文件区 | 提示不可用 | 与 403 同源 |
| 论文页 doi.org/10.3389/fnins.2024.1406814 | 可访问 | 开放获取,方法细节的主要来源 |
这个限制不影响对数据本身的判断,但影响「能不能现在就跑通」。如果你的网络位置同样受限,可用的替代路径有两条:换一个不受限的出口,或直接读论文的方法与结果部分,先把字段与流程理解清楚。两条都不改变数据的内容。
5.2 目录结构与下载
假设已经拿到访问权限,整包结构是六个文件夹加若干说明文本。下面的脚本先把整包拉下来再展开,随后核对人数。
#-- 拉整包并展开,随后清点受试者目录
BASE="https://physionet.org/files/multimodal-nback-music/1.0.0"
mkdir -p mnbm && cd mnbm
curl -sSL --retry 3 -o pkg.zip "$BASE/"
unzip -q pkg.zip
#-- 目录层级:六个顶层文件夹
ls -d */
#-- 受试者编号不连续,直接从目录名读,不要按 1..5 拼
ls Empatica_data | sort
最后一行是这份数据最容易踩的坑之一。留存编号是 3、4、6、8、11,如果按 range(1, 6) 拼路径,五个路径里四个是空的,而代码不会报错,只会安静地少读几个人。
| 获取方式 | 命令要点 | 适合 | 注意 |
|---|---|---|---|
| 整包 ZIP | 页面按钮 | 一次拿全 | 体积未知,先看页面 |
| 命令行下载 | curl 加 retry | 需要续传 | 403 时先确认出口 |
| 逐文件 | 拼目录 URL | 只取一人一场 | 目录名不连续 |
| 论文补充材料 | 论文页链接 | 只想要方法细节 | 不含原始信号 |
5.3 读 Biopac 与触发器
Biopac 的五类信号分在五个子目录,每类每人一份。触发器单独放,分区块级与试次级。读的时候两件事必须同时做:把触发器读进来,把采样率固定为 2 千赫兹。
#-- 读一路 Biopac 信号,并按区块触发器切成 16 段
import pandas as pd
fs = 2000
subj = "3F"
eda = pd.read_csv(f"Biopac_data/EDA/{subj}_EDA.csv", header=0)
sig = eda.iloc[:, 0].to_numpy()
blocks = pd.read_csv(f"Biopac_data/Timing/{subj}_Triggers_block.csv")
starts = (blocks["onset"] * fs).astype(int).to_numpy()
ends = list(starts[1:]) + [len(sig)]
segs = [sig[a:b] for a, b in zip(starts, ends)]
print("切出段数", len(segs), "首段时长秒", round(len(segs[0]) / fs, 1))
切出 16 段是正确结果。如果只有 15 段,多半是最后一个区块的终点没有补上,ends 那一行很关键。若段数变成 32,说明误读了试次级触发器。
| 读入对象 | 采样率 | 时间单位 | 常见错误 |
|---|---|---|---|
| Biopac EDA | 2000 赫兹 | 秒 | 当成 1 千赫兹,时长差一倍 |
| Biopac ECG | 2000 赫兹 | 秒 | 未做 R 波检测直接当心率 |
| fNIRS ohb | 7.6294 赫兹 | 秒 | 按整数赫兹取整 |
| Empatica EDA | 文件第二行给出 | 秒 | 把首行时间当数据 |
| 行为表 | 逐试次 | 秒 | 与区块触发器混用 |
5.4 读 fNIRS 与腕带
fNIRS 的四个量各一个文件,每个文件 44 列。腕带更麻烦一点:每个文件的前两行是元信息,第一行是起始时间,第二行是采样率。
#-- fNIRS 四路对齐,腕带跳过前两行
import pandas as pd
def nir(subj, kind):
df = pd.read_csv(f"fNIRS_data/{subj}_{kind}.csv")
df.columns = [f"ch{i:02d}" for i in range(df.shape[1])]
return df
ohb, dohb = nir("3F", "ohb"), nir("3F", "dohb")
print("通道数", ohb.shape[1], "样本数", len(ohb))
print("前额均值", round(float(ohb.mean().mean()), 5))
def empatica(subj, name):
path = f"Empatica_data/subject_{subj}/{name}.csv"
with open(path) as f:
t0, sr = float(f.readline()), float(f.readline())
df = pd.read_csv(path, header=2)
df["t"] = t0 + df.index / sr
return df
temp = empatica("3F", "TEMP")
print("腕带首样本时刻", temp["t"].iloc[0], "采样率约", round(1 / (temp["t"].iloc[1] - temp["t"].iloc[0]), 2))
44 这个数字要自己数一遍,因为它是判断 fNIRS 文件是否读对的最快方式。腕带那两行元信息如果不跳过,read_csv 会把时间戳当数据,均值算出来会是天文数字。
5.5 对齐与切窗
到这一步,各路信号都读进来了,剩下的是把它们放到同一个窗口里。窗口的边界应该由试次触发器决定,而不是按固定秒数切,因为区块之间有 10 秒与 20 秒的休息,固定步长会跨过这些空隙。
#-- 以试次为窗口单位,把 fNIRS 与行为表连起来
import numpy as np
import pandas as pd
fs_nir = 7.6294
trials = pd.read_csv("fNIRS_data/3F_Triggers.csv")
trials["i0"] = (trials["onset"] * fs_nir).round().astype(int)
X, y = [], []
for _, r in trials.iterrows():
i0, i1 = int(r["i0"]), int(r["i0"] + 2.0 * fs_nir)
win = ohb.iloc[i0:i1].to_numpy()
if win.shape[0] < 4:
continue
X.append(win.mean(axis=0))
y.append(int(r["condition"]))
X, y = np.vstack(X), np.array(y)
print("样本", X.shape, "两类计数", np.bincount(y))
按试次切出来的样本量看着很可观:一名受试者就有 704 行。这正是最危险的地方。这些行彼此高度相关——同一个区块里的 22 个试次共享一段血氧基线,同一个人的 704 个试次共享同一个前额解剖结构。把它们当独立样本,等于把一个信息量很小的数据集放大成一个大样本。
#-- 清点每人每场的文件数,缺一路就是缺一路
for s in 3F 4F 6F 8F 11F; do
n=$(ls "Biopac_data/EDA/${s}_EDA.csv" "fNIRS_data/${s}_ohb.csv" 2>/dev/null | wc -l)
echo "$s $n"
done
上面这段里的编号只是示例写法,实际后缀要以目录为准:官方只在举例处写了 subject_3F 这一种形态,其余人的性别后缀需要打开目录确认,不能凭编号猜。
5.6 六个最容易出错的地方
| 出错点 | 表现 | 原因 | 处理 |
|---|---|---|---|
| 按 1 到 5 循环编号 | 只读到一两个人 | 留存编号是 3、4、6、8、11 | 从目录列表读编号 |
| 把 704 试次当独立样本 | 准确率高得离谱 | 同一人同一区块高度相关 | 按受试者与区块分组划分 |
| 把腕带首行当数据 | 均值出现天文数字 | 前两行是时间与采样率 | header=2 或手工跳过 |
| 按整数赫兹切 fNIRS | 窗口逐渐偏移 | 采样率是 7.6294 | 用采样点索引而非秒 |
| 把 Vexing 当第三种条件 | 条件数对不上 | Vexing 就是第二场 | 场次只有两个 |
| 找脑电通道 | 一条都找不到 | 本库无脑电 | 改用 fNIRS,或换库 |
第三条与第四条是这个库特有的,其余四条在多数多设备数据集上都会遇到。第五条值得再说一句:Calming 与 Vexing 是场次标签,1-back 与 3-back 是区块标签,两者是正交的两维,不是四个并列类别。把它们拼成一个四分类,样本会被切成四份,每份更薄。
§6 与库内条目的关系
6.1 关系图谱
站内与脑电、生理信号相关的记录已经成规模,彼此的分工也清楚。与本库最需要划清界限的,是三类:同为 n-back 的近红外库、同为音乐刺激的库、以及各类以脑电为主的任务库。
| 库内记录 | 与本库的关系 | 主要差别 |
|---|---|---|
| mental-fnirs | 最接近的一份:同为 n-back 加 fNIRS | 它是 14 人单场、无音乐、另有经颅多普勒;本库五人两场、有音乐条件 |
| eegmat | 同为认知负荷任务,同为小样本 | 它是连续减法、纯脑电、只两种状态;本库是 n-back、无脑电、九类记录 |
| deap | 同为音乐刺激下的多模态记录 | 它是看音乐视频诱发情绪、32 人、有主观量表;本库是用音乐做背景、标签是负荷 |
| wesad | 同为可穿戴多路生理 | 它是压力情境诱发、15 人、以皮电与心电为主;本库另有近红外与表情 |
| body-sway-music-vr | 同为音乐刺激条件 | 它测的是身体摇摆,28 人、12 个条件;本库测的是工作记忆 |
| erpbci | 同属任务态神经信号 | 它是 P300 拼写、64 导脑电、逐次闪烁锁时;本库无锁时电生理 |
| mssvepdb | 同属视觉刺激任务 | 它是稳态视觉诱发电位、多范式多设备;本库的视觉刺激是字母 |
| meditation | 同属生理状态记录 | 它只有逐搏心率、无任务;本库任务结构完整 |
规律很清楚。库内以脑电为主的记录,靠导联数换空间分辨率,靠试次数换统计功效;本库反过来,放弃电生理,用近红外换前额深部的血流信息,用九类同步换观察窗口。它和 mental-fnirs 是同一族里的一对:任务相同、模态重叠,差别在有没有音乐这一维,以及样本的组织方式。
6.2 检索路径
站内检索用 slug multimodal-nback-music,或全名 A Multimodal Dataset for Investigating Working Memory in Presence of Music。中文关键词建议用「工作记忆 音乐」而不是单用「工作记忆」——后者会命中一批 n-back 相关记录;用「近红外」也会命中一批 fNIRS 库,需要再叠加「音乐」收窄。
按需求找:要 n-back 加近红外但不需要音乐条件,去 mental-fnirs;要纯脑电的认知负荷两状态对比,去 eegmat;要看音乐诱发的情绪与脑电,去 deap;要可穿戴压力检测,去 wesad;要看音乐对身体姿态的影响,去 body-sway-music-vr;要「音乐 + 工作记忆 + 多设备同步」这个交叉点,才轮到本库。
6.3 三张对照表:任务、标签粒度、同步方式
三个维度分开列,因为它们最容易混,也恰好决定了一个库能做什么。
第一张是任务与人群。
| 库 | 任务 | 受试者 | 样本单位 |
|---|---|---|---|
| 本库 | 字母 n-back,两场音乐 | 五人 | 试次 |
| mental-fnirs | 字母 n-back,单场 | 14 人 | 区块 |
| eegmat | 连续减法心算 | 36 人 | 段 |
| deap | 观看音乐视频 | 32 人 | 试次 |
| wesad | 压力情境诱发 | 15 人 | 窗口 |
第二张是标签粒度,决定能用什么统计单位。
| 库 | 最细标签 | 条件维度 | 是否有主观评分 |
|---|---|---|---|
| 本库 | 逐试次对错 | 负荷两档 × 音乐两场 | 无 |
| mental-fnirs | 区块级负荷 | 负荷多档 | 无 |
| eegmat | 段级两状态 | 静息与任务 | 无 |
| deap | 试次级多维 | 效价、唤醒、支配、喜好 | 有,1 至 9 分 |
| wesad | 窗口级三分类 | 中性、压力、娱乐 | 有 |
第三张是同步方式,这一维最容易被忽略,却直接决定多模态能不能真的联起来。
| 库 | 神经信号 | 同步锚点 | 需自行对齐的工作量 |
|---|---|---|---|
| 本库 | fNIRS 44 通道 | 触发器加置零时间轴 | 中,五台设备三套时钟 |
| mental-fnirs | fNIRS 加经颅多普勒 | 设备同步盒 | 中 |
| eegmat | 脑电 19 导 | 单文件内自然对齐 | 低 |
| deap | 脑电 32 导加外周 | 单文件内自然对齐 | 低 |
| wesad | 胸带加腕带 | 单文件内自然对齐 | 低 |
把三张表叠起来看,本库的位置很清楚:任务维度最多、同步成本最高、人群最少。它不是任何一份库的替代品,而是一个交叉点。想省事的场合,用别的库;只有当你确实需要「同一段任务、同一批人、两种音乐、九路同步」这个组合时,它的价值才成立。
6.4 与站外音乐与负荷资源的区别
站外常被拿来比较的有三类。
第一类是驾驶与飞行模拟中的负荷监测数据。标签来自路况或飞行阶段,生态效度高,场景不可控,受试者通常只有十几位。本库相反:条件可控到每个字母出现 0.5 秒,代价是完全脱离真实环境。
第二类是音乐治疗与康复方向的多模态记录。它们通常带临床量表与疗程信息,人群是患者,时间跨度以周计。本库只有一次到访、两场、健康人,跟这类数据几乎不重叠。
第三类是公开的 n-back 基准,把负荷当成一个纯粹的计算任务,尽量减少环境变量。本库反过来把环境变量做成条件之一。前者适合比模型,后者适合比条件。
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
先校正一个几乎一定会犯的误判:把「只有五个人」读成「这份数据不合格」。
这两件事在这批数据上不是一回事。五人不是采集能力的上限,是筛选的结果:11 人做完实验,凡是有设备没采全的被整体剔除,剩下的才是「九类记录齐全」的那几套。这个筛选标准很严,严到把一半以上的人扔掉了,但它保证了留下的人的每一路信号都能互相对上。对一个主打多设备同步的数据集来说,这个取舍是自洽的——宁可少几个人,也不要出现「三个人有近红外、两个人没有」的残缺组合。
校正之后,五维评分的读法也要跟着变。规模分低衡量的是「能不能喂饱模型」,不是「采得规不规矩」。真正的减分项在别处:音乐顺序不可交换、没有中性基线、没有主观评分、原始录像不公开、本地区访问受限。
还有一处误判要提:把「没有脑电」当成缺陷。对做脑电方法的课题,它确实是硬伤;但这个库的目标不是电生理,而是闭环干预——干预手段是音乐,观察窗口是外周与血流。近红外的空间分辨率优于脑电,能落到前额皮层,在这个目标下是合目的的选择,不是降级。同一份数据在不同课题下的正负号不同,这是判断任何模态选择时的基本前提。
7.1 五维评分
按 DAIMS 的常用维度打分,每项一至五分,分数针对「作为工作记忆负荷的多模态同步数据」这个用途。
| 维度 | 分数 | 理由 |
|---|---|---|
| 数据规模 | 1 | 五人、每人 704 试次,按人划分后训练集只剩四个 |
| 标注质量 | 2 | 逐试次对错可靠,但负荷标签只有两档,无主观评分 |
| 任务适配 | 4 | 多设备同步齐全,触发器分两层,条件正交清晰 |
| 文档完整 | 3 | 设备、时序、目录都写清了,但缺体积、缺采样率逐项表 |
| 可获取性 | 4 | 免注册、ODC-BY,但文件目录在本地区 403 |
合计十四分(满分二十五)。这个分布说明它不是全能选手:规模是硬伤,任务适配拉满,其余三项在中间。与同类多模态库相比,它在「同步做得干净」上领先,在「能拿来做多少事」上受人数限制。
「标注质量」如果按「标签是否正确」打分可以给四分——区块类型由实验程序写入,不靠人工判读;若按「能承载多少分析」打分,两分都偏高。它的标注是「少而准」,不是「多而全」。
7.2 标注质量的两层
第一层是标签是否正确。这一层它做得比多数库干净:区块类型由 E-Prime 程序在呈现时写入,试次对错由按键与标准答案自动比对,两者都不经过人工。触发器分 block 与 trial 两层,切窗时不用猜。
第二层是标签能承载多少信息。这一层很薄。负荷只有 1-back 与 3-back 两档,中间缺 2-back;场次只有两个,且顺序固定;没有任何主观评分,也没有疲劳、困倦、投入度这类协变量。§4.3 的案例里那 704 个试次,每一个都只有一个二值标签加一个连续的反应时,此外没有别的标注。
这两层合起来,决定了它的分析范式:能做「条件之间有没有差异」,做不了「负荷随时间的连续变化」。
7.3 已知的、可枚举的偏差
| 偏差 | 表现 | 影响 |
|---|---|---|
| 样本极小 | 五人,其中四人九类齐全 | 跨人结论的置信区间极宽 |
| 筛选偏严 | 11 人中剔除 6 人 | 留存者可能系统性偏「配合度高」 |
| 顺序不可交换 | 舒缓在前,激昂在后 | 场次效应与音乐效应混淆 |
| 曲目自选 | 每人音乐不同 | 「激昂」不是同一刺激 |
| 无中性基线 | 只有两种音乐 | 无法分离「有音乐」与「音乐类型」 |
| 无对照组 | 全部受试者做同一任务 | 无组间比较 |
| 无主观评分 | 只有行为与生理 | 无法校准负荷的主观量级 |
| 无脑电 | 神经层面只有 fNIRS | 毫秒级动态不可得 |
| 录像不公开 | 只给表情评分 | 换模型重跑不可能 |
| 区域受限 | 文件目录返回 403 | 部分网络位置无法直接获取 |
前四条是设计与筛选带来的,改不了;中间三条是实验范式的选择,可以规避或交代清楚;最后两条是发布策略与合规带来的,只能接受。
有一处统计上的提醒:这个库的天然统计单位是人,不是试次。按试次统计能把样本量做到数千,但同一区块的试次共享血氧基线,同一个人共享解剖结构,独立性不成立,显著性会被严重高估。稳妥的做法是每人每条件取一个汇总量,把样本量压到五,再做配对比较——结论会很弱,但那才是这份数据能支撑的强度。
7.4 外部验证矩阵
这个库在文献里的用法可以归成四类角色。判断依据是官方说明与论文摘要,不涉及具体数值比较。
| 验证角色 | 做法 | 讲得通的地方 | 风险 |
|---|---|---|---|
| 多设备同步的方法样例 | 复现触发器对齐流程 | 三层时间轴齐全 | 403 时流程跑不通 |
| 负荷与音乐的双因素分析 | 两档负荷 × 两场音乐 | 条件正交、区块均衡 | 场次与顺序混淆 |
| 皮电唤醒度建模 | 用皮电估计唤醒 | 两套皮电可互校 | 五人无法做跨人验证 |
| 近红外与行为关联 | 血氧与反应时做相关 | 论文已给出范式 | 相关不等于因果 |
| 闭环干预的原型演示 | 把音乐当可控输入 | 干预与观测同场 | 无实时回路,只是离线 |
第二类最贴合设计目的;第一类最适合教学;第三、四类受人数限制,只能当探索;第五类只能做离线演示,因为这个库没有实时反馈环节。
7.5 它为何能持续:把一次不可能并行的采集留成了文件
它发布至今只有一个版本,作者没有承诺维护,却仍有引用。原因不在规模,在于它替使用者省掉了一件几乎无法复现的事:让同一个人在同一天里,被五台设备同时盯着做两场不同音乐下的同一任务。
要做这件事,需要一间实验室、五台设备、两名实验员、一份伦理审批,以及十一名愿意坐满三十二分钟的受试者,最后还要接受「一半以上的人因数据不全被剔除」这个结果。这套流程无法外包,也无法靠拼接别的库得到——跨库拼出来的多模态,设备不同、时钟不同、任务不同,同步优势立刻消失。
边界同样明确:只在「多模态同步 + 条件对比」上成立。课题一旦转向大样本、连续负荷估计或毫秒级神经动态,短板立刻暴露。
成本也是原因。重做一次要五台设备和一整套排期;拿到这份数据只需要一次下载。
§8 生态位与历史
8.1 历史沿革
这批数据诞生在 PhysioNet 收录范围扩张的几年里。平台早期以心电、重症、睡眠为主,后来逐步纳入范式化的认知实验与可穿戴记录。本库属于后一类:不是为了临床监护顺手录的,而是为了一项具体的机制问题专门设计的。
它的加入方式也很典型:一个课题组做完 pilot 研究,把整理好的记录捐给平台,托管与版本管理交给平台。这让它在没有后续基金、没有维护团队的情况下也能长期可访问,也让文档停在「一次讲清」的状态——没有勘误,没有补充说明。
资助信息透露了它的来路:美国国家科学基金会两个项目,一个是 CAREER 性质的 MINDWATCH,全称大意是「面向可穿戴自适应闭环架构的多模态无创脑状态解码器」,另一个是可穿戴机器接口架构的基础研究。也就是说,这个库从立项起就是闭环系统的一块拼图,不是一份独立的数据集产品。
8.2 与挑战赛和聚合库的关系
它没有进过任何挑战赛。PhysioNet 历年挑战赛涉及的生理信号任务集中在心电、脑电、呼吸与重症,工作记忆与音乐干预从未成为赛题。这意味着它没有官方划分、没有排行榜、没有社区基线,也意味着它不会被刷分式的研究快速消耗。
它与聚合型资源的关系则相反。聚合库的价值在规模与统一格式,代价是把单个实验的细节磨平。本库恰好相反:五个人、六个文件夹、三套时钟,每个字段都对应一次真实的采集决定。两者不是替代关系,是粗细两层。
8.3 生态位:单被试深描的一端
把站内外的多模态库按「每人被记录多深」排:临床连续监护最浅,一路心电可以连续几天;竞赛集居中,每人几分钟到几十分钟、固定模态;本库在深的一端,一个人三十二分钟里被九类记录同时覆盖;再往深走,就是需要卧床与多导睡眠的整夜记录。
这个位置带来两个稳定用途:一是多设备同步的方法样例,任何要做「触发器对齐」的团队都能从这里抄一遍流程;二是闭环干预的原型素材,音乐是最容易施加的干预之一,而这个库提供了干预前后的完整观测。
这个位置也不容易被替代。拼一个模态更多的库不难,难的是让所有模态共享同一套触发器、同一段时间轴、同一批人——而这恰恰是扩大规模时最先放弃的东西。
8.4 谁在用它,用来做什么
从公开信息看,引用集中在三个方向。第一是同组的方法论文,2024 年发表在 IEEE 开放期刊上的那篇,用贝叶斯方法从皮电与行为反推隐藏的认知表现与唤醒状态,本库是它的数据来源。第二是多模态融合的探索性工作,把皮电、心电、近红外拼在一起看负荷。第三是音乐干预与人因方向的综述性引用,把它当作「音乐作为可控变量」的一个例子。
还有一类不常被提及的用法:教学。一次实验、两场、九类记录、六个文件夹,链路每一环都有文字说明,人数少到可以在一节课里讲完整个人。它不宏大,但足够完整。
§9 使用指引
9.1 三种角色的路径
算法研究者的最短路径。 先确认访问权限,按 §5.2 拿全量,从一个人一场开始跑通读取与对齐,再按受试者分组做留一,最后才考虑是否需要全量。别一上来就把 704 个试次打散。
认知神经科学方向的最短路径。 先读方法与 964 秒的时序账,理解区块、试次、休息的边界,再挑一名受试者(推荐 §4.3 的案例)把 fNIRS 与行为对齐一次。然后比较 1-back 与 3-back 的血氧差异,在两场里分别看,判断结论是否只在某一场上成立。
工程落地方向的最短路径。 先确认要的是离线分析还是在线回路。离线可直接用;在线要自己定义实时特征与闭环策略,这个库帮不上忙——它没有实时反馈环节,把它当「多模态同步的离线上界」估计更合适。
三种角色有一个共同的起点:都先把一个人一场跑通,再谈全量。这个库的人数少,看上去可以直接上全量,但顺序反过来更省时间——链路上一半的错都在读取与对齐这两步,而这两步用一个人就能验证。
9.2 一条最短的可用流程
从零到第一个诚实可比的数字,下面这段够用。它不追求性能,只保证每一步都对得上。
#-- 最小可用流程:按受试者分组,区块内取均值做特征
import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GroupKFold
from sklearn.metrics import roc_auc_score
FS = 7.6294
def one_subject(subj):
ohb = pd.read_csv(f"fNIRS_data/{subj}_ohb.csv")
eda = pd.read_csv(f"Biopac_data/EDA/{subj}_EDA.csv").iloc[:, 0].to_numpy()
trig = pd.read_csv(f"fNIRS_data/{subj}_Triggers.csv")
rows = []
for bid, g in trig.groupby("block"):
i0 = int(g["onset"].min() * FS)
i1 = int((g["onset"].max() + 2.0) * FS)
win = ohb.iloc[i0:i1].to_numpy()
if win.shape[0] < 4:
continue
e0, e1 = int(i0 / FS * 2000), int(i1 / FS * 2000)
rows.append({
"subj": subj,
"block": bid,
"label": int(g["condition"].iloc[0]),
"nir_mean": float(win.mean()),
"nir_std": float(win.std()),
"eda_mean": float(eda[e0:e1].mean()),
})
return pd.DataFrame(rows)
df = pd.concat([one_subject(s) for s in ["3F", "4F", "6F", "8F", "11F"]],
ignore_index=True)
X = df[["nir_mean", "nir_std", "eda_mean"]].to_numpy()
y = df["label"].to_numpy()
for tr, te in GroupKFold(n_splits=5).split(X, y, groups=df["subj"]):
clf = LogisticRegression(max_iter=1000).fit(X[tr], y[tr])
print("留一人 AUC", round(roc_auc_score(y[te], clf.predict_proba(X[te])[:, 1]), 3))
这里刻意用 GroupKFold 并按 subj 分组:五个人正好五折,每一折都是「用四个人预测第五个人」。得到的数字通常不好看,这正是这份数据的诚实之处——五个人的跨人可分性,本来就不该期待太高。
9.3 引用方式
官方要求引用三件东西:数据集本身、2024 年的论文、以及 PhysioNet 平台。
数据集那一条要写到版本级:名称、版本号 1.0.0、DOI 10.13026/6vh4-dk68、访问日期。论文那一条是 Khazaei 与 Parshi 等五人于 2024 年发表在 Frontiers in Neuroscience 第 18 卷、文章号 1406814 的 pilot 研究,DOI 10.3389/fnins.2024.1406814。平台那一条按 PhysioNet 的现行建议引用其 2026 年的平台综述。
若做了再加工(重参考、重采样、重新切窗),应在方法里写清步骤,因为这些会改变别人复现的结果。许可为 ODC-BY 1.0,允许商用与再分发,条件是署名。
§10 AI 使用声明
| 项目 | 声明 |
|---|---|
| 文本生成 | 本文由 AI 辅助撰写,编辑负责结构与事实核对 |
| 数字来源 | 规模、结构、边界三类数字取自 PhysioNet 官方页面与配套论文摘要 |
| 页面核验 | 项目页于 2026 年 10 月 28 日直接访问,返回 200,正文逐段读取 |
| 文件核验 | 文件目录返回 403,未能读取任何原始文件,字段结构取自官方文字说明 |
| 口径冲突 | Calming 与 Vexing、calming 与 exciting 两组词已在 §4.1 并列呈现 |
| 论文信息 | 仅参考 Europe PMC 返回的摘要与元数据,未读全文 |
| 未核验内容 | 实际文件体积、逐人性别后缀、Empatica 逐文件采样率、表情评分覆盖人数 |
| 图像 | 无配图;封面为生成式提示词,不含真实生理波形 |
| 免责 | 本文不构成任何临床或工程建议;使用须遵守 ODC-BY 1.0 署名条款 |
常见误读(避坑清单)
| 说法 | 实际 | 证据 |
|---|---|---|
| 「这是一个脑电多模态库」 | 没有任何脑电通道 | 官方信号清单七路生理加表情加行为,无 EEG |
| 「有十一名受试者」 | 招募 11 人,留存 5 人 | 附表只有编号 3、4、6、8、11 五行带勾 |
| 「编号是 1 到 5」 | 编号不重排,为 3、4、6、8、11 | 官方附表与目录举例 |
| 「每人只做了几分钟」 | 每人两场,每场 964 秒 | 方法段明写单场时长 |
| 「每场有 8 个区块」 | 每场 16 个区块,两种各 8 个 | 摘要与方法一致 |
| 「第二场标注是 Exciting」 | 标注为 Vexing,正文用 exciting | 方法段的场次命名 |
| 「有主观情绪或负荷评分」 | 一份都没有 | 官方局限段自述 |
| 「面部表情有五个人的」 | 编号 6 缺表情那一路 | 附表表情列未勾 |
| 「可以按试次随机切分」 | 必须按受试者与区块分组 | 每人 704 试次高度相关 |
| 「数据随时可直接下载」 | 文件目录在部分区域返回 403 | 2026 年 10 月 28 日访问结果 |
FAQ
Q1:一共几名受试者,为什么只有五个?
官方写明最初招募 11 人,但因为并非每位都采全了所有传感器,模态过少的被整体剔除,最终留下编号 3、4、6、8、11 共五人。编号没有重排,所以不能按 1 到 5 循环。
Q2:这个库里有脑电吗?
没有。记录项是皮电、心电、皮温、呼吸、脉搏、肌电、fNIRS、面部表情评分与行为,没有任何脑电通道。神经层面只有 44 通道功能近红外,量的是前额血氧动力学。
Q3:一场实验多长、多少试次?
单场 964 秒,约 16 分钟,含 16 个区块(1-back 与 3-back 各 8 个),每块 22 试次,即每场 352 试次。两场合计每人 704 试次、32 个区块。
Q4:两个场次的标签是什么?
分别是 Calming 与 Vexing。官方叙述里第一场配舒缓音乐、第二场配激昂音乐,但标注词用的是 Calming 与 Vexing,与正文的 calming、exciting 不是同一组词。
Q5:为什么文件下载不了?
项目页可以打开,但文件目录在本地区返回 403,页面同时显示该数据因法律或政策限制在本地区不可用。这不是需要登录,也不是链接写错。
Q6:fNIRS 输出哪些量、什么单位?
四种:总血红蛋白、氧合血红蛋白、脱氧血红蛋白与血氧饱和度。官方把单位统一写作毫摩尔,未附长度量纲,写方法学时照抄原文即可。
Q7:采样率是多少?
Biopac 原始记录为 2 千赫兹,fNIRS 为 7.6294 赫兹。Empatica 腕带的采样率逐文件写在第二行,官方没有汇总表,只能逐文件读。
Q8:音乐是什么曲子?
由受试者自己提供,分舒缓与激昂两类,第一场放舒缓的,第二场放激昂的。曲目在人与人之间不同,官方没有公布清单。
Q9:能不能做跨被试分类?
能,但要接受结果很弱。五个人正好五折,每折用四个人训练、一个人测试;把 704 个试次打散随机切分得到的准确率几乎都来自同一个人。
Q10:面部表情是原始视频吗?
不是。官方明确不公开录像,只提供 FaceReader 导出的逐帧状态与概率分布,两类文本文件。
Q11:有没有对照组或患者数据?
都没有。全部是健康成人志愿者,无对照组,官方自己把「absence of a control group」列为局限之一。
Q12:许可允许商用吗?
ODC-BY 1.0 允许,包括商业用途,条件是署名。署名要覆盖数据集与 PhysioNet 平台两层,并同时引用 2024 年那篇论文。
术语表
| 术语 | 解释 |
|---|---|
| n-back | 判断当前刺激是否与前第 n 个刺激相同的连续工作记忆任务 |
| 1-back | 只需与上一个刺激比较,负荷较低的档位 |
| 3-back | 需同时维持三个刺激并持续更新,负荷较高的档位 |
| 区块 | 一段连续的同一条件试次,本库为 22 试次 |
| 试次 | 一次字母呈现加一次判断,本库为 0.5 秒呈现加 1.5 秒注视 |
| 工作记忆 | 在秒级时间内维持与操作信息的认知系统 |
| 认知负荷 | 任务占用工作记忆资源的程度,本库用 n 值代理 |
| 唤醒度 | 生理激活水平,本库用皮电与心率相关指标近似 |
| 闭环脑机接口 | 测量状态、施加干预、再测量的循环系统 |
| fNIRS | 功能近红外光谱,用近红外光测皮层血氧变化 |
| 氧合血红蛋白 | 携带氧的血红蛋白,fNIRS 的主要观测对象 |
| 脱氧血红蛋白 | 已释放氧的血红蛋白,与氧合量走势相反 |
| 总血红蛋白 | 氧合与脱氧之和,反映局部血容量 |
| 血流动力学响应 | 神经活动引起的血氧变化,滞后数秒 |
| 皮电活动 | 汗腺活动引起的皮肤电导变化,反映交感激活 |
| 光电容积脉搏波 | 用光吸收变化记录的血流搏动波形 |
| 逐搏间期 | 相邻两次心搏之间的时间,由脉搏波导出 |
| 表面肌电 | 体表电极记录到的肌肉电活动 |
| 面部动作编码 | 把面部表情分解为可计分单元的方法体系 |
| FaceReader | Noldus 出品的自动表情分析软件 |
| 触发器 | 标记事件时刻的电信号,用于跨设备对齐 |
| 时间轴置零 | 把记录起点设为 0 秒,便于按相对时刻定位 |
| 去标识 | 移除可直接识别个人的信息,本库按 HIPAA 十八条执行 |
| 受试者泄漏 | 同一人的样本同时进入训练与测试,导致成绩虚高 |
| 分组交叉验证 | 按受试者或区块分组切分,避免泄漏的验证方式 |
| pilot 研究 | 小规模可行性试验,用于验证范式而非确立结论 |
| ODC-BY | 开放数据共享署名许可,允许商用需署名 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 招募人数 | 11 | 摘要与方法段 | 官方页面 |
| 留存人数 | 5 | 附表带勾行 | 官方页面 |
| 留存编号 | 3、4、6、8、11 | 附表左列 | 官方页面 |
| 缺表情的人数 | 1(编号 6) | 附表表情列 | 官方页面 |
| 场次数 | 2 | 方法段 | 官方页面 |
| 每场区块数 | 16 | 摘要与方法段 | 官方页面 |
| 每场每类区块数 | 8 | 摘要 | 官方页面 |
| 每块试次数 | 22 | 摘要与方法段 | 官方页面 |
| 单场试次数 | 352 | 16 × 22 推算 | 官方数字推算 |
| 每人试次数 | 704 | 2 × 352 推算 | 官方数字推算 |
| 单块时长 | 49 秒 | 方法段明写 | 官方页面 |
| 指令时长 | 5 秒 | 方法段 | 官方页面 |
| 字母呈现 | 0.5 秒 | 方法段 | 官方页面 |
| 注视十字 | 1.5 秒 | 方法段 | 官方页面 |
| 区块后放松 | 10 秒 | 方法段 | 官方页面 |
| 场中休息 | 20 秒 | 方法段 | 官方页面 |
| 单场时长 | 964 秒 | 方法段明写 | 官方页面 |
| 场间休息 | 120 秒 | 方法段 | 官方页面 |
| Biopac 采样率 | 2 千赫兹 | 数据说明 | 官方页面 |
| fNIRS 通道数 | 44 | 数据说明 | 官方页面 |
| fNIRS 采样率 | 7.6294 赫兹 | 数据说明 | 官方页面 |
| fNIRS 输出量 | 4 种 | 数据说明 | 官方页面 |
| 屏幕尺寸 | 65 英寸 | 方法段 | 官方页面 |
| 伦理批号 | STUDY00002013 | 伦理段 | 官方页面 |
| 许可 | ODC-BY 1.0 | 页面许可栏 | 官方页面 |
| 数据 DOI | 10.13026/6vh4-dk68 | 页面发现栏 | 官方页面 |
| 论文 DOI | 10.3389/fnins.2024.1406814 | 页面引用栏 | 官方页面 |
| 首发日期 | 2025-02-26 | 页面版本栏 | 官方页面 |
附录 B:数字的来源分层
第一层,官方页面。 受试者数、留存编号、场次与区块结构、试次数、各项时长、采样率、通道数、输出量、设备型号、伦理批号、许可与两个 DOI,全部来自项目页的摘要、方法、数据说明、伦理与文件区文字。这一层可直接引用,重查可得同样结果。
第二层,官方数字推算。 单场试次 352、每人试次 704、单场区块合计时长 964 秒的构成,都是官方给出的几个数相乘相加的结果。推算过程在 §2.4 与附录 D 的代码里可复算,结论与官方明写的总时长一致,因此可信度高;但它们仍属推算,不是官方逐项列出。
第三层,论文摘要。 结果是「唤醒度随难度变化小、随音乐类型变化大」「表现指数在激昂场次更好」「氧合血红蛋白与表现的正相关在 3-back 最强」这三条,来自 Europe PMC 返回的摘要,只代表作者在自己五个人身上的观察。
第四层,未核实。 文件实际体积、逐人的性别后缀、Empatica 各文件的采样率、表情评分实际覆盖的帧数与时长、是否存在未公开的补充材料、两场之间的实际间隔是否严格为 120 秒。正文中凡涉及这些的地方,都只做定性表述或明确标注为「以目录为准」。
附录 C:完整参考文献
| 编号 | 文献 | 链接 | 用途 |
|---|---|---|---|
| 1 | A Multimodal Dataset for Investigating Working Memory in Presence of Music v1.0.0 | https://physionet.org/content/multimodal-nback-music/1.0.0/ | 规模、结构、边界数据 |
| 2 | 该库文件目录(本地区 403) | https://physionet.org/files/multimodal-nback-music/1.0.0/ | 目录结构的官方描述来源 |
| 3 | Khazaei S, Parshi S, Alam S, Amin MR, Faghih RT. Front Neurosci 2024;18:1406814 | https://doi.org/10.3389/fnins.2024.1406814 | 实验设计与主要结果 |
| 4 | 同上的 Europe PMC 摘要 | https://www.ebi.ac.uk/[europepmc](https://www.qianfanghub.com/ai-ready-dataset/europepmc/1353)/webservices/rest/search?query=DOI:10.3389/fnins.2024.1406814 | 摘要文本与元数据 |
| 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 | NIRx NIRSport 2 产品页 | https://nirx.net | 设备与 Nirslab 处理流程 |
| 8 | Empatica E4 数据格式说明 | https://www.empatica.com | 腕带七类文件的字段含义 |
| 9 | BIOPAC MP160 产品页 | https://www.biopac.com | 有线生理通道与采样能力 |
| 10 | mental-fnirs(库内对照) | https://physionet.org/content/mental-fnirs/1.0.0/ | §6.3 的任务与模态对比 |
附录 D:任务代码
把一名受试者的两场拼成一条时间轴,并标出区块类型,这段够用,不需要训练模型。
#-- 把两场拼成一条时间轴,逐块标出负荷与音乐
import numpy as np
import pandas as pd
FS, BLOCK, REST, MID, GAP = 7.6294, 49, 10, 20, 120
def timeline(subj):
out, t = [], 0.0
for session, music in ((1, "Calming"), (2, "Vexing")):
trig = pd.read_csv(f"Behavioral_data/{music}_{subj[:1]}.csv")
for k, bid in enumerate(trig["block"].unique()):
cond = int(trig.loc[trig["block"] == bid, "condition"].iloc[0])
out.append({"session": session, "music": music, "block": int(bid),
"load": cond, "t0": t, "t1": t + BLOCK})
t += BLOCK + REST
if k == 7:
t += MID
if session == 1:
t += GAP
return pd.DataFrame(out)
df = timeline("3F")
print(len(df), "块;总时长", round(df["t1"].max()))
print(df.groupby(["music", "load"]).size())
输出应当是 32 块,四组各 8 块,总时长落在两场之和加场间休息上。如果四组不均衡,多半是区块类型那一列读错了字段名。
附录 E:如果只记五件事
第一,它是 PhysioNet 上的工作记忆多模态库,五人、两场音乐、九类记录,2025 年 2 月发布 1.0.0 版。
第二,它没有脑电。神经层面只有 44 通道前额功能近红外,采样率 7.6294 赫兹。
第三,招募 11 人只留 5 人,编号 3、4、6、8、11 不重排,其中编号 6 缺面部表情。
第四,两场各 964 秒、16 个区块、352 个试次,1-back 与 3-back 各半;音乐顺序固定,舒缓在前、激昂在后。
第五,现实的用法是按受试者分组做五折,把区块当样本而不是把试次当样本;按试次随机切分得到的准确率几乎都来自同一个人。
编辑说明
核验时间 2026 年 10 月 28 日。核验方式:直接访问 PhysioNet 项目页,返回 200,逐段读取摘要、背景、方法、数据说明、去标识、使用说明、伦理、致谢与参考文献各节;读取受试者附表并逐行核对五行带勾记录;读取页面文件区与版本栏,确认单版本状态;尝试访问文件目录,返回 403,页面同时显示区域限制提示,故未读取任何原始文件。论文信息仅取 Europe PMC 返回的摘要与元数据。964 秒的时序构成按官方给出的四个数复算,与官方明写的总时长一致。场次标注词(Calming、Vexing)与叙述词(calming、exciting)按并列呈现,不作判断。未覆盖:文件实际体积、逐人性别后缀、Empatica 逐文件采样率、表情评分覆盖范围、采集年份。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- wearable-exam-stress — 共享标签:生理信号 / 可穿戴传感 / 神经科学 / 多模态
- mental-fnirs — 共享标签:生理信号 / 可穿戴传感 / 神经科学 / 多模态
- multimodal-gait-dataset — 共享标签:生理信号 / 可穿戴传感 / 神经科学 / 多模态
- wesad — 共享标签:生理信号 / 可穿戴传感 / 多模态
- cves — 共享标签:生理信号 / 神经科学 / 多模态
- dandi-archive — 共享标签:生理信号 / 神经科学 / 多模态
- nqmitcsxpd — 共享标签:生理信号 / 可穿戴传感 / 神经科学
- noneeg — 共享标签:生理信号 / 可穿戴传感 / 神经科学
- tappy — 共享标签:生理信号 / 可穿戴传感 / 神经科学
- cgmacros — 共享标签:生理信号 / 可穿戴传感 / 多模态
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

