信息速览
ECG-SPIDER-CLIP 的全名是 Electrocardiogram, skin conductance and respiration from spider-fearful individuals watching spider video clips,直译过来是「蜘蛛恐惧个体观看蜘蛛视频片段时的心电、皮肤电与呼吸信号」。它由萨尔兰大学临床心理学与心理治疗系牵头,联合弗劳恩霍夫生物医学工程研究所与特温特大学完成,2020 年 6 月 5 日经 PhysioNet 以 1.0.0 版发布:五十七名自报蜘蛛恐惧的成年人,每人约三十五分钟,三路信号,100 Hz。
这份数据的原始目的不是发表数据,而是给「在线焦虑水平检测」这项研究准备训练材料。参与者坐在实验室里先看一段示范片、再看十六段蜘蛛视频,身上接着心电电极与皮肤电传感器,胸带里嵌着压电片,三路信号同时被写进文件。研究者事后从这些波形里抽特征,训练一个能判断「此刻焦虑偏高还是偏低」的分类器。数据集是那项试验的副产物,公开是为了让别人不必重复采集一遍。
名字里的 SPIDER 与 CLIP 都容易被读错。SPIDER 不是某个标注工具或蜘蛛网状的数据结构,而是受试人群——怕蜘蛛的人;CLIP 不是那个图文对比学习模型,而是 video clip,视频片段。两个词连起来只描述了一件事:一群怕蜘蛛的人在看蜘蛛视频。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 官方全名 | Electrocardiogram, skin conductance and respiration from spider-fearful individuals watching spider video clips |
| 中文名 | 蜘蛛恐惧个体观看蜘蛛视频片段时的心电、皮肤电与呼吸信号 |
| 缩写拆解 | SPIDER = spider-fearful(怕蜘蛛的人),CLIP = video clip(视频片段) |
| 托管平台 | PhysioNet,Open Access 栏目 |
| 版本 | 1.0.0,2020 年 6 月 5 日发布 |
| DOI | 10.13026/sq6q-zg04(1.0.0 版) |
| 受试者 | 57 名,研究共纳入 80 名 18–40 岁参与者 |
| 记录单元 | 一名受试者的一个文件夹,内含四个 txt |
| 通道 | 3 路:心电、皮肤电、呼吸 |
| 采样率 | 标称 100 Hz,每通道 |
| 分辨率 | 10 位 |
| 单次时长 | 约 35 分钟 |
| 刺激材料 | 1 段示范片 + 16 段 1 分钟蜘蛛视频 + 5 分钟静息 |
| 采集设备 | BITalino ®evolution BLE,固件 5.1 |
| 采集地点与时间 | 德国萨尔布吕肯,2017 年 7 月至 2018 年 7 月 |
| 整包大小 | 解压 1.1 GB,压缩包 145.1 MB |
| 许可 | Open Data Commons Attribution License v1.0 |
| 配套论文 | Ihmig 等,PLoS ONE,2020 |
§1 它要解决的具体麻烦
1.1 恐惧没有时间戳,波形有
做焦虑检测的人迟早会撞上同一个矛盾:标签来自人的主观报告,信号来自身体的连续记录,两者天然不同步。让受试者看完一段视频再填一份量表,得到的是一个针对整段视频的分数;而心率在这六十秒里可能先冲高再回落,皮肤电的峰值往往滞后几秒才出现。把一个整段分数硬贴到每个采样点上,等于假设这六十秒里情绪是一条平线,这个假设在恐惧诱发范式里几乎必然失效。
暴露疗法的标准化恰好提供了另一条路。一段视频开始播、结束播,这两个动作可以被软件记录下来,形成一对时间戳。时间戳把连续的波形切成等长的窗口,每个窗口对应一个明确的外部事件,而不是一段模糊的自我报告。窗口内的信号仍然没有标签,但至少「看的是哪一段」这件事被固定住了。这份数据的设计价值主要在这里:它把一次三十分钟的暴露过程,变成十七个可以被单独索引的时间段。
1.2 三条常见的错误期待
第一条,期待它是通用情感计算数据集。 名字里有心电、皮肤电、呼吸,格式又是三列纯文本,很容易被当成 DEAP 那类「看视频、打情绪分」的标准配置。差别在于这份数据没有发布任何一个主观评分:没有效价、没有唤醒度、没有恐惧量表分数。它给的是一段被切好窗口的生理记录,情绪那一半在论文作者手里。
第二条,期待它是临床焦虑障碍数据。 受试者是「spider-fearful」,即自报害怕蜘蛛的人,不是经过结构化访谈确诊的蜘蛛恐惧症患者。招募靠自报,没有诊断分层,没有病程,没有用药记录。用它讨论「焦虑症患者的生理特征」,等于把一个亚临床样本当成临床样本。
第三条,期待它开箱即用。 文件是无表头的三列文本,时间戳抖动明显,三路信号各自独立存储、没有对齐到统一时间轴,视频还因为版权不在包里。任何一个环节处理错,切出来的窗口就会整体偏移。它的易用性属于「结构简单但需要手工对齐」那一类,不属于「读进来就是张量」那一类(§5.6)。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 恐惧诱发过程中的多模态生理记录 | 三路同步信号,五十七人,每人十七个时间窗 | 够,这是它的主业 |
| 窗口级的时间对齐依据 | 片段起止时间戳,秒级精度 | 够,但需自行重采样 |
| 低成本可穿戴设备的一致性评估 | 全部数据来自同一型号设备与同一固件 | 够,设备变量被控制 |
| 训练带情绪标签的分类器 | 无任何主观评分或窗口标签 | 不够,标签不在包里 |
| 复现论文报告的准确率 | 缺标签,也缺特征提取脚本 | 不够,只能复现到特征层 |
| 研究暴露疗法的临床效果 | 无治疗前后量表,无随访 | 不够,研究问题不在这里 |
| 研究心率变异生物反馈的作用 | 实施生物反馈的那一组整体不收录 | 不够,结构上缺席 |
| 复现刺激材料 | 视频因版权未发布,只有一张静帧 | 不够,只能近似 |
| 与临床十二导联心电对照 | 单导联,电极贴位未文档化 | 不够,无法换算 |
| 穿戴设备的快速预研 | 解压一点一吉字节,格式极简 | 够,半天能跑通 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 你在做焦虑或应激的生理识别,手头只有静息基线 | 提供真实诱发过程中的连续记录,含明确的刺激起止 | 先用片段窗口做无监督的聚类,看三路信号能否自动分出刺激段与静息段 |
| 你在评估一款低成本穿戴设备能不能做心理生理研究 | 全部数据出自 BITalino 一个型号,100 Hz、10 位,是真实的设备上限样本 | 拿它当「低配设备能做到什么程度」的参照,再决定要不要上更高采样率 |
| 你要做多模态融合,需要三路同步且互不同源的信号 | 心电、皮肤电、呼吸三种机制完全不同的通道,同一设备同一时钟 | 先做通道间的时间对齐与滞后分析,再谈融合 |
| 你在写论文,需要一个有随机对照试验背景的公开数据 | 有伦理批件、有方案论文、有结果论文,链条完整 | 引用时把数据集、方案论文、结果论文三件一起写清(§9.3) |
| 你在教心理生理学,需要一段可讲三十分钟的实录 | 一人一文件夹,四个纯文本,打开就能画图 | 用同一人的三段窗口对比刺激前后的皮肤电爬升 |
| 你想研究恐刺激的个体差异 | 五十七人,每人相同的十七个窗口,条件高度可比 | 按人汇总窗口特征,做个体层面的排序而不是总体平均 |
| 你要做刺激材料的可复现实验 | 视频不在包里,只有截图 | 换用公开的蜘蛛图片库,接受刺激强度不可比 |
1.5 一句话判断
它是一次心理学试验的录像带:五十七个人各看十七段蜘蛛视频,身体的三条曲线被原样留在四个文本文件里,标签留在了作者的另一台机器上。
1.6 不适合谁:四条边界
不适合做带标签的监督学习。 包里没有一个情绪标签。片段编号可以当刺激强度的粗略代理,但「CLIP-9 比 CLIP-3 更吓人」这件事没有任何数据支撑——十六段片段的顺序在每个受试者体内都被重新随机过,编号只代表素材库里的序号。
不适合做临床结论。 受试者是自报害怕蜘蛛的成年人,年龄十八到四十岁,来自德国西南部一所大学的招募。没有诊断、没有共病筛查、没有用药记录。任何「焦虑症患者如何如何」的推论都超出了样本能承载的范围。
不适合做生物反馈效果的比较。 四个实验组里,在暴露阶段实际使用心率变异生物反馈的那一组被整组剔除,理由是训练过的呼吸法会系统性改变心率与心率变异。剩下三组的差别在于暴露时执行的是哪一种安慰剂任务,而不是有没有真反馈。想比较反馈与无反馈,这份数据给不了对照。
不适合做导联级的心电形态研究。 单导联、100 Hz、10 位,QRS 波群在时间轴上只占八个采样点。做 R 峰检测、心率变异、呼吸性窦性心律不齐都够用;做 P 波时限、ST 段抬高、束支阻滞形态判断则不够。
§2 数据构成与规格
2.1 一个人一个文件夹,四个纯文本
解开压缩包,根目录下是五十七个以 VP 开头的文件夹,加四个散落文件。文件夹内部结构完全一致,没有任何子目录,也没有跨受试者的汇总表。这种把「一个人一次会话」当作最小封装单元的组织方式,让单例分析很方便,让队列分析必须自己写遍历。
| 层级 | 名称与数量 | 说明 |
|---|---|---|
| 根目录 | VP02 至 VP80,五十七个 |
编号不连续,缺号对应未收录者 |
| 根目录 | subject_groups.csv,一个 |
受试者与实验组的对应表 |
| 根目录 | LICENSE.txt,一个 |
ODC-BY 1.0 全文 |
| 根目录 | SHA256SUMS.txt,一个 |
逐文件校验和 |
| 根目录 | screenshot_spider.tif,一个 |
一段视频的静帧截图 |
| 受试者目录 | BitalinoECG.txt,五十七个 |
心电,毫伏 |
| 受试者目录 | BitalinoGSR.txt,五十七个 |
皮肤电导,微西门子 |
| 受试者目录 | BitalinoBR.txt,五十七个 |
呼吸胸带位移,百分比 |
| 受试者目录 | Triggers.txt,五十七个 |
片段起止时间表 |
文件总数二百三十二个,其中二百二十八个在受试者目录内。以 VP02 为例,三个信号文件的体量依次为皮肤电约七点四兆、心电约六点四兆、呼吸约六点一兆,排序与三路数值的有效位数一致:皮肤电的小数位最长,心电次之,呼吸最短。这只是文件体积的差别,与信号质量无关,但在估算下载时间时有用。
2.2 字段与信号的完整字典
三路信号共用同一种三列格式,没有表头,列之间用制表符分隔。三列的含义由官方数据说明给出,第二列的时间戳是唯一可用于对齐的信息。
| 信息项 | 存放在哪 | 取值或范围 | 是否每行都有 |
|---|---|---|---|
| 心电电压 | BitalinoECG.txt 第 1 列 |
-1.5 至 1.5 mV | 是 |
| 皮肤电导 | BitalinoGSR.txt 第 1 列 |
-12.6 至 41 µS | 是 |
| 呼吸位移 | BitalinoBR.txt 第 1 列 |
-50% 至 50% | 是 |
| 采样时间戳 | 各信号文件第 2 列 | hhmmss.毫秒 |
是 |
| 行标签 | 各信号文件第 3 列 | 恒为 Raw |
是 |
| 片段编号 | Triggers.txt 第 1 列 |
CLIP-1 至 CLIP-16 |
片段行 |
| 片段起始 | Triggers.txt 第 2 列 |
hhmmss |
片段行 |
| 片段结束 | Triggers.txt 第 3 列 |
hhmmss |
片段行 |
| 示范片标记 | Triggers.txt 第 1 列 |
CLIP-DEMO |
一行 |
| 静息段标记 | Triggers.txt 第 1 列 |
BIOFEEDBACK-REST |
一行 |
| 受试者编号 | 文件夹名 | VP 加两位数字 |
全库 |
| 分组归属 | subject_groups.csv |
Group2 / Group3 / Group4 | 全库 |
| 年龄 | 无 | 仅论文给出 18–40 岁区间 | 否 |
| 性别 | 无 | 未发布 | 否 |
| 焦虑评分 | 无 | 未发布 | 否 |
| 视频文件 | 无 | 因版权未发布 | 否 |
第三列的 Raw 是设备原始数据流的标记,官方明确说可以忽略。它存在的原因是 BITalino 的原生软件会在同一文件里混写处理前后的数据,导出时保留这一列以便追溯,实际内容全库一致。
2.3 一条记录的完整解剖
取 VP02 作为解剖对象,因为它是编号最小的在册受试者,也是全库第一个文件夹。目录里有四个文件,触发清单共十九行,信号文件从上午十一时二十七分五十五秒开始记录。
#-- 只看触发清单,不下载信号体
curl -sL https://physionet.org/files/ecg-spider-clip/1.0.0/VP02/Triggers.txt
#-- 只看前三行信号,确认三列格式
curl -sL -r 0-200 https://physionet.org/files/ecg-spider-clip/1.0.0/VP02/BitalinoECG.txt
触发清单按播放顺序排列,第一行是示范片,随后是十六段蜘蛛视频,最后两行是整场训练区间与五分钟静息。注意片段编号与行序并不一致:VP02 播放的第一段蜘蛛视频编号是 CLIP-4,第二段是 CLIP-1。这是方案里「每组八段内部随机」的直接痕迹(§3.3)。
| 解剖项 | VP02 的值 |
含义 |
|---|---|---|
| 文件夹名 | VP02 |
第二位入组编号,属 Group2 |
| 文件数 | 4 | 三路信号加一份触发表 |
| 触发行数 | 19 | 示范 1 + 片段 16 + 训练区间 1 + 静息 1 |
| 首条信号时间 | 112755.578 | 十一时二十七分五十五秒 |
| 心电首值 | -0.0557 mV | 静息基线附近 |
| 皮肤电首值 | 2.235 µS | 静息基线附近 |
| 呼吸首值 | -3.32% | 胸带静息位 |
| 皮肤电文件体量 | 约 7.4 MB | 三路中最大 |
| 心电文件体量 | 约 6.4 MB | 居中 |
| 呼吸文件体量 | 约 6.1 MB | 三路中最小 |
三个文件的体量都不大,但加起来接近二十兆字节一人,五十七人合计就是一点一吉字节。文本格式的代价在这里很直白:同样的采样点,二进制能省下四分之三的空间。
#-- 读进一个人的三路信号,按时间戳合并成一张表
import numpy as np
base = "https://physionet.org/files/ecg-spider-clip/1.0.0/VP02"
def read_signal(path):
arr = np.loadtxt(path, delimiter="\t", usecols=(0, 1), dtype=str)
value = arr[:, 0].astype(float)
stamp = arr[:, 1].astype(float)
return value, stamp
ecg, t_ecg = read_signal(f"{base}/BitalinoECG.txt")
gsr, t_gsr = read_signal(f"{base}/BitalinoGSR.txt")
br, t_br = read_signal(f"{base}/BitalinoBR.txt")
print(len(ecg), len(gsr), len(br))
print(t_ecg[0], t_ecg[-1], (t_ecg[-1] - t_ecg[0]) / 60.0)
三路长度不必相等。设备按通道分别写文件,任何一路的丢点都不会影响另外两路的行数。因此合并时不能按下标硬拼,必须用时间戳做最近邻或插值对齐。这一点在 §5.4 会展开。
2.4 编号空间与三个组的落位
受试者编号是一个从 VP01 到 VP80 的连续空间,实际在册五十七个,缺二十三个。缺号不是随机的,它们正好对应官方说明的两类剔除:第一组二十人整组不收录,另有三条记录因采集技术问题被丢弃。
| 分组 | 编号规律 | 应有与在册 | 差额 |
|---|---|---|---|
| Group1 | VP01、VP04、VP07 起,每三取一 | 20 与 0 | 20(整组不收录) |
| Group2 | VP02、VP05、VP08 起,每三取一 | 20 与 20 | 0 |
| Group3 | VP03、VP06、VP09 起,每三取一 | 19 与 18 | 1(VP21 缺) |
| Group4 | VP61 至 VP80 | 20 与 19 | 1(VP67 缺) |
| 未归类 | VP60 | 1 与 0 | 1(疑似技术故障) |
| 合计 | VP01 至 VP80 | 80 与 57 | 23 |
前六十个编号按「模三」轮流分配给前三个组,六十之后重新从 VP61 开始编号给第四组。这个编号方式让分组在文件名层面不可见,必须查 subject_groups.csv 才能还原。缺号与官方口径的差额刚好对上:二十加三等于二十三。哪三条属于技术故障,官方没有指名,从编号空缺看应落在 VP21、VP60、VP67。
2.5 与同类资源的字段差异
把这份数据放进公开的情绪与应激生理资源谱系里,它的位置由三个属性决定:任务是恐惧暴露而非情绪唤起,设备是低成本穿戴而非科研级放大器,标签完全不在包里。
| 资源 | 受试者 | 刺激与通道 | 主观评分是否随包发布 |
|---|---|---|---|
| ECG-SPIDER-CLIP | 57 | 十六段蜘蛛视频;心电、皮肤电、呼吸,100 Hz | 否 |
| DEAP | 32 | 四十段音乐视频;三十二导脑电加八路外周,最高 512 Hz | 是,四维自评 |
| QoL_Stress | 66 | 放松与应激双相任务;心电、皮肤电、心率 | 是,量表分数 |
| EDA Rest & Sedation | 22 | 无刺激,静息与镇静;皮肤电脉冲,256 与 500 Hz | 否 |
| MACECGDB | 1 | 站立、行走、跳跃;四路贴片心电,500 Hz | 否 |
与 DEAP 的对照最能说明问题。两者都是「看视频、记生理」,都用视频段落作为时间锚点,但 DEAP 把每段视频后的自评分数一并发布,于是监督学习可以直接开始;这份数据把自评留在作者手里,使用者拿到的是没有答案的考卷。这不是缺陷,是发布范围的取舍——心理学的原始评分往往带有可识别风险,而生理波形脱敏后风险低得多。
与 QoL_Stress 的差别在刺激的性质。应激任务追求的是可控、可重复的负荷,比如心算或冷水;恐惧暴露追求的是个体化的情绪唤起,同一个人对同一段视频的反应取决于他的恐惧程度。前者适合做算法基准,后者适合做机制观察。
§3 它是谁的数据:一项随机对照试验的副产物
3.1 五名作者与三个机构
官方页面列出五位作者,机构横跨三个单位。Frank R. Ihmig 属弗劳恩霍夫生物医学工程研究所 IBMT 的生物医学微系统部门,负责设备与信号链路;Antonio Gogeascoechea 属特温特大学生物力学工程系,负责数据处理;Sarah K. Schäfer、Johanna Lass-Hennemann、Tanja Michael 三人同属萨尔兰大学临床心理学与心理治疗系,负责试验设计、伦理与临床评估,其中 Tanja Michael 是课题组负责人。
这种「工程机构加心理系」的组合解释了数据的两个特征:信号处理得相当规整(三列、统一命名、逐人文件夹),而临床元信息几乎没有(无诊断、无量表、无人口学)。工程方关心的是链路是否干净,心理方关心的是结论是否成立,两边都没有动力把评分放进公开包。
3.2 时间线
| 时间 | 事件 | 来源 |
|---|---|---|
| 2017 年 7 月 | 开始采集,首个受试者 VP02 的文件时间为 7 月 17 日 | 目录时间戳 |
| 2018 年 3 月 | 试验方案论文发表于 Trials | 方案论文 |
| 2018 年 7 月 | 采集结束 | 官方页面 |
| 2020 年 5 月 | 结果论文被 PLoS ONE 接收 | 论文页 |
| 2020 年 6 月 4 日 | 许可与分组表等散文件落盘 | 目录时间戳 |
| 2020 年 6 月 5 日 | PhysioNet 以 1.0.0 版发布 | 官方页面 |
从时间线看,数据先于论文发布几天。这是常见的做法:论文进入校样阶段时把数据挂出去,等论文上线时 DOI 已经可用。方案论文比数据早了两年,说明试验是严格按照预注册方案执行的,这在心理学里是质量信号。
3.3 一次实验的流程
官方的流程描述很简短,但把关键节点都给了:先放一段一分钟的示范片,再放十六段一分钟的蜘蛛视频,最后是五分钟静息。十六段被分成前后两组,每组八段,组内顺序随机。
时间轴(单人一次会话,约 35 分钟)
|-- 准备与基线 --|-- 示范 --|-- 片段 1-8(组内随机)--|-- 片段 9-16(组内随机)--|-- 静息 5 分钟 --|
1 分钟 8 分钟 8 分钟 5 分钟
VP02 实际的播放顺序(摘自 Triggers.txt)
DEMO -> 4 -> 1 -> 3 -> 2 -> 7 -> 8 -> 5 -> 6 -> 12 -> 10 -> 11 -> 9 -> 14 -> 13 -> 15 -> 16
#-- 前八段是 1 至 8 的一个排列,后八段是 9 至 16 的一个排列
#-- 编号只代表素材库序号,不代表播放次序,也不代表强度排序
| 阶段 | 官方口径与清单跨度的对比 | 标记 |
|---|---|---|
| 示范片 | 官方 1 分钟,清单约 150 秒 | CLIP-DEMO |
| 单段蜘蛛视频 | 官方 1 分钟,清单约 100 秒 | CLIP-1 至 CLIP-16 |
| 静息 | 官方 5 分钟,清单约 301 秒 | BIOFEEDBACK-REST |
| 整场 | 官方未给出,清单纯计约 34.5 分钟 | 从训练区间起算 |
| 信号记录 | 官方称约 35 分钟,略长于整场 | 含准备与收尾 |
上表第二列把两个口径并排放着,差额是系统性的:官方说每段一分钟,触发清单里每段约一百秒;官方说示范片一分钟,清单里约一百五十秒;官方说静息五分钟,清单里三百零一秒,这一项倒是吻合。这不是抄错,而是「片段本身的长度」与「触发窗口的长度」两个口径。窗口比片段长,多出来的部分可能是淡入淡出、缓冲或操作余量,官方未作说明(§7.3)。
3.4 四个组里为什么少了第一组
方案论文写明四个组的分工,这是理解数据边界的关键。四组都接受了同样的两次任务训练,并在家练习六天,一周后进入暴露阶段,区别在于暴露时执行哪一个任务。
| 组 | 训练内容 | 暴露时执行 | 是否收录与理由 |
|---|---|---|---|
| Group1 | 心率变异生物反馈 + 一个动作伪反馈 | 心率变异生物反馈 | 否,训练过的呼吸法改变心率与心率变异 |
| Group2 | 心率变异生物反馈 + 一个动作伪反馈 | 动作伪反馈 | 是,暴露时未使用真反馈 |
| Group3 | 两个动作伪反馈 | 其中一个动作伪反馈 | 是,对照组 |
| Group4 | 两个动作伪反馈 | 无附加任务 | 是,纯暴露对照 |
这个设计的巧妙之处在于把「训练过」与「正在用」拆开。第一组与第二组接受了完全相同的训练,差别只在暴露时是否真的用上生物反馈。剔掉第一组,等于剔掉了「暴露期间存在主动呼吸调节」这一条件,剩下的三组在暴露期间的生理状态都不受刻意的呼吸控制。
代价是这份数据无法回答「生物反馈有没有用」。它只能回答「在没有主动调节的情况下,恐惧暴露过程中心电、皮肤电、呼吸如何变化」。这个边界很硬,任何试图用它做反馈效果比较的分析都会把组别当成处理变量,而真正的处理组不在这里(§7.3)。
3.5 受试者是谁,不是什么
八十名参与者年龄在十八到四十岁之间,自报害怕蜘蛛,通过公开招募进入研究。伦理审查由萨尔兰大学人文科学学院伦理委员会批准,全体签署书面知情同意,其中包含同意数据发表。
| 属性 | 值(来源) | 对使用的含义 |
|---|---|---|
| 在册人数 | 57(官方页面) | 可做个体层分析,不可做大样本推断 |
| 参与人数 | 80(官方页面) | 二十三人未入册 |
| 年龄 | 18–40 岁(官方页面) | 无儿童与老年样本 |
| 恐惧类型 | 自报蜘蛛恐惧(官方页面) | 非临床诊断 |
| 性别构成 | 未发布 | 无法做性别分层 |
| 国籍与语言 | 德国,德语(采集地点推断) | 跨文化迁移未知 |
| 诊断 | 未发布 | 不能当患者队列 |
| 用药 | 未发布 | 无法排除药物影响 |
| 量表分数 | 未发布 | 无法按恐惧程度分层 |
「自报」两个字分量很重。蜘蛛恐惧症在诊断手册里有明确的条目要求,而自报害怕蜘蛛只需要一句自我描述。招募时可能用了恐惧问卷做初筛,但筛查结果没有随包发布,因此无法判断这批人里有多少达到临床阈值。用它讨论亚临床的恐惧反应是合适的,用它讨论蜘蛛恐惧症则越界。
§4 它最独特的东西:把恐惧切成十七个窗口
4.1 为什么窗口比记录更重要
一份三十分钟的连续记录,如果不切窗,几乎无法做任何监督学习。整段记录只有一个「这个人怕蜘蛛」的粗标签,而这个标签对全部五十七人都成立,方差为零。切成窗口之后,同一份记录内部才出现对照:刺激段与静息段、前八段与后八段、强反应段与平复段。
五十七人乘十七个窗口,得到九百六十九个可索引的时间段。其中九百一十二个是蜘蛛视频窗口,每人十六个,编号从 CLIP-1 到 CLIP-16;其余五十七个是示范片窗口;静息段每人一段,但它在触发清单里与整场训练区间并列,通常不计入片段窗口。这个数字是这份数据真正的分析单位。它比五十七大一个量级,比三十分钟的采样点小三个量级,正好落在「一段情绪事件」的时间尺度上。
「片段窗口总时长约二十五小时」这个数字要小心使用。它是按触发窗口跨度(每段约一百秒)算的,不是按视频本身长度算的;如果按官方的一分钟算,总时长约十五小时。两个口径差十小时,差额全部来自窗口比片段长这件事(§3.3)。
4.2 案例:VP02 的 CLIP-4 那一段窗口
选 VP02 的 CLIP-4 作为贯穿案例,有三个理由:它是全库第一个受试者播放的第一段蜘蛛视频,位置最靠前;它的编号与播放次序不一致,正好用来说明随机化;它的窗口时长一百零一秒,落在片段窗口的典型值上。
#-- 从触发表里取出 CLIP-4 的窗口,再按时间戳从三路信号里截出来
import numpy as np
base = "https://physionet.org/files/ecg-spider-clip/1.0.0/VP02"
trig = np.loadtxt(f"{base}/Triggers.txt", delimiter="\t", dtype=str)
row = trig[trig[:, 0] == "CLIP-4"][0]
start, end = float(row[1]), float(row[2])
print("窗口:", row[0], start, end, "跨度秒:", end - start)
def to_sec(hhmmss):
h, m, s = int(hhmmss) // 10000, int(hhmmss) // 100 % 100, int(hhmmss) % 100
return h * 3600 + m * 60 + s
lo, hi = to_sec(start), to_sec(end)
for name in ("BitalinoECG", "BitalinoGSR", "BitalinoBR"):
x = np.loadtxt(f"{base}/{name}.txt", delimiter="\t", usecols=(0, 1))
t = np.floor(x[:, 1] / 10000) * 3600 + np.floor(x[:, 1] / 100 % 100) * 60 + x[:, 1] % 100
seg = x[(t >= lo) & (t < hi), 0]
print(name, "点数:", len(seg), "最小值:", round(float(seg.min()), 3),
"最大值:", round(float(seg.max()), 3))
这段代码会把三路信号在同一个窗口内截出来。三路的点数不会完全相等,因为触发时间是秒级、信号时间是毫秒级,边界落在哪一侧取决于浮点比较。想要严格等长,需要先按统一时间轴重采样。
| 解剖项 | CLIP-4 窗口的值 |
含义 |
|---|---|---|
| 所属受试者 | VP02 |
Group2 |
| 片段编号 | 4 | 素材库序号,非播放序号 |
| 实际播放位次 | 第一段蜘蛛视频 | 示范片之后立刻播放 |
| 窗口起 | 113336 | 十一时三十三分三十六秒 |
| 窗口止 | 113437 | 十一时三十四分三十七秒 |
| 窗口跨度 | 101 秒 | 官方称片段 1 分钟 |
| 距示范片结束 | 33 秒 | 操作与缓冲余量 |
| 距信号起始 | 约 5 分 40 秒 | 含准备与基线 |
| 按 100 Hz 计的点数 | 约一万零一百 | 实际略有出入 |
这个窗口在后续章节还会被反复引用:§5.4 用它演示切窗与重采样,§7.3 用它说明「窗口长度不等于刺激长度」这个偏差,§9.2 用它作为最短流程的输入。
4.3 三路信号为什么不是三份独立数据
心电、皮肤电、呼吸的物理机制完全不同,时间常数也差着数量级。心电的 R 峰是毫秒级事件,皮肤电的响应以秒计,呼吸的一个周期在三四秒上下。三者放在一起,恰好覆盖了交感神经活动的快、中、慢三个尺度。
| 通道 | 物理量与单位 | 典型时间尺度 | 对恐惧的反应方向 |
|---|---|---|---|
| 心电 | 心肌去极化电位,毫伏 | 毫秒级 R 峰 | 心率升高,心率变异下降 |
| 皮肤电 | 汗腺活动引起的电导,微西门子 | 一到三秒爬升,数秒回落 | 电导水平升高,非特异性反应增多 |
| 呼吸 | 胸带压电位移,百分比 | 三到五秒一周期 | 呼吸变浅变快,节律不规则 |
三者的关系不是冗余而是互补:心率告诉你交感与副交感的即时平衡,皮肤电告诉你交感唤起的累积水平,呼吸告诉你这个人有没有在用呼吸调节情绪。最后一条在这份数据里格外重要,因为第一组被剔除的理由正是「训练过的呼吸法会改变心率与心率变异」——呼吸是唯一一个能被意识直接改写的通道。
4.4 它支撑的四类实验
按结论强度排序,这份数据能撑起四类实验。最强的是「刺激段对静息段」的二分类:标签由时间戳定义,不需要任何主观判断,三路信号同步,做法是用窗口统计量区分两类时段。次强的是设备与采样率的敏感性分析:原始 100 Hz 可以任意降采样,降完再比特征稳定性,结论自洽可验证。第三是三路信号的耦合分析,算通道间的滞后相关与相位同步,前提是先解决重采样。最弱的是个体差异排序,按人汇总窗口反应幅度再排名。
第三类实验最容易被高估。五十七个人、每人十七个窗口,看似样本量足够,但个体之间没有共同的效标——谁的反应算「强」,只能靠研究者自己定阈值。这样的排序在样本内可复现,跨样本不可迁移。剩下两类根本走不通:训练情绪识别模型需要逐窗口标签,包里没有;比较干预效果需要真反馈组,那一组不在。
4.5 边界条件:什么时候它不再适用
| 条件 | 是否适用 | 判断依据 |
|---|---|---|
| 你要真实诱发过程中的多模态记录 | 适用 | 三路同步、时间锚点明确 |
| 你要研究低成本设备的信号上限 | 适用 | 100 Hz 与 10 位是硬约束 |
| 你要做窗口级的无监督分段 | 适用 | 片段边界可直接当参考答案 |
| 你要训练有监督的情绪分类器 | 不适用 | 无标签 |
| 你要比较生物反馈与安慰剂 | 不适用 | 真反馈组缺席 |
| 你要做临床诊断或筛查 | 不适用 | 亚临床样本,无诊断 |
| 你要复现刺激材料 | 不适用 | 视频未发布 |
| 你要做导联级心电形态分析 | 不适用 | 单导联、100 Hz、10 位 |
§5 怎么拿到:从四个 txt 到可训练张量
5.1 目录与体积
整包解压一点一吉字节,压缩包一百四十五点一兆字节。压缩比接近八比一,原因是纯文本数字的熵很低。这个体量在公开生理数据里属于中等:比一份临床心电库小得多,比一份单人的方法学小库大得多。
体量的分布极不均匀。皮肤电文本每人约七点四兆,五十七人合计约四百二十兆;心电文本每人约六点四兆,合计约三百六十五兆;呼吸文本每人约六点一兆,合计约三百四十八兆。三者合计已占全包的绝大部分,剩下的触发清单每人不足一千字节,全库加起来只有二十几千字节。根目录下四个散文件里,那张静帧截图独占两点六兆,是许可全文、校验和与分组表的总和的几百倍。
下载时间主要花在数量上而不是单个文件的大小上。两百多个文件逐个请求,每个请求都有往返开销,用递归下载比逐个 curl 快得多。
5.2 批量获取
官方给出三条路径:网页上的 ZIP 按钮、wget 递归、AWS 公开桶同步。三条路径指向同一份内容,都不需要登录。
#-- 方式一:整包下载后解压
cd /tmp && wget -q https://physionet.org/content/ecg-spider-clip/1.0.0/ecg-spider-clip.zip
unzip -o ecg-spider-clip.zip -d spider
#-- 方式二:只抓信号与触发表,跳过截图与许可全文
wget -q -r -N -c -np -A "*.txt" \
https://physionet.org/files/ecg-spider-clip/1.0.0/
#-- 方式三:从公开桶同步(需要 aws cli)
aws s3 sync --no-sign-request \
s3://physionet-open/ecg-spider-clip/1.0.0/ /tmp/spider \
--exclude "*" --include "*.txt" --include "*.csv"
第二种方式用 -A "*.txt" 过滤,会把信号文件、触发清单和许可全文一起抓下来,跳过那张两点六兆的截图。整包只有一点一吉字节,过滤省下的空间有限,真正的收益是减少请求数。
5.3 建立索引
元信息分散在三处:文件夹名给受试者编号,触发清单给窗口边界,分组表给实验组。建索引就是把三处缝成一张表,后面所有筛选都基于它。
#-- 建一张 969 行的窗口索引表
import csv
import numpy as np
from pathlib import Path
root = Path("/tmp/spider")
with open(root / "subject_groups.csv", encoding="utf-8") as f:
table = list(csv.reader(f))
#-- 首行是三个组名,之后每行是各组对应的受试者,按列配对
groups = {}
for row in table[1:]:
for gname, subj in zip(table[0], row):
if subj:
groups[subj] = gname
def to_sec(s):
return int(s) // 10000 * 3600 + int(s) // 100 % 100 * 60 + int(s) % 100
rows = []
for subj in sorted(groups):
trig = root / subj / "Triggers.txt"
for line in open(trig, encoding="utf-8"):
tag, a, b = line.rstrip("\n").split("\t")
rows.append((subj, groups[subj], tag, to_sec(a), to_sec(b), to_sec(b) - to_sec(a)))
print("窗口数:", len(rows))
print("示例:", rows[1])
subject_groups.csv 的格式需要注意:它没有表头行,第一行的三列直接是 Group2,Group3,Group4 三个组名,之后每行是各组对应的受试者。也就是说这是一张横排的表,行不是记录而是「第几个名额」,必须按列配对才能读成「受试者到组」的映射。按行遍历会把三列当成三个人,读出来的组别全错。这是个小坑,写一次就不会再踩。
| 索引字段 | 类型与来源 | 用途 |
|---|---|---|
subject |
字符串,文件夹名 | 主键之一,用于按人分组 |
group |
字符串,subject_groups.csv |
组间比较 |
tag |
字符串,Triggers.txt 第 1 列 |
窗口类型 |
start |
整数,第 2 列换算的秒 | 切窗左界 |
end |
整数,第 3 列换算的秒 | 切窗右界 |
dur |
整数,右界减左界 | 质量检查 |
建完索引先做一次自检:窗口数应当是九百六十九,其中标记为 CLIP- 的应当是九百一十二。若数目对不上,多半是某个受试者的触发表多了或少了一行——VP02 就比别的受试者多一行「训练区间」,说明官方虽然给了统一格式,字段的实际用法仍有出入。
5.4 切窗与张量
每条记录本身很长,切窗是必需的一步。切窗的难点不在切片,而在时间轴:三路信号各自独立,行数不同,时间戳抖动,必须先统一到同一条等间隔时间轴上。
#-- 把三路信号重采样到统一时间轴,再按 §4.2 的案例窗口截取
import numpy as np
base = "https://physionet.org/files/ecg-spider-clip/1.0.0/VP02"
FS = 100.0
def load(name):
x = np.loadtxt(f"{base}/{name}.txt", delimiter="\t", usecols=(0, 1))
t = x[:, 1]
sec = (t // 10000) * 3600 + (t // 100 % 100) * 60 + (t % 100)
return sec, x[:, 0]
t0, ecg = load("BitalinoECG")
tg, gsr = load("BitalinoGSR")
tb, br = load("BitalinoBR")
lo, hi = 113336.0, 113437.0
grid = np.arange(lo, hi, 1.0 / FS)
ecg_r = np.interp(grid, t0, ecg)
gsr_r = np.interp(grid, tg, gsr)
br_r = np.interp(grid, tb, br)
print(grid.shape, ecg_r.shape, gsr_r.shape, br_r.shape)
np.interp 是线性插值,对心电这种有锐利边沿的信号并不理想,重采样后的 R 峰会被削平一些。要保住峰值,可以先用 scipy.signal.resample_poly 按固定比例重采样,或先做峰值检测再只保留 R 峰序列。选哪一种取决于下游任务:做心率变异就只留 R 峰,做形态分析就必须保留波形。
| 张量维度 | 大小与对应 | 注意 |
|---|---|---|
| 第零维 | 969,窗口 | 与索引表顺序一致 |
| 第一维 | 10000,采样点 | 一百秒乘 100 Hz |
| 第二维 | 3,通道 | 心电、皮肤电、呼吸 |
| 数据类型 | 浮点,已换算物理单位 | 三路单位不同,需标准化 |
| 内存占用 | 约 230 MB,双精度 | 转单精度可减半 |
三路单位不同,不能直接堆成一个张量送进网络。心电在毫伏量级,皮肤电在微西门子量级,呼吸在百分比量级,量纲差着两三个数量级。正确做法是每路先按人做 z 分数标准化,再拼接。按全库做标准化会把个体差异抹掉,而个体差异在这份数据里恰恰是研究目标之一。
5.5 一条可复现的评测协议
因为没有官方划分,任何评测协议都得自己定。合理的做法是按受试者划分而不是按窗口划分:同一个人的窗口之间高度相关,把它们随机分到训练集和测试集,会让测试集泄漏训练信息。
#-- 按受试者做留一交叉验证的骨架
import numpy as np
subjects = sorted({r[0] for r in rows})
folds = []
for held in subjects:
train = [r for r in rows if r[0] != held and r[2].startswith("CLIP-")]
test = [r for r in rows if r[0] == held and r[2].startswith("CLIP-")]
folds.append((train, test))
print("折数:", len(folds))
print("每折训练窗口:", len(folds[0][0]), "测试窗口:", len(folds[0][1]))
留一法在五十七人上意味着一百多次训练,代价不小。更实际的是按组划分:三组中留一组做测试,另外两组训练,一次划分就能得到与论文接近的设置,也避免了同一受试者的信息跨集泄漏。三种划分的差别可以量化:按窗口随机时训练集约七百三十个窗口、测试集约一百八十个,样本量最大但同一个人同时出现在两边,泄漏最严重;按受试者留一时测试集只有十六个窗口,无泄漏但训练次数最多;按组留一时训练约六百、测试约三百,代价最小但组间差异会混进结果。还有一种「按时间前后」划法,用前八段训练、后八段测试,看似模拟时间外推,实际上片段顺序已被随机打乱,这个划法没有语义。
按受试者留一与按组留一的差别值得说清。前者衡量的是「换一个人还能不能用」,后者衡量的是「换一种任务条件还能不能用」。前者是泛化,后者是稳健性。论文报告的是哪一种,公开摘要没有写,只说用了十种标注方案(§8.2)。
5.6 六个最容易出错的地方
| 易错点 | 表现 | 正确做法 |
|---|---|---|
| 把三列当成有表头 | 第一行被当列名,少一个采样点 | 用 header=None 或 np.loadtxt 默认 |
| 把时间戳当等间隔 | 直接按行号索引,窗口整体偏移 | 用时间戳重采样到统一网格 |
| 把片段编号当播放顺序 | 认为 CLIP-1 是第一段 | 以 Triggers.txt 的行序为准 |
| 三路按下标硬拼 | 长度不等,报形状错误 | 按时间戳对齐后合并 |
| 皮肤电负值直接 discard | 丢失有效段 | 负值是传感器偏置,做偏移校正 |
| 按窗口随机划分 | 测试集准确率虚高 | 按受试者或按组划分 |
第一与第二条最常见。前者的后果很隐蔽:少一个点不会报错,只会让所有窗口整体偏移一个采样间隔,十毫秒的偏移在心率变异分析里足以改变结果。后者的后果更明显,画出来的波形会周期性拉伸。
皮肤电的负值需要单独说明。官方写明负值与传感器有关,应当做偏移校正。这不是数据错误,而是电导测量没有绝对零点:设备输出的是相对电压,减去一个基线后才是有效电导变化。把负值当异常删除,会系统性丢掉低唤起时段的样本。
§6 与库内条目的关系
6.1 关系图谱
在千方医数集的生理信号版图里,这份数据的位置是「诱发范式加低成本设备」这一格。它不承担基准职能,也不承担临床职能,主要承担「真实诱发过程长什么样」这一件事。
| 关联资源 | 关系类型 | 接口与迁移注意 |
|---|---|---|
| DEAP | 最近的同类 | 同为视频诱发加多路生理;那边有自评标签,这边没有 |
| QoL_Stress | 任务相近 | 同为应激或放松范式的多模态记录;那边是可控负荷,这边是个体化恐惧 |
| EDA Rest & Sedation | 通道重叠 | 都以皮肤电为核心通道;那边只有脉冲,这边有原始电导 |
| consumer-grade-wearables | 设备层级相近 | 都关心消费级设备的可用性;那边多设备同步,这边单设备 |
| macecgdb | 结构对照 | 都是小体量、窄目标的专用库;那边是伪迹方法学,这边是诱发范式 |
| ecg-arrhythmia | 上下游 | 都含心电但目的相反;那边是诊断标注,这边无标注 |
| 本库在其间的身份 | 诱发样本 | 提供带时间锚点的恐惧暴露实录,只补「过程」不补「结论」 |
与 DEAP 的联用最有现实意义:DEAP 提供「有评分、可监督」的训练范式,这份数据提供「无评分、真实恐惧」的测试场景。用 DEAP 训练,用这份数据做域外检验,能看出模型是真学到了生理规律,还是只学到了 DEAP 的采集特性。
与 ecg-arrhythmia 的关系则是纯结构性的:两者都有心电,但一个 500 Hz 十二导联带诊断标签,一个 100 Hz 单导联无标签。把后者的模型迁移到前者几乎必然失败,反过来也一样。这种「同通道不同任务」的对照,本身就是选型时该看的一栏。
6.2 检索路径
按用途检索比按规模检索有效。要标签找 DEAP 与 QoL_Stress,要真实诱发过程找这份数据,要设备上限找消费级穿戴那几条。
| 检索意图 | 首选与次选入口 | 判断依据 |
|---|---|---|
| 视频诱发的多模态生理 | DEAP,本数据 | 是否带自评分数 |
| 恐惧或焦虑暴露过程 | 本数据,无同类 | 是否以临床范式为骨架 |
| 应激任务的算法基准 | QoL_Stress,本数据 | 任务是否可控可重复 |
| 低成本穿戴的信号质量 | 本数据,consumer-grade-wearables | 是否单设备长时记录 |
| 皮肤电的原始电导 | 本数据,EDA Rest & Sedation | 是否需要未导出的原始值 |
| 心电形态与诊断 | ecg-arrhythmia,ecgiddb | 是否有诊断标注 |
| 运动伪迹下的心电 | macecgdb,本数据 | 伪迹是否与心电同源 |
| 多设备同步比较 | consumer-grade-wearables,无同类 | 是否要求设备间对照 |
这张表的后三行是排除项:同一时间段里,若需求落在「诊断」「伪迹」「多设备」任一项上,这份数据都该被划掉。判断只需要问三个问题——是否需要逐窗口标签,是否需要临床诊断,是否需要多设备对照。三个都是否,它才是合适的起点。
这张表的后三行是排除项:同一时间段里,若需求落在「诊断」「伪迹」「多设备」任一项上,这份数据都该被划掉。判断只需要问三个问题——是否需要逐窗口标签,是否需要临床诊断,是否需要多设备对照。三个都是否,它才是合适的起点。
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
在给这份数据打分之前,需要先校正一个常见的错位:把它当成「标签缺失的失败数据集」。这个判断本身是误判,因为它默认了所有生理数据的终点都是监督学习。这项研究的终点是「能不能在线判别焦虑水平」,判别模型在论文里已经给出,标签来自主观评分,而那部分数据因为涉及心理量表,本就不适合无条件公开。
校正之后的评价标准应该换成三条:诱发范式是否规范、时间锚点是否可靠、设备与采样是否够用。三条都站得住:范式来自预注册的随机对照试验,时间锚点由采集软件写入,100 Hz 与 10 位是这类低成本设备的真实上限。站不住的是另一组问题:能否支撑监督学习、能否外推到临床、能否复现刺激。把两组问题分开,评价才不会错位。
7.1 五维评分
按千方医数集的框架,评价分成规模、结构、标注、边界、可用性五个维度。这个分层与 DAIMS(Data and AI Management Standards)的思路一致:先看数据本身,再看治理与使用条件,而不是只看体量。
| 维度 | 分值(五分制) | 依据 | 说明 |
|---|---|---|---|
| 规模 | 2 | 57 人、约 33 小时、969 个窗口 | 个体层够用,群体推断不足 |
| 结构 | 3 | 三列文本、逐人文件夹、无统一索引 | 解析简单,对齐需手工 |
| 标注 | 2 | 仅有片段起止与分组 | 时间锚点可靠,情绪标签缺席 |
| 边界 | 3 | 剔除规则清楚、许可宽松 | 边界不含糊,但覆盖有结构性缺口 |
| 可用性 | 4 | 一点一吉字节、三条取数路径、纯文本 | 半天能跑通,无需专用工具链 |
五项的权重取决于用途。做窗口级无监督分段时,结构与可用性权重高,总分可观;做情绪分类时,标注权重高,总分立刻掉下来。任何一个「综合分」都不该脱离用途被引用。
7.2 标注的真实覆盖范围
这份数据只有两类标注:片段起止时间与分组归属。两类都由采集系统或试验设计产生,不是人工判读的产物。
| 标注项 | 生成方式与覆盖范围 | 能否支撑监督学习 |
|---|---|---|
| 片段起止 | 采集软件写入,覆盖每段视频与静息 | 可做时段二分类 |
| 片段编号 | 素材库序号,覆盖十六段 | 不代表强度顺序 |
| 示范片标记 | 采集软件写入,覆盖一段 | 可作适应期对照 |
| 分组归属 | 试验设计,覆盖全库 | 可做组间比较 |
| 焦虑水平 | 主观评分,未发布,覆盖零 | 不能 |
| 恐惧量表 | 未发布,覆盖零 | 不能 |
| 心搏位置 | 无,覆盖零 | 需自行检测 |
| 伪迹区段 | 无,覆盖零 | 需自行判定 |
能够直接支撑的监督任务只有「刺激段对非刺激段」这一种。它的标签强度不高——任何观看视频的时段都会与静息不同,模型学到的可能是「有没有在动」而不是「怕不怕」。想要更细的标签,只能回到论文的十种标注方案,而方案本身依赖未发布的主观评分。
7.3 已知的、可枚举的偏差
| 偏差项 | 具体表现与影响 | 可否从数据里校正 |
|---|---|---|
| 样本偏差 | 自报蜘蛛恐惧,非临床诊断,结论限于亚临床人群 | 不可校正 |
| 年龄偏差 | 18–40 岁,无儿童与老年 | 不可校正 |
| 地域偏差 | 德国西南部单一招募点,跨文化迁移未知 | 不可校正 |
| 分组缺口 | 真生物反馈组整组缺席,无法比较反馈效果 | 不可校正 |
| 标签缺口 | 无任何情绪评分,无法直接监督学习 | 不可校正 |
| 设备偏差 | 单一型号、单一固件,无法分离设备效应 | 不可校正 |
| 采样偏差 | 100 Hz、10 位,形态细节受限 | 不可恢复 |
| 时间戳偏差 | Windows 时间戳抖动,需重采样,窗口边界有秒级误差 | 部分可校正 |
| 刺激偏差 | 视频未发布,刺激强度不可复现 | 不可校正 |
| 窗口偏差 | 触发窗口长于片段,窗口内混入非刺激时段 | 部分可校正 |
倒数第二行与最后一行需要展开。窗口偏差在 §4.2 的案例里看得最清楚:CLIP-4 的触发跨度一百零一秒,官方称片段一分钟,多出的四十一秒里可能包含淡入、缓冲或操作停顿。若把整段窗口都当成「正在看蜘蛛」,就会把非刺激时段混进阳性样本,稀释效应量。校正的办法是只用窗口前六十秒,代价是丢掉一部分真实反应时间。
时间戳偏差的校正余地更大。抖动虽然明显,但时间戳本身是单调递增的,用插值重采样到等间隔网格即可恢复名义采样率。真正不可恢复的是抖动背后的丢点:如果某一段确实少了采样,插值只能填补,不能还原。
7.4 外部验证矩阵
外部验证指用这份数据之外的资源检验在它上面得到的结论。对一份无标签的数据,这一步几乎是必须的。
| 验证方向 | 可用外部资源与验证方式 | 预期结果 |
|---|---|---|
| 特征是否与焦虑相关 | 有量表分数的应激数据;用本数据提特征,在有标签库上测判别力 | 部分迁移,量级下降 |
| 设备效应有多大 | 多设备同步数据;比较同任务下不同设备的特征分布 | 差异明显,需单独标定 |
| 采样率是否够 | 高采样率心电库;降采样到 100 Hz 后比较心率变异指标 | 时域指标稳定,频域高频段失真 |
| 诱发范式是否可比 | 其它恐惧诱发研究;比较皮肤电反应的时间进程 | 形态相似,幅度不可比 |
| 模型是否过拟合设备 | 不同设备采集的同任务数据;跨设备测试同一模型 | 准确率显著下降 |
| 分组结论是否稳健 | 同方案的重复试验;比较三组的特征排序 | 排序可能反转,需谨慎 |
第三行对使用者的实际意义最大。100 Hz 的采样率对心率变异分析并不是无条件的够用:R 峰定位的量化误差约为十毫秒,换算成瞬时心率在快心率段误差会被放大。做 RMSSD 这类短时指标尚可,做高频段功率谱则要打折扣。
7.5 它为何能持续:一份被许可证释放的副产物
这份数据能在发布六年后仍有稳定访问,原因不在规模,而在替代性。想研究「恐惧暴露过程中的多模态生理反应」,公开资源里几乎没有第二份:要么是有标签但任务是情绪唤起的通用库,要么是临床数据但拿不到。自采一套等价数据需要伦理批件、临床心理学合作、设备与十七段刺激材料,门槛远高于下载。
它的存续还依赖一个常被忽略的条件:许可足够宽。ODC-BY 1.0 允许商用与再分发,只要署名。这让它可以从学术仓库流进企业预研、课程作业、竞赛基线,而不用逐次申请。相比之下,同类的心理学原始数据多以申请制发布,流通半径小得多。
最后是它的「副产物」身份。数据不是为发布而设计的,因此没有刻意为公开做简化——原始未滤波的信号、真实的抖动、未补齐的缺号,都留在包里。这种「不修饰」对方法学研究反而是优点:任何在它上面跑通的处理链,搬到真实场景里不会因为过于干净而失效。
§8 生态位与历史
8.1 历史沿革
2017 年之前,公开的情绪生理数据基本由两类构成:一类是实验室里用标准化刺激(图片、音乐、电影片段)诱发的情绪库,带自评分数;另一类是临床或日常监测的长时记录,带诊断或事件标签。前者可控但离真实恐惧很远,后者真实但缺时间锚点。
这份数据出现的位置正好在两者之间。它用临床心理学里成熟的暴露范式做骨架,用消费级穿戴设备做采集,用软件时间戳做锚点。范式的规范性来自心理学,设备的低成本来自工程,两者的组合让「真实诱发」第一次变得可以批量获取。
| 阶段与时间 | 特征 | 本数据的位置 |
|---|---|---|
| 标准化刺激库,2010 年前后 | 图片与音乐诱发,带自评 | 尚未出现 |
| 多模态情绪库,2012 至 2015 | 脑电加外周,视频诱发 | 范式前身 |
| 穿戴化与家庭化,2016 至 2019 | 低成本设备进入实验室 | 2017 年开始采集 |
| 公开与复用,2020 至今 | 数据随论文发布,许可放宽 | 2020 年入册 |
8.2 与后续研究的关系
这份数据在文献里很少作为主数据集出现,更多是作为「真实诱发场景」的补充实验或外部检验集。它被引的方向集中在三处:焦虑识别的特征工程、可穿戴设备的可用性评估、暴露疗法的数字化。多模态融合方向的引用属于参照型,用法是把三路信号加权做消融;生理信号预处理方向的引用属于素材型,用法是拿时间戳抖动与重采样练手;真正把它当情感计算基准的极少,因为没有标签,无法算公平的分数。
第一处的复现门槛要说清。论文报告了二分类 89.8%、三分类 74.4% 的准确率,用六个特征、十秒窗口、Bagged Trees 分类器。这些数字无法仅凭发布包复现,因为标签来自主观评分。能复现的是特征提取与分类器本身,标签那一环必须自己重建或向作者索取。
8.3 生态位:刺激材料不在包里
用一句话概括它的生态位:它是「反应」的存档,不是「刺激」的存档。视频因为版权不能随包发布,只有一张静帧截图。这意味着任何使用者拿到的是完整的三路反应,缺的是引发反应的那个东西。
这个缺口决定了它的使用方式。做算法的人不在意刺激具体是什么,只要有明确的时间边界就能训练分段;做机制的人会在意,因为不知道刺激内容就无法解释某一段反应为什么特别强。两类使用者的分界线,正好落在「要不要视频」这个问题上。把它当监督基准也不行,那需要逐样本标签与官方划分,两样都没有;把它当教学素材与预研起点倒是合适,因为它体量适中、格式简单、许可宽、下载快,而这四条恰恰是静息态库与申请制数据缺的。
8.4 谁在用它,用来做什么
官方页面的累计访问量在四百余次,在 PhysioNet 上属于中等偏低。低访问量不等于低价值,只说明它面向的是一个窄口。情感计算研究者拿它做无监督分段与特征验证,障碍是没标签;可穿戴工程师拿它评估设备上限,障碍是与自家型号不同;心理生理学教师拿它做课堂演示,障碍是没评分难出题;临床心理学研究者拿它当范式复用的参照,障碍是缺真反馈组。
后两类常被忽略。数据工程师把它当成「不完美时间戳」的标准测试用例,因为真实抖动比人造抖动更能暴露代码缺陷,代价是体量偏小、压不出性能问题;论文作者引用它多半不是为了跑实验,而是为了说明「恐惧暴露可以被连续记录」这个前提有公开证据,代价是只能引用、不能复现全流程。
§9 使用指引
9.1 三种角色的路径
不同角色从这份数据得到的东西不同,最短路径也不同。
| 角色与目标 | 第一步 | 第二步 | 第三步 |
|---|---|---|---|
| 算法研究者,做窗口级分段或特征验证 | 建索引表,确认九百六十九个窗口 | 按人标准化三路信号 | 按受试者划分做交叉验证 |
| 设备工程师,评估低成本设备的信号上限 | 读一人的三路原始值 | 降采样比较特征稳定性 | 与自家设备同任务对照 |
| 教师与学生,建立对诱发范式的直觉 | 读 VP02 的触发表与三路信号 |
画刺激段与静息段对照 | 写一页观察笔记 |
三条路径的共同起点都是建索引,因为所有后续操作都依赖窗口边界。差别在第二步:算法研究者关心信号的可比性,设备工程师关心采样的充分性,教师关心现象的可读性。
9.2 一条最短的可用流程
从零到一张对照图,最短的流程是五步:取数、建索引、读三路、切窗、画图。
#-- 用 §4.2 的案例窗口画一张刺激前后的三路对照
import numpy as np
import matplotlib.pyplot as plt
base = "https://physionet.org/files/ecg-spider-clip/1.0.0/VP02"
FS = 100.0
def load(name):
x = np.loadtxt(f"{base}/{name}.txt", delimiter="\t", usecols=(0, 1))
t = x[:, 1]
return (t // 10000) * 3600 + (t // 100 % 100) * 60 + (t % 100), x[:, 0]
t_ecg, ecg = load("BitalinoECG")
t_gsr, gsr = load("BitalinoGSR")
t_br, br = load("BitalinoBR")
lo, hi = 113336.0, 113437.0
grid = np.arange(lo, hi, 1.0 / FS)
fig, axes = plt.subplots(3, 1, sharex=True, figsize=(9, 6))
for ax, (t, v), label in zip(axes, [(t_ecg, ecg), (t_gsr, gsr), (t_br, br)],
["ECG (mV)", "EDA (uS)", "Respiration (%)"]):
ax.plot(grid, np.interp(grid, t, v), lw=0.8)
ax.set_ylabel(label)
axes[-1].set_xlabel("seconds since session start")
plt.tight_layout()
plt.savefig("vp02_clip4.png", dpi=150)
画出来之后,第一件该做的事不是解释曲线,而是确认窗口对不对:心电应当有清晰的 R 波节律,皮肤电应当缓慢爬升,呼吸应当有三到五个完整周期。若某一路是直线,多半是切到了记录开始之前或结束之后。
9.3 引用方式
官方要求分三层引用:数据集本身、配套的原始论文、PhysioNet 平台。
| 引用层级 | 引用内容 | 格式建议 |
|---|---|---|
| 数据集 | Ihmig 等,2020,版本 1.0.0,PhysioNet | 作者、题名、版本、平台、DOI |
| 原始论文 | Ihmig 等,On-line anxiety level detection from biosignals,PLoS ONE,2020 | 作者、题名、期刊、年份、DOI |
| 方案论文 | Schäfer 等,Trials,2018 | 说明试验设计的依据 |
| 平台 | Pollard 等,PhysioNet as a global platform,Nature Health,2026 | 平台标准引用 |
| 许可 | ODC-BY 1.0 | 署名要求 |
最容易漏的是版本号。PhysioNet 同时给出「1.0.0 版 DOI」与「最新版 DOI」两个标识,前者指向这一份固定的文件集合,后者会随版本更新而指向新内容。做可复现研究必须引用前者。另外要注意,官方把 PLoS ONE 那篇标为「使用本资源时应引用的原始出版物」,也就是说数据集层面没有独立论文,引用那篇即视为引用数据集本身。
§10 AI 使用声明
| 项目 | 内容 |
|---|---|
| 写作方式 | 由人工智能辅助撰写,人工校核事实与表述 |
| 事实来源 | 官方项目页、目录列表、Triggers.txt、subject_groups.csv、两篇论文摘要 |
| 未使用的手段 | 未下载全量数据做分布统计,未做频次、空值率或标签分布分析 |
| 数字口径 | 官方页面与文件内容给出什么就写什么,不推断不补全 |
| 不确定项处理 | 标注「官方未说明」或「按编号推断」,不写成事实 |
| 派生数字 | 窗口总数、片段总时长、编号差额均由官方数字直接换算,可复算 |
| 封面图 | 由生成模型按风格提示词产出,不含真实数据 |
| 更新责任 | 若官方页面修订,以官方为准,本页随之更新 |
常见误读(避坑清单)
| 说法 | 实际 | 证据 |
|---|---|---|
| SPIDER 是那个标注工具 | SPIDER 指 spider-fearful,即怕蜘蛛的受试人群 | 官方全名与摘要 |
| CLIP 是图文对比学习模型 | CLIP 指 video clip,视频片段 | 官方全名与数据说明 |
| 这是一份心电数据集 | 三路信号:心电、皮肤电、呼吸,心电只是其中之一 | 官方摘要首句 |
| 有八十个人的数据 | 在册五十七人,八十人是参与人数 | 官方页面与目录列表 |
| 每人只有几分钟 | 每人约三十五分钟,含十七个片段窗口 | 官方摘要 |
| 采样率是 500 Hz | 标称 100 Hz,10 位分辨率 | 官方摘要 |
| 包里带焦虑评分 | 不含任何评分或量表分数 | 数据说明列出的文件清单 |
| 四个组的数据都在 | 只有三个组,实施真生物反馈的第一组不收录 | 官方说明与分组表 |
| 视频可以一起下载 | 视频因版权未发布,只有一张静帧 | 官方说明 |
| 时间戳是等间隔的 | 时间戳抖动明显,需重采样 | 官方注解与首行数值 |
| 片段编号就是播放顺序 | 组内顺序随机,编号是素材库序号 | 触发清单行序 |
FAQ
问:SPIDER 是那个标注工具吗,CLIP 是那个图文模型吗?
答:都不是。SPIDER 指 spider-fearful,怕蜘蛛的受试人群;CLIP 指 video clip,视频片段。全名直译是「蜘蛛恐惧个体观看蜘蛛视频片段时的心电、皮肤电与呼吸信号」。与标注工具、图文对比学习模型都没有关系(§1.2)。
问:它有多少人、多少路信号、多长?
答:五十七人,一人一个文件夹;三路信号分别是心电、皮肤电与呼吸;每人一次会话约三十五分钟,标称 100 Hz、10 位分辨率。整包解压一点一吉字节。
问:包里有焦虑标签吗?
答:没有。只给三路信号、片段起止时间与分组归属。论文里的二分类与三分类标签由主观评分构造,那部分没有随包发布(§7.2)。
问:能不能用它训练焦虑识别模型?
答:只能做无监督或自建标签的实验。要做监督学习,得自己定义标签口径,而这样的标签跨研究不可直接比较(§4.4)。
问:为什么只有三个组,第一组去哪了?
答:第一组在暴露阶段使用了训练过的心率变异生物反馈呼吸法,会系统性改变心率与心率变异,因此整组不收录。剩下三组减去三条技术故障记录,得到五十七人(§3.4)。
问:为什么每段视频的窗口有一百秒,而官方说是一分钟?
答:两个口径不同。一分钟指视频本身,一百秒指触发窗口。多出的部分官方未说明来源,可能是缓冲或操作余量(§3.3)。
问:时间戳为什么不是整整齐齐的十毫秒?
答:官方说明时间戳由 Windows 系统生成,因此抖动明显,官方只用它来给片段与静息段定位。要等间隔采样必须自行重采样(§5.6)。
问:三路信号需要对齐吗?
答:需要。三路各自独立写文件,行数不必相等,必须按时间戳插值到统一网格后才能堆成张量(§5.4)。
问:可以商用吗?
答:ODC-BY 1.0 允许商用,条件是署名。视频不在许可范围内,需另行申请(§9.3)。
问:能复现论文报告的 89.8% 吗?
答:不能完整复现。特征提取与分类器可以重建,标签来自未发布的主观评分,缺了这一环准确率无从算起(§8.2)。
问:适合当教学材料吗?
答:适合。结构极简,四个纯文本,一人一文件夹,打开就能画图。缺点是没有任何评分,做练习需要自己出题(§9.1)。
问:和 DEAP 有什么不同?
答:同样看视频记生理,但 DEAP 发布自评分数,可以直接监督学习;这份数据不发布评分,只给时间锚点。前者适合做基准,后者适合做真实场景的检验(§2.5)。
术语表
| 术语 | 英文 | 在本数据中的含义 |
|---|---|---|
| 蜘蛛恐惧 | spider fear | 自报害怕蜘蛛,未达临床诊断 |
| 暴露疗法 | exposure therapy | 通过可控接触恐惧对象来降低恐惧的疗法 |
| 暴露阶段 | exposure session | 观看十六段蜘蛛视频的那次实验 |
| 生物反馈 | biofeedback | 把生理指标实时回馈给受试者以主动调节 |
| 心率变异生物反馈 | HRV biofeedback | 通过慢呼吸提高心率变异性的训练 |
| 动作伪反馈 | motor pseudo-biofeedback | 看似反馈实则无关的安慰剂任务 |
| 片段 | clip | 一段一分钟的蜘蛛视频 |
| 触发窗口 | trigger window | 片段播放的起止时间区间 |
| 示范片 | demo clip | 正式片段前播放的一段适应材料 |
| 静息段 | resting phase | 全部片段结束后的五分钟平静期 |
| 心电 | electrocardiogram | 心肌电活动,单位为毫伏 |
| 皮肤电导 | skin conductance | 汗腺活动引起的电导变化,单位为微西门子 |
| 呼吸位移 | respiration | 胸带压电传感器的形变,单位为百分比 |
| 心电导联 | lead | 电极组合形成的观测方向,本数据为单导联 |
| 采样率 | sampling rate | 每秒采样点数,本数据标称一百赫兹 |
| 分辨率 | resolution | 模数转换位数,本数据为十位 |
| 时间戳 | timestamp | 每个采样点的记录时刻,格式为时分秒加毫秒 |
| 时间锚点 | temporal anchor | 用来界定事件边界的时刻,本数据为片段起止 |
| 重采样 | resampling | 把非等间隔采样映射到统一网格 |
| 伪迹 | artifact | 非生理来源的信号干扰,如运动或接触不良 |
| 基线漂移 | baseline wander | 低频整体漂移,多由呼吸与体位引起 |
| 留一交叉验证 | leave-one-subject-out | 每次留一名受试者做测试的验证方式 |
| 随机对照试验 | randomized controlled trial | 随机分组并设对照的试验设计 |
| 预注册 | preregistration | 采集前公开登记方案与主要结局 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 受试者 | 57 | 官方页面 | 官方 |
| 参与人数 | 80 | 官方页面 | 官方 |
| 年龄区间 | 18–40 岁 | 官方页面 | 官方 |
| 实验分组 | 4 组,每组 20 人 | 官方页面 | 官方 |
| 收录分组 | 3 组 | 官方页面 | 官方 |
| 通道数 | 3 | 官方摘要 | 官方 |
| 采样率 | 100 Hz | 官方摘要 | 官方 |
| 分辨率 | 10 位 | 官方摘要 | 官方 |
| 单次时长 | 约 35 分钟 | 官方摘要 | 官方 |
| 片段数 | 16 | 官方数据说明 | 官方 |
| 片段长度 | 1 分钟 | 官方数据说明 | 官方 |
| 静息时长 | 5 分钟 | 官方数据说明 | 官方 |
| 整包大小 | 1.1 GB | 官方页面 | 官方 |
| 压缩包 | 145.1 MB | 官方页面 | 官方 |
| 版本 | 1.0.0 | 官方页面 | 官方 |
| 发布日期 | 2020-06-05 | 官方页面 | 官方 |
| 许可 | ODC-BY 1.0 | 官方页面 | 官方 |
| DOI | 10.13026/sq6q-zg04 | 官方页面 | 官方 |
| 窗口总数 | 969 | 五十七乘十七 | 推导 |
| 片段窗口数 | 912 | 五十七乘十六 | 推导 |
| 编号差额 | 23 | 八十减五十七 | 推导 |
附录 B:数字的来源分层
| 层级 | 含义 | 本页涉及的数字 |
|---|---|---|
| 官方页面 | 项目页摘要与数据说明直接给出 | 人数、通道、采样率、分辨率、时长、体量、许可、DOI |
| 官方文件 | Triggers.txt、subject_groups.csv 与目录列表 |
触发行数、窗口起止、分组归属、文件体量 |
| 论文摘要 | 方案论文与结果论文的摘要 | 四组设计、十种标注方案、六个特征、十秒窗口 |
| 推导 | 由官方数字直接换算 | 窗口总数、片段总时长、编号差额、三点分辨率 |
| 工作推断 | 依据编号空缺推测、官方未指名 | 三条技术故障记录对应的编号 |
前两层可以直接引用;第三层用于说明背景;第四层可复算;第五层必须标注为推断,不能当作结论。
附录 C:完整参考文献
| 序号 | 文献 | 用途 |
|---|---|---|
| 1 | Ihmig FR, Gogeascoechea A, Schäfer SK, Lass-Hennemann J, Michael T. Electrocardiogram, skin conductance and respiration from spider-fearful individuals watching spider video clips. PhysioNet, v1.0.0, 2020. DOI 10.13026/sq6q-zg04. | 数据集本体 |
| 2 | Ihmig FR, Gogeascoechea A, Neurohr-Parakenings F, Schäfer SK, Lass-Hennemann J, Michael T. On-line anxiety level detection from biosignals: machine learning based on a randomized controlled trial with spider-fearful individuals. PLoS ONE, 2020. DOI 10.1371/journal.pone.0231517. | 配套结果论文 |
| 3 | Schäfer SK, Ihmig FR, Lara H KA, Neurohr F, Kiefer S, Staginnus M, Lass-Hennemann J, Michael T. Effects of heart rate variability biofeedback during exposure to fear-provoking stimuli within spider-fearful individuals: study protocol for a randomized controlled trial. Trials, 2018, 19:184. | 试验方案 |
| 4 | Pollard T, Moody BE, Lehman L, et al. PhysioNet as a global platform for biomedical research. Nature Health, 2026. | 平台引用 |
| 5 | Open Data Commons. Attribution License v1.0. | 许可文本 |
| 6 | PLUX Wireless Biosignals. BITalino documentation. | 设备规格背景 |
附录 D:任务代码
一段把全库读入、按窗口切分、输出每人员工级摘要的脚本。
#-- 全库窗口级特征提取,输出每人每窗口的一行
import csv
import numpy as np
from pathlib import Path
ROOT = Path("/tmp/spider")
FS = 100.0
def to_sec(s):
return int(s) // 10000 * 3600 + int(s) // 100 % 100 * 60 + int(s) % 100
def load(path):
x = np.loadtxt(path, delimiter="\t", usecols=(0, 1))
return to_sec_arr(x[:, 1]), x[:, 0]
def to_sec_arr(t):
return (t // 10000) * 3600 + (t // 100 % 100) * 60 + (t % 100)
def subject_rows(subj):
base = ROOT / subj
te, ecg = load(base / "BitalinoECG.txt")
tg, gsr = load(base / "BitalinoGSR.txt")
tb, br = load(base / "BitalinoBR.txt")
out = []
for line in open(base / "Triggers.txt", encoding="utf-8"):
tag, a, b = line.rstrip("\n").split("\t")
lo, hi = to_sec(a), to_sec(b)
grid = np.arange(lo, hi, 1.0 / FS)
e = np.interp(grid, te, ecg)
g = np.interp(grid, tg, gsr)
r = np.interp(grid, tb, br)
out.append((subj, tag, hi - lo,
float(np.ptp(e)), float(np.mean(g)), float(np.ptp(r))))
return out
rows = []
for subj in sorted(p.name for p in ROOT.iterdir() if p.is_dir()):
rows.extend(subject_rows(subj))
with open("windows.csv", "w", newline="", encoding="utf-8") as f:
w = csv.writer(f)
w.writerow(["subject", "tag", "dur", "ecg_ptp", "eda_mean", "br_ptp"])
w.writerows(rows)
print("窗口数:", len(rows))
输出是每人每窗口一行,六列。ecg_ptp 用来粗看心电幅度,eda_mean 用来看皮肤电水平,br_ptp 用来看呼吸深度。三个量都不是最终特征,只是让使用者先确认切窗是否正确:如果某人的 eda_mean 在刺激段反而低于静息段,多半是窗口错位或偏移未校正。
脚本假定数据已解压到 /tmp/spider。若改用远端路径,把 Path 换成 URL 拼接、把 np.loadtxt 换成先下载再读即可。全库跑完约需数分钟,瓶颈在文本解析而非计算。
附录 E:如果只记五件事
| 序 | 要点 | 一句话 |
|---|---|---|
| 1 | 它是谁的 | 五十七名自报蜘蛛恐惧的成年人,不是患者队列 |
| 2 | 它有什么 | 三路信号、每人十七个窗口、约三十五分钟 |
| 3 | 它缺什么 | 无情绪标签、无真反馈组、无视频、无诊断 |
| 4 | 它最适合 | 窗口级分段、多模态耦合、低成本设备的信号评估 |
| 5 | 它最容易被误用 | 当成带标签的情感计算训练集,直接喂分类网络 |
编辑说明
本页事实以 PhysioNet 官方项目页 1.0.0 版为准,辅以目录列表、Triggers.txt 与 subject_groups.csv 的逐项核对,以及方案论文与结果论文的摘要。凡官方未公布的项,均标注「官方未说明」;凡依据编号空缺或时间戳推断的结论,均标注为推断。正文未下载全量数据做任何分布统计,也未做频次或空值分析。若官方页面后续修订,以官方内容为准。
页面中反复出现的 VP02 的 CLIP-4 是贯穿案例,第一次出现在 §2.3,并在 §4.2、§5.4、§7.3、§9.2 等处回指。选择它是因为它既是全库第一个受试者的第一段蜘蛛视频,又具备编号与播放次序不一致、窗口长度与片段长度不一致两个便于讲解的属性。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- ephnogram — 共享标签:生理信号 / 心电信号 / 可穿戴传感 / 多模态
- qol-stress — 共享标签:生理信号 / 心电信号 / 可穿戴传感 / 多模态
- cardiowave-portable — 共享标签:生理信号 / 心电信号 / 可穿戴传感 / 多模态
- dreamer — 共享标签:生理信号 / 心电信号 / 可穿戴传感 / 多模态
- butqdb — 共享标签:生理信号 / 心电信号 / 可穿戴传感
- drivedb — 共享标签:生理信号 / 心电信号 / 可穿戴传感
- kiel-cardio — 共享标签:生理信号 / 心电信号 / 多模态
- eye-tracking-ecg — 共享标签:生理信号 / 心电信号 / 多模态
- wesad — 共享标签:生理信号 / 可穿戴传感 / 多模态
- ninfea — 共享标签:生理信号 / 心电信号 / 多模态
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

