蜘蛛恐惧者的三十五分钟 — ECG-SPIDER-CLIP 生理信号库

57 人 / 3 路 100 Hz / 每人约 35 分钟

来源 https://physionet.org/content/ecg-spider-clip/1.0.0/发布时间: 2026-10-28最后更新: 2026-10-28 阅读 12
蜘蛛恐惧者的三十五分钟 — ECG-SPIDER-CLIP 生理信号库

信息速览

数据集名称蜘蛛恐惧者的三十五分钟 — ECG-SPIDER-CLIP 生理信号库
数据类型时序信号,波形,元数据
规模57 名(参与 80 名,18–40 岁)
接入方式https://physionet.org/content/ecg-spider-clip/1.0.0/
AI 就绪度

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 — 共享标签:生理信号 / 心电信号 / 多模态

导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

返回 AI-Ready 数据集