信息速览
皮肤电导这件事,在监护仪上从来没有被当作一个正经指标。它被当作应激研究里的一个附属通道,被当作可穿戴手环上一个「情绪」的玩具输出。真正把它当成一条有生理机制的信号来读的,是麻省理工与麻省总医院那一组做麻醉与自主神经的人——他们不满足于「电导曲线升高了」这种描述,而是问:这条曲线上一个个孤立的脉冲,为什么在时间轴上的分布长成那个样子。
这份数据的回答方式是:不发布曲线,只发布脉冲。每个受试者拿到两个单列文件,一个是脉冲发生的时刻(秒),一个是脉冲的幅度。清醒静坐组与丙泊酚镇静组各十一名健康志愿者,前者录一小时、采样 256 Hz、电极贴非惯用手的手指,后者录三到四小时、采样 500 Hz、电极贴左手掌心。原始电导、张力成分、相位成分都不在这里。
所以它不是一份拿来训练皮肤电深度网络的原料库,而是一份「已经替你做完脉选择」的结论库:装着作者用基于汗腺整合发放生理的模型化方法筛出来的事件,供人复现他们的点过程统计。理解它该用来做什么、不该用来做什么,比知道它有多大更要紧。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 全名 | Pulse Amplitudes from electrodermal activity collected from healthy volunteer subjects at rest and under controlled sedation |
| 发布方 | PhysioNet(作者 Sandya Subramanian、Patrick Purdon、Riccardo Barbieri、Emery Brown) |
| 首次发布 | 2021 年 6 月 30 日,版本 1.0 |
| DOI | 10.13026/r9p1-bk90 |
| 受试者 | 22 名健康志愿者,两组各 11 名,两组互不重叠 |
| 清醒组 | 11 名,22–34 岁,非惯用手第二与第四指远端倒数第二节指骨,约 1 小时,256 Hz |
| 镇静组 | 11 名,左手掌心,约 3–4 小时,500 Hz,丙泊酚分阶段控制镇静 |
| 采集设备 | 清醒组用 Thought Technology 神经营养反馈系统;镇静组用 BedMaster |
| 发布内容 | 每位受试者 pulse_times_##.csv 与 pulse_amps_##.csv 两个单列文件 |
| 目录结构 | 顶层两个目录:At-Rest 与 Propofol-Sedation |
| 原始波形 | 不在此次发布范围内,见同组作者另一项目 |
| 刺激与分段标注 | 无。官方明示全部为观察性数据 |
| 许可 | PhysioNet Contributor Review Health Data License 1.5.0 |
| 体量 | 官方未公布文件总字节数 |
| 典型用途 | 点过程统计、脉冲间期分布建模、脉选择方法复现、自主神经状态比较 |
§1 它要解决的具体麻烦
1.1 一条曲线被压成一张点图,麻烦与价值同时在
皮肤电导这条曲线,肉眼看上去最显著的特征是「一波一波地涨起来再慢慢退下去」。每一波对应一小簇汗腺的分泌活动,而这些活动由交感神经节后纤维驱动。生理学上,这种「涨一波、退回去」的过程被写成一个整合发放模型:驱动量累积超过阈值就放一次,然后被清零重来。如果这个模型成立,那么相邻两次脉冲之间的间隔,其分布应该呈现逆高斯形状——这正是漂移扩散过程首次穿越阈值的时间分布。
麻烦就在这里。真实曲线上的「一波」不是一个干脆的尖峰,而是一个上升沿若干秒、下降沿十几到几十秒的隆起;噪声、运动伪影、呼吸引起的基线起伏全都叠在上面。要从这样一条曲线里把「波」一个个挑出来,必须下一个决心:多高的隆起才算一次脉冲。各家软件的做法是用一个固定的幅度阈值,官方页面对此的评价很直接:这类做法无法把脉冲从噪声里分开。
作者的做法是把阈值本身变成一个受试者专属的搜索变量:对每个受试者、每一个候选阈值,都去拟合四类右偏分布(逆高斯、广义逆高斯、对数正态、伽马),看哪一档阈值筛出来的脉冲,其间隔分布最像生理学预测的逆高斯。尾部行为是判据——逆高斯与广义逆高斯尾部沉得慢,对数正态更慢,伽马与指数更快。选定阈值后,还要用拟合优度分析复核一遍。
这一步做完,留给后人的东西就是脉冲表。它省掉了每个人重复实现同一套脉选择的工作,代价是:后人再也看不到曲线,也改不了阈值。
1.2 三条常见的错误期待
期待一:以为这是一份原始皮肤电数据库。 名字里的 Pulse Amplitudes 已经说明了一切,但很多人在检索时会把它和同组作者那份「健康志愿者清醒静息皮肤电」混为一谈。后者的 DOI 是 10.13026/arty-2540,官方页面在「Parent Projects」里写明本库派生自它,并在数据描述里说:那份数据额外含原始未处理信号与张力/相位分解。要原始波形,得去那一份(§3.3)。
期待二:以为两个目录可以当成「同一批人先后两种状态」。 官方摘要的原话是 11 名清醒静坐的志愿者和 11 名「不同的」健康志愿者接受丙泊酚镇静。这是两个独立队列,不是同一组人的前后对照。任何「同一受试者镇静前后皮肤电变化」的分析,都不可能在这份数据上完成。
期待三:以为采样率差异无所谓,可以直接拼接。 两组不只是采样率不同:设备不同、电极位置不同(手指远端指骨对掌心)、记录时长相差三到四倍、所在机构与伦理批件也不同。即便脉冲是用同一套方法提取的,脉冲率本身的量纲都受电极与部位影响。把两个目录拼成一个大数据集训练一个「镇静/清醒」分类器,学到的东西里必然混着器械与部位的差异(§7.3)。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 复现点过程框架下的脉冲间期分布 | 逐事件脉冲时刻,秒为单位 | 够,这正是它设计的用途 |
| 检验逆高斯假设在不同状态下的稳健性 | 清醒与镇静两种状态的脉冲序列各十一份 | 够,但样本小,只能做描述性结论 |
| 做皮肤电原始信号去噪或分解 | 不含原始电导 | 不够,换用父项目或其它库 |
| 训练一个情绪识别模型 | 无情绪标签,无刺激 | 不够,完全不适合 |
| 分析丙泊酚浓度与皮肤电的关系 | 无给药时间曲线,官方指向外部文献 | 不够,需自行对齐外部给药方案 |
| 比较清醒与镇静的自主神经活动 | 两种状态各一组,但器械与部位混杂 | 部分够,须把器械差异当作协变量 |
| 建立「脉冲率—状态」的简单基线 | 每人一份时刻表,算脉冲率只需相除 | 够,这是最低成本的用法 |
| 研究汗腺单次发放的幅度分布 | 逐事件幅度 | 够,振幅层面的分析是本库的主场 |
| 做跨种族、跨年龄的推广 | 22–34 岁、单一中心、健康 | 不够 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 你在写皮肤电信号处理的论文,需要一个已被审稿人接受的点过程基准 | 提供作者已发表的脉选择结果,可直接比对你的新方法 | 先用它算脉冲率与间隔分布,再与作者的参照结果对齐 |
| 你在做镇静深度监测,想知道皮电这一路到底有没有信息 | 提供清醒与镇静两端的脉冲序列,可先做最小可行的判别实验 | 把它当可行性探针,不要当训练集;结果阳性再去申请更大的麻醉库 |
| 你在做可穿戴情绪识别,想找「干净」的皮电标签 | 没有任何情绪标签 | 放弃这份,转去看带唤醒度或效价标注的多模态库 |
| 你要复现某篇引用了点过程模型的论文 | 提供论文所用的同一批脉冲数据 | 直接读作者另发的模型论文,按文献描述的参数复现 |
| 你在评估「多小的样本能做皮电统计」 | 22 个人已经能撑起三篇论文,是一个下限参考 | 按受试者级做统计,不要按脉冲级算样本量 |
| 你需要原始电导做自定义预处理 | 给不了 | 去父项目或其它含原始波形的皮电库 |
1.5 一句话判断
它更像一份「结论」,而非「原料」:作者把最难的脉选择替你做完了,代价是你只能沿着他们的方法往下走,任何想回头改预处理的念头都得先回到父项目。
1.6 不适合谁:四条边界
不适合想把皮电当端到端输入的人。 没有波形,就没有端到端。任何以原始采样点为输入的架构(一维卷积、时序 Transformer、自编码器)在这份数据上都无从下手,因为输入根本不存在。
不适合做人群层面外推的人。 22 名健康志愿者,清醒组年龄 22–34 岁,镇静组年龄官方未公布;单一机构、单一城市。健康、年轻、无合并用药,这三点决定了它的结论只能在「生理机制」层面讨论,不能落到临床人群。
不适合做带标签监督学习的人。 全库没有一个刺激标记。清醒组官方明说「纯粹观察性,没有施加特定刺激」,连受试者在看什么都不受控;镇静组的阶段划分指向外部文献,本库内不含阶段标签。
不适合做器械无关性研究的人。 两组用了两套设备、两种电极部位、两种采样率。若研究目的正是「不同器械下脉冲率是否可比」,它反而是一个可用的负面样本;若只是想研究生理,器械差异就是必须处理的噪声。
§2 数据构成与规格
2.1 一个目录、两个文件、一列数
结构简单到几乎没有解释空间。顶层两个目录,At-Rest 与 Propofol-Sedation。每个目录里,每位受试者两个 CSV:pulse_times_##.csv 存脉冲时刻,单位为秒;pulse_amps_##.csv 存对应脉冲的幅度。官方没有交代幅度用的是什么物理单位,从方法描述的脉络看,它来自原始电导的相对变化,而不是经过标定的微西门子值——这一点在使用时必须当作「相对量」处理。
两个文件的行序一一对应:第 k 行的时刻与第 k 行的幅度,描述的是同一个脉冲事件。行数就是这位受试者被保留的脉冲总数。官方未公布每位受试者的脉冲条数。
文件里没有表头说明、没有受试者元数据、没有采样率字段、没有时间零点说明。时间零点是否对应该段记录的起点,官方页面没有明确写出,这是接入时第一个必须先确认的事项(§5.4)。
2.2 字段与记录的完整字典
| 项 | 位置 | 取值或格式 | 官方说明 | 使用时注意 |
|---|---|---|---|---|
| 组别 | 目录名 | At-Rest / Propofol-Sedation | 按目录分开 | 目录名即唯一的状态标签 |
| 受试者编号 | 文件名的 ## 部分 | 数字,起止未公布 | 文件命名规则明示 | 两组编号是否重复官方未说明 |
| 脉冲时刻 | pulse_times_##.csv | 数值,单位秒 | 官方明确单位为秒 | 零点是段起点还是绝对时间未说明 |
| 脉冲幅度 | pulse_amps_##.csv | 数值,单位未公布 | 官方未写明单位 | 按相对量处理,勿当微西门子 |
| 记录时长 | 无字段 | 清醒约 1 小时,镇静约 3–4 小时 | 摘要与方法段均给出 | 脉冲率需要拿时长作分母 |
| 采样率 | 无字段 | 256 Hz / 500 Hz | 方法段给出 | 只影响原始波形的分辨率,不影响 CSV |
| 设备 | 无字段 | 神经营养反馈系统 / BedMaster | 方法段给出 | 组间比较必须当作协变量 |
| 电极位置 | 无字段 | 非惯用手第二与第四指 / 左手掌心 | 方法段给出 | 部位不同即生理基底不同 |
| 皮肤温度 | 无字段 | 假设恒定 | 方法段写明假设 | 是假设不是测量 |
| 丙泊酚浓度 | 无字段 | 未提供 | 指向外部文献 | 无法在本库内做浓度—脉冲对齐 |
| 意识水平 | 无字段 | 未提供 | 未提 | 无法做事件级二分类 |
| 刺激 | 无字段 | 无 | 官方明示观察性、无刺激 | 情绪类任务无从构造 |
| 原始波形 | 无 | 不发布 | 指向父项目 | 预处理不可改 |
这张表最值得记住的一行是「皮肤温度」:官方写的是「我们假设皮肤与环境温度在整个实验期间恒定」,而不是「我们测量并校正了温度」。假设与测量的差别,在用长时程数据(镇静组三到四小时)时必须牢记——汗腺活动对皮肤温度相当敏感,三四个小时里室温波动与体表温度漂移是否真的可以忽略,本库无法回答。
2.3 一条记录的完整解剖
把一位受试者的数据读进来,得到的是两条等长、按时间升序的数组。下面这段读取与基本核对的代码,只用标准库与 numpy,不需要任何专用解析器。
#-- 读取单个受试者的两份 CSV 并做基本一致性核对
import csv
import pathlib
import numpy as np
def load_subject(root, group, idx):
#-- root 指向解压后的 eda-rest-sedation 目录
d = pathlib.Path(root) / group
t_path = d / f"pulse_times_{idx:02d}.csv"
a_path = d / f"pulse_amps_{idx:02d}.csv"
#-- 单列 CSV,可能是无表头,按全部行当数值读
t = next(csv.reader(open(t_path)))
times = np.array([float(v) for row in csv.reader(open(t_path)) for v in row])
amps = np.array([float(v) for row in csv.reader(open(a_path)) for v in row])
return times, amps
def audit(times, amps, expected_seconds):
report = {}
report["n_pulses"] = int(times.size)
report["length_match"] = bool(times.size == amps.size)
report["monotonic"] = bool(np.all(np.diff(times) >= 0))
report["span_s"] = float(times[-1] - times[0]) if times.size > 1 else 0.0
report["span_vs_expected"] = report["span_s"] / expected_seconds
report["rate_per_min"] = report["n_pulses"] / (expected_seconds / 60.0)
return report
if __name__ == "__main__":
t, a = load_subject("./eda-rest-sedation", "At-Rest", 1)
for k, v in audit(t, a, expected_seconds=3600).items():
print(k, v)
这段代码里有三个刻意的设计。第一,两个文件都按「摊平后全部是数字」处理,因为官方没有说明有没有表头,稳妥的做法是先读第一行判断能否转成浮点。第二,跨度核对用的是「脉冲时刻的最大值减最小值」而不是末值本身——如果时间零点不是段起点,末值会误报;跨度只说明脉冲分布在这段时间内部,不会因为零点偏移而失真。第三,脉冲率的分母用的是官方给的标称时长,不是数据跨度;这两者若差得远,说明时间零点确实有偏移,或者该受试者的脉冲集中在某一段。
一个典型的核对输出大致会呈现这样的形状:条数千量级、跨度接近标称时长、每分钟脉冲数在个位到十位之间。官方未公布这些数的范围,所以这里不给任何「预期值」,只给核对方法。
2.4 两组之间的规格对照
| 规格项 | 清醒静坐组 | 丙泊酚镇静组 | 差异对分析的影响 |
|---|---|---|---|
| 人数 | 11 | 11 | 相等,但为不同个体 |
| 年龄 | 22–34 岁 | 官方未公布 | 可能构成年龄混杂 |
| 电极部位 | 非惯用手第二与第四指远端倒数第二节指骨 | 左手掌心 | 汗腺密度与角质层厚度不同 |
| 采集设备 | Thought Technology 神经营养反馈系统 | BedMaster | 放大器带宽与滤波特性可能不同 |
| 采样率 | 256 Hz | 500 Hz | 只影响原始信号,不影响脉冲表 |
| 时长 | 约 1 小时 | 约 3–4 小时 | 镇静组有更长的漂移暴露 |
| 温度处理 | 假设恒定 | 假设环境温度恒定 | 均为假设,非测量 |
| 姿态与配合 | 坐姿,被要求保持清醒,可阅读或看屏幕,不得用被接电极的手书写 | 控制镇静,分阶段 | 清醒组有认知活动,镇静组无 |
| 伦理批件 | MIT COUHES | MGH 人类研究委员会 | 两个独立批件,两个独立队列 |
| 刺激 | 无 | 无 | 两组都不可做刺激响应分析 |
这张表回答了一个很多人会问的问题:为什么不能把两组拼起来当「二分类数据」。左侧每一行对应的都是「人与设备」的组合差异,右侧写的是这些差异会以什么方式混入结果。若研究方向是「生理状态对脉冲统计的影响」,正确的做法不是消除这些差异(做不到),而是把器械与部位作为协变量显式建模,并且清楚任何结论都只能在这个混杂条件下成立。
2.5 与同类资源的字段差异
| 资源 | 发布层级 | 含原始电导 | 含张力/相位分解 | 含事件表 | 含状态标签 |
|---|---|---|---|---|---|
| 本库(Pulse Amplitudes) | 二次派生 | 否 | 否 | 是 | 仅按目录两级 |
| 同组作者清醒静息皮肤电(10.13026/arty-2540) | 原始加分解 | 是 | 是 | 官方描述为含原始与分解成分 | 清醒 |
| DriveDB 驾驶生理库 | 原始多参数 | 是(手与足) | 否 | 否 | 驾驶负荷场景 |
| DEAP 情绪库 | 原始多模态 | 是 | 否 | 否 | 效价与唤醒度自评 |
| QoL_Stress | 原始多模态 | 是 | 否 | 否 | 放松/应激双相 |
| 术中伤害性刺激索引 | 派生加标注 | 否 | 否 | 是 | 伤害性刺激事件 |
从这张表能看出本库的位置:它是唯一把「脉冲」当成一等公民的皮电资源。别的库给你波形,让你自己切;它给你切好的点,让你只做点上的统计。这个取舍没有对错,只有适配。
§3 它是什么:一份以汗腺为单位的数据集
3.1 皮肤电导被拆成了什么
皮肤电活动在生理学上有两个成分。一个是张力成分(tonic),是皮肤电导的基线水平,变化慢,分钟到小时量级,受汗腺总体分泌状态与角质层水合程度影响;另一个是相位成分(phasic),是一次次快速的上升与缓慢回落,秒到十几秒量级,对应单次或一簇汗腺的分泌爆发。经典的做法是把两者分离(常用的是指数衰减核的卷积模型),再做分析。
本库走的是另一条路:不显式分离成分,而是直接在原始电导上找相位脉冲,输出「时刻+幅度」这张事件表。这条路的理论依据是 §1.1 说过的整合发放模型,它的落点是「脉冲间隔的分布形状」,而不是「成分的波形」。换句话说,它把连续的皮肤电导问题,转换成了一个点过程问题。
这个转换带来一个重要的性质:分析的单位从采样点变成了事件。一条一小时的 256 Hz 记录有三万六千余秒、九十二万余个采样点;而一位受试者的脉冲可能只有几百个。样本量的这个缩水,既是本库被批评的地方(统计功效低),也是它的方法论主张所在(点过程本来就不需要海量样本,需要的是干净的事件定义)。
3.2 两组的分工不是对照实验
把两个目录理解成「清醒 vs 镇静」的对照,是一种合理的简化,但必须知道它的边界。真正的对照实验应当是:同一批人、同一套器械、同一部位、随机顺序、两次记录。本库的两组,人在哪一端都不重合,器械不同、部位不同、机构不同、批件不同。
那它为什么还值得放在一起?答案是:它服务于一个更宽泛的假设检验——同一种生理机制(汗腺整合发放)是否在截然不同的自主神经状态下都表现为相似的脉冲间期结构。这个假设只需要「两种状态下的脉冲序列都符合某类分布」,不需要同一批人。作者在方法论文里对清醒组做了这项检验,并在镇静数据上做了使用(§8.2)。
对使用者而言,这意味着一个实用的判别标准:如果你想问的是「镇静让脉冲变少了多少」,本库给不了干净答案;如果你想问的是「脉冲间期的分布形状在两种状态下是否稳定」,本库正好是为此准备的。
3.3 与父项目的关系
官方页面的「Parent Projects」区写明,本库派生自「Electrodermal Activity of Healthy Volunteers while Awake and at Rest」1.0 版,DOI 为 10.13026/arty-2540。数据描述段进一步说明:那部分数据与本库有重叠,但那份数据额外含原始未处理信号,以及分离后的张力与相位成分。
这一句话解决了很多人的困惑。想要原始波形的,去父项目;想要已经被脉选择筛选过、方便直接做点过程统计的,用本库。两份数据的关系是「原料与半成品」的关系,不是「新旧版本」的关系——父项目只覆盖清醒组,镇静组的原始波形并不在它那里。这一点在官方描述里没有单独强调,但从父项目的标题与描述可以确认:它只针对清醒静息。
3.4 一条脉冲在当地发生了什么
理解单条记录最快的办法,是顺着一次脉冲走一遍。假设某位清醒组受试者在下午三点十二分左右,交感神经的一次发放到达掌心与指腹的汗腺,乙酰胆碱作用于腺体,腺体分泌的汗液通过导管进入角质层,角质层的电导升高,电极测到的两点间电导随之上升。这个上升在原始波形上是一个几秒量级的爬坡,随后腺体分泌停止,汗液被重新吸收与蒸发,电导以十几到几十秒的时程回落。
本库做的事,是在这个爬坡的顶点附近记下一个时刻,在那个时刻量出电导相比基线高出多少,作为幅度。它不记录爬坡的斜率,不记录回落的时程,也不做反卷积去还原神经发放的精确时刻。所以「脉冲时刻」是一个生理事件的时间标号,不是一个神经事件的时间标号;两者之间的差,正是汗腺这一级传递函数带来的延迟。这条链上的每一环——腺体密度、皮肤厚度、汗液重吸收速度、环境温湿度、电极贴合度——都会参与决定幅度。
这也解释了为什么幅度这一个数值在不同受试者之间不能直接比。同一次神经发放,在手掌与小臂上测到的幅度可以差出数倍。本库的两组恰好用了两个不同部位,这让跨组比幅度几乎注定被部位效应污染。
§4 点过程这条路:为什么只有几百个点也够用
4.1 事件数据的统计逻辑与采样点数据不同
如果拿一条十万采样点的波形去做分类,样本量的说法是「十万个点、一个标签」;如果拿一张几百个事件的表去做统计,样本量的说法是「几百个事件、一个受试者」。这两者的推断边界完全不同。前者的问题在于点与点之间高度自相关,有效自由度远小于采样点数;后者的点与点之间共享同一个受试者的汗腺配置,也存在相关,但至少每个点都是一个可辨识的独立生理事件。
点过程框架的主张正是:脉冲间隔的分布形状,本身就携带受试者的自主神经状态信息。如果这个主张成立,那么几百个间隔就足以给出一位受试者的统计画像,不需要海量数据。作者在方法论文里对 11 名清醒志愿者做了这项检验,报告的结果是:每一条序列都被逆高斯模型准确描述,用柯尔莫哥洛夫—斯米尔诺夫度量衡量。这是本库最核心的一条科学依据,也是它只有 22 人却仍然被引用的原因。
4.2 四种右偏分布各代表什么
脉选择方法里拟合四类分布,不是为了选一个最好的,而是为了用尾部行为做判别。四类分布的尾部沉得越慢,说明越多的长间隔被纳入,也就越接近「等待时间长尾」的生理预期。可以用一张表把它们的角色列清楚。
| 分布 | 尾部行为 | 在本方法中的角色 |
|---|---|---|
| 逆高斯 | 由漂移扩散首次穿越时间导出,是生理上的先验 | 首选,尾部沉得慢 |
| 广义逆高斯 | 含逆高斯作为特例,多一个形状参数 | 用于检验偏离方向 |
| 对数正态 | 尾部更重,允许长间隔更多 | 代表极慢状态 |
| 伽马 | 尾部更轻 | 代表快节奏状态 |
| 指数 | 尾部最轻,无记忆 | 用作对照的下界 |
这张表解释了作者方法为什么被称为「模型化」的方法:阈值不是靠经验拍的,而是靠「哪一档阈值能让间隔分布最像生理」反推出来的。换一个受试者,阈值就变;换一种状态,同一个受试者的阈值也可能变。
4.3 一个具体的判别场景:清晨与深夜
设想一个具体的对照:同一个人,清晨静躺半小时与深夜睡前静躺半小时,皮肤电的脉冲会怎样变化。晨间交感张力偏高,脉冲更密、幅度更大;夜间副交感占优,脉冲变稀、幅度变小,甚至整段时间只有零星几个。若用固定的绝对幅度阈值,深夜的序列可能一个脉冲都切不出来;若用固定百分位阈值,清晨会把噪声也当成脉冲。
这就是模型化阈值在实际场景里的优势:它不假设两者有同一个「高」的标准,而是各自找各自能让分布长成生理样子的那一档。本库的清醒组数据这类「生理状态自然漂移」的场景很像——一小时静坐,允许阅读、冥想或看屏幕,不控制内容,因此受试者的觉醒水平在一小时内会有真实的起伏。官方明说没有施加刺激,这句话的另一面是:数据的变异性来自自然波动,而不是设计好的操控。
4.4 案例:一位清醒受试者的一小时
把 §4.3 的场景具体化。取 At-Rest 目录里任意一位受试者,把他的一小时切成六个十分钟的窗口,分别数脉冲数,再算每两个窗口之间的间隔中位数。你会得到一张很朴素的表:脉冲数在窗口之间上下浮动,间隔中位数随之反向浮动。这张表不需要任何高级工具,只需要把 pulse_times 那一列做差分、分组、取分位数。
这个练习的价值不在结果,而在它暴露的三件事。第一,一小时内脉冲率不是常数,用整段平均会抹掉节奏;第二,窗口切得越细,每个窗口里的事件越少,间隔中位数的抖动越大,这正是小样本的直接后果;第三,如果某位受试者的某几个窗口一个脉冲都没有,说明他的阈值被定在了很高的位置,或者那段时间皮肤电确实安静——这两种情况从事件表上无法区分,只能回到原始波形。
§4.4 的案例会在 §7.3 与 §9.2 再次出现,分别用来说明偏差来源与最短流程的具体落点。
4.5 为什么作者要发布事件表而不是代码
一个自然的疑问是:既然方法论文已经公开,为什么还要单独发数据?答案是,方法可以复现,但脉选择的结果不能随意复现——阈值搜索对噪声、对边界条件、对实现细节都敏感。同一份原始波形,两组研究者按同一篇论文实现,很可能得出不同的脉冲集。发布事件表,等于发布了一个「冻结的参照结果」:后来者可以拿自己的实现去对齐它,从而把「方法是否被正确实现」与「方法是否有效」两件事分开。
这也是本库在方法学上的定位:它是方法论文的配套数据,为「我的实现和作者的一致吗」这个问题提供答案。任何以它为基础的二次分析,都应当先做一次这样的对齐。
§5 怎么把它取下来并用起来
5.1 获取路径与地区限制
官方页面在文件区对部分访问者返回「本地区因法律或政策限制数据不可用」。本次访问也遇到了同样的提示,目录列表接口与文件接口均返回 403 或该提示语。这意味着两件事:第一,能否取到文件取决于访问所在地,不取决于账号权限;第二,本页所有关于文件内容与命名的描述,均来自官方正文的「Format」小节与数据描述段,而不是来自实际下载的文件。
官方正文明示的访问政策是:任何人只要遵守许可条款即可访问。许可为 PhysioNet Contributor Review Health Data License 1.5.0,配套数据使用协议为同名 1.5.0 版。这两个名字与常见的 ODC-BY 不同,属于 PhysioNet 的贡献者评审类许可,使用时须按其条款而非 ODC-BY 理解。
| 获取途径 | 地址 | 本次访问状态 |
|---|---|---|
| 项目主页 | https://physionet.org/content/eda-rest-sedation/1.0/ | 200,正文可取 |
| 文件目录 | https://physionet.org/files/eda-rest-sedation/1.0/ | 403 |
| At-Rest 子目录 | 项目内 At-Rest/ | 403 |
| Propofol-Sedation 子目录 | 项目内 Propofol-Sedation/ | 403 |
| DOI 解析 | https://doi.org/10.13026/r9p1-bk90 | 解析到项目页 |
5.2 下载与解压的一般流程
即便在可访问的地区,推荐的做法也是先取项目页与许可,再取文件。下面这段脚本只做一件事:把两个目录的文件清单抓下来,作为后续逐文件下载的输入。它在受限地区会得到空清单,这时应停止,而不是继续尝试。
#-- 在可访问地区执行:先确认项目页可达,再取两个子目录的清单
BASE="https://physionet.org/files/eda-rest-sedation/1.0"
for d in "At-Rest" "Propofol-Sedation"; do
echo "== $d"
curl -sL --max-time 30 "$BASE/$d/" \
| grep -oE 'pulse_(times|amps)_[0-9]+\.csv' \
| sort -u > "list_${d}.txt"
wc -l "list_${d}.txt"
done
若清单为空,先看返回码再判断:403 是地区策略,302 是登录跳转,200 而清单为空则说明目录页结构与预期不同。这三种情况要分别处理,不要盲目重试。
5.3 校验:两份文件的长度必须一致
拿到文件后第一件事不是建模,是核对。pulse_times 与 pulse_amps 必须等长;时刻必须单调不减;时刻必须落在记录时长之内。下面这段脚本对整批做一遍,把异常受试者单独列出来。
#-- 批量核对:等长、单调、跨度合理
import csv
import pathlib
def read_col(p):
with open(p, newline="") as f:
return [float(v) for row in csv.reader(f) for v in row
def check_group(root, group, expected_hours):
out = []
for t_path in sorted((pathlib.Path(root) / group).glob("pulse_times_*.csv")):
idx = t_path.stem.split("_")[-1]
a_path = t_path.with_name(f"pulse_amps_{idx}.csv")
if not a_path.exists():
out.append((idx, "missing_amps"))
continue
t, a = read_col(t_path), read_col(a_path)
if len(t) != len(a):
out.append((idx, f"len_mismatch {len(t)} vs {len(a)}"))
elif any(t[i] > t[i + 1] for i in range(len(t) - 1)):
out.append((idx, "not_sorted"))
elif t and (t[-1] - t[0]) > expected_hours * 3600 * 1.2:
out.append((idx, "span_too_long"))
else:
out.append((idx, "ok", len(t)))
return out
if __name__ == "__main__":
for row in check_group("./eda-rest-sedation", "At-Rest", 1):
print(row)
这一段把「跨度上限」设为标称时长的一点二倍,是一个保守的经验界:若时间零点不对应段起点,跨度可能偏小;若存在时间戳拼接错误,跨度可能一跃超出标称值很多。超限的受试者应当逐一回看,而不是直接丢弃。
5.4 时间零点:必须先定的一个约定
前面反复提到时间零点。官方只给了「单位为秒」,没有说是相对段起点还是绝对时间。三种可能都会改变分析:若是相对起点,则末值就是这段记录的长度;若是相对某个全局时刻(比如整场实验的动员时刻),则清醒组的末值可能远超一小时;若是按文件重排过,则单看数值无法判断。
处理办法是拿「末值减首值」与官方标称时长做比较。清醒组标称约一小时,镇静组标称约三到四小时,两者的区间都有弹性。若某组的末值普遍落在标称上限之内,基本可以判定为相对起点;若普遍超出一大截,则应把时间差当作相对间隔使用,不把绝对值当作含义。
#-- 用末值分布判断时间零点口径
import pathlib
def last_values(root, group):
vals = []
for p in sorted((pathlib.Path(root) / group).glob("pulse_times_*.csv")):
txt = p.read_text().strip().split()
if txt:
vals.append(float(txt[-1].replace(",", " ").split()[-1]))
return vals
if __name__ == "__main__":
v = last_values("./eda-rest-sedation", "At-Rest")
print(len(v), min(v), max(v))
若最大值明显超过三千六百秒,说明零点不是段起点;若都落在三千六百秒上下,则口径基本确定。这一步不做,后面的脉冲率就会系统性偏大或偏小。
5.5 从事件表到统计量
事件表能直接给出的量不多,但每一个都稳:脉冲数、脉冲率、间隔序列、间隔的分位数、幅度的分布。下面的代码是一份最小统计的骨架,输出可以直接塞进论文的描述性表格。
#-- 每位受试者一组描述统计
import numpy as np
def subject_stats(times, amps, nominal_seconds):
d = np.diff(np.asarray(times))
return {
"n": int(len(times)),
"rate_per_min": len(times) / (nominal_seconds / 60.0),
"iqi_median_s": float(np.median(d)) if d.size else float("nan"),
"amp_median": float(np.median(amps)) if len(amps) else float("nan"),
"amp_cv": float(np.std(amps) / np.mean(amps)) if len(amps) else float("nan"),
}
这份骨架里刻意省掉了常用的时域指标(如皮电反应幅度、恢复时间),因为那些指标需要原始波形,而本库不给。能用事件表算的,就只有点和点之间的关系。这不是缺陷,而是使用边界的自然结果。
5.6 与点过程模型的对接
若要用逆高斯模型做检验,输入是间隔序列,输出是拟合参数与拟合优度。下面的代码用矩估计给出一个粗拟合,足以做探索,不足以替代正式检验。
#-- 间隔序列的逆高斯矩估计与简单优度检查
import numpy as np
def ig_moments(intervals):
x = np.asarray(intervals, dtype=float)
mu = float(np.mean(x))
lam = float(mu ** 3 / np.var(x, ddof=1))
return mu, lam
def ks_distance(x, cdf):
x = np.sort(np.asarray(x, dtype=float))
n = x.size
emp = np.arange(1, n + 1) / n
return float(np.max(np.abs(emp - cdf(x))))
正式检验应改用极大似然,并报告参数的标准误;矩估计在这里只用于快速看形状。若要复现作者的结论,应直接读方法论文给出的做法,不要以这段骨架替代。
§6 与库内记录的关系
6.1 关系图谱
本库在站内不是孤岛。它与三类记录构成关系:同机构同方法的麻醉与自主神经族、含皮电通道的多模态生理库、以及同名易混的皮肤图像族。这张表把关系与区隔一次说清。
| 站内记录 | 与本库的关系 | 关键区隔 |
|---|---|---|
| propofol-anesthesia-dynamics | 同组作者、同机构、同为丙泊酚 | 那份是九人十阶段、含意识消失与恢复时刻与心率变异性索引;本库为十一人、只发脉冲表、无意识标签 |
| eeg-power-anesthesia | 同机构麻醉数据 | 那份是脑电多锥谱与逐两秒意识标签;本库无脑电 |
| multimodal-surgery-anesthesia | 同机构术中自主神经 | 那份是手术中、含标注事件与药物记录;本库是志愿者、无事件标注 |
| autonomic-aging-cardiovascular | 同为自主神经静息数据 | 那份是心电加连续血压、千余人;本库是皮电、二十二人 |
| drivedb | 同为含皮电的 PhysioNet 库 | 那份是驾驶场景多参数、无状态标签;本库有静息与镇静两级 |
| qol-stress | 同为皮电多模态 | 那份是 Fitbit 采集、含自评量表;本库是专用设备、无自评 |
| deap | 同为生理信号情绪研究 | 那份有情绪自评标签;本库无任何刺激与标签 |
| cobra、skincap、skincon 等 | 仅名称相近 | 那几份是皮肤图像与病理,与本库无数据交集 |
这张表里最需要强调的一行是最后一行。以「皮肤」为关键词检索时,皮肤图像族会大量出现,而它们的皮是「皮肤疾病」的皮,与皮肤电导无关。站内检索应当用「皮肤电」或「皮电」而不是单用「皮肤」。
6.2 检索路径
按使用目的,有三条检索路径。
| 你想找的 | 站内关键词 | 会命中的记录 | 备注 |
|---|---|---|---|
| 皮肤电的原创事件级数据 | 皮肤电、皮电、电导、汗腺 | 本库 | 唯一以脉冲为单位的记录 |
| 麻醉下的自主神经变化 | 丙泊酚、镇静、自主神经 | propofol-anesthesia-dynamics、multimodal-surgery-anesthesia | 三份可对照阅读 |
| 麻醉下的脑电 | 麻醉脑电、意识水平 | eeg-power-anesthesia | 与本库互补,不重叠 |
| 静息自主神经的基线 | 静息、心率变异性 | autonomic-aging-cardiovascular | 规模远大于本库 |
| 带情绪标签的皮电 | 情绪、唤醒度 | deap | 有标签,但无镇静 |
| 可穿戴皮电 | 可穿戴、Empatica | qol-stress 等 | 器械层级完全不同 |
检索时最容易犯的错是把「皮电」当成一个检索词直接去找「有没有可用数据」,然后按体量排序。本库在体量上毫无竞争力,但在「事件定义是否已冻结」这一点上独一无二。检索的目标应当先定:你要的是原料,还是结论。
6.3 与 propofol-anesthesia-dynamics 的逐项对照
这两份数据来自同一批作者、同一家医院,容易被人当作同一件事的两种版本。逐项对照下来,差异相当大。
| 对照项 | 本库 | propofol-anesthesia-dynamics |
|---|---|---|
| 受试者 | 11 名镇静组 | 9 名 |
| 给药程序 | 分阶段,具体浓度变化指向外部文献 | 十阶段,浓度 0 升至 5 再降回 0,每阶段约十五分钟 |
| 记录时长 | 约 3–4 小时 | 约 3 小时 |
| 心率变异性 | 无 | 有,逐拍索引 |
| 意识消失与恢复时刻 | 无 | 有,按钮反应判定 |
| 皮肤电内容 | 逐事件脉冲时刻与幅度 | 皮电点过程索引,按窗口汇总 |
| 脑电 | 无 | 无 |
| 发布内容形态 | 两个单列 CSV | 多位受试者多文件 CSV 加代码 |
这张表的关键结论是:意识状态标签只在那份数据里。如果你想做「意识消失时刻的皮肤电变化」,本库给不了时刻,必须去那份数据;如果你只想要事件级的脉冲表,本库给得更直接。两份数据应视为互补,不能互相替代。
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
在给这份数据打分之前,要先纠正一个常见的框架错位:它不是按「数据量」这个维度设计的产品,用数据量去衡量它必然得出低分,而这个低分没有信息量。它的设计目标是为一套统计方法提供冻结的参照结果,衡量它的尺子应当是「事件定义是否清晰、方法是否可复现、边界是否透明」。用图像分类数据集的标准去衡量它,就像用体重秤去量身高。
同样的错位也会导致误判:看到 22 名受试者就断定「不能做统计」,看到没有原始波形就断定「质量差」。这两条判断都跳过了它原本的用途。本节下面的评分,每个维度都会先说清「在本库的用途下这意味着什么」。
7.1 DAIMS 五维评分
按 DAIMS(Data and AI Model Scorecard)常用的五维做一次粗评,满分各五分,作为监督数据源与作为方法参照两种用途分别给分。
| 维度 | 作为方法参照 | 作为监督数据源 | 依据 |
|---|---|---|---|
| 数据规模 | 4 | 1 | 事件数按人计足够做描述统计,按人计只有 22 |
| 标注质量 | 4 | 2 | 事件由模型化方法筛出并有优度复核,但无独立人工标注 |
| 文档完整度 | 3 | 3 | 方法段详尽,字段说明极简,单位与零点未明 |
| 可获取性 | 3 | 3 | 许可清晰,但部分地区受限,且无一次性打包 |
| 可复用性 | 3 | 2 | 事件表可直接用,预处理不可改,组间混杂 |
| 合计 | 17 | 11 | 两种用途分差明显,与它的设计取向一致 |
分差的来源只有一个:它把最难的预处理固定在原地了。对以方法为参照的人,这是资产;对想拿它做训练集的人,这是负债。
7.2 分数的具体依据
规模一项给「作为方法参照」四分而非满分,理由是事件级样本虽够,但受试者级样本只有 22。任何跨个体的结论都落在一个很窄的置信带上,作者自己的论文也是以「每一条序列都被描述」的方式表述,而不是「这一组人平均如何」。
标注质量一项的两分与四分,区别在于「有没有独立的人工标注作为对照」。本库的事件是算法筛出来的,作者用拟合优度做了自洽性复核,这是一种「内部一致」而非「外部正确」的证据。它足以支撑方法论文的结论,不足以支撑「这些就是全部真实脉冲」的更强主张。
文档一项的三分,扣在字段层面。官方把采集条件写得很细(设备、部位、采样率、时长、假设),但把文件本身写得很薄:无单位、无表头说明、无零点说明、无编号起止。这种「方法详、字段略」的文档风格在同组作者的数据里比较一致,使用者应当预期需要自己补一层解析。
7.3 已知的、可枚举的偏差
| 偏差 | 方向 | 对结果的典型影响 |
|---|---|---|
| 组间器械与部位不同 | 两组的幅度与脉冲率都掺入器械效应 | 跨组比幅度不可信,比脉冲率也需谨慎 |
| 健康青壮年、单一中心 | 脉冲率与幅度偏向该人群 | 向老年或病人外推会低估变异 |
| 记录一小时的样本少 | 窗口越细,脉冲数波动越大(§4.4 的案例) | 短窗口的统计量不稳定 |
| 温度只作假设未测量 | 长时程中温度漂移进入信号 | 镇静组三到四小时的基线漂移无法被解释 |
| 无刺激、无标签 | 数据变异性来自自然波动 | 无法定义事件相关的响应 |
| 阈值按受试者选 | 个体间幅度可比性下降 | 跨受试者比幅度需先标准化 |
| 事件表不可回收 | 预处理链路固定 | 换方法无法在同一批数据上验证 |
第一行值得展开。§4.4 的案例里,如果那位清醒受试者与一位镇静受试者的脉冲率相差一倍,这个差异里有多少来自镇静、多少来自「手指远端 vs 掌心」,本库无法回答。除非研究者的结论只在「两种状态各自的分布形状」这一层面陈述,否则混杂就无法回避。
7.4 外部验证矩阵
| 验证来源 | 能验证什么 | 不能验证什么 |
|---|---|---|
| 方法论文(PNAS 2020) | 清醒组间隔分布符合逆高斯 | 镇静组是否同样符合 |
| 方法论文(IEEE TBME 2021) | 模型化脉选择在不同队列与噪声下的稳健性 | 具体阈值数值的可移植性 |
| 镇静自主神经论文(PLoS ONE 2021) | 行为与自主神经动态的关联 | 本库事件表与其索引逐项对应 |
| 父项目(arty-2540) | 清醒组原始波形与分解成分 | 镇静组原始波形 |
| 同组作者其它 PhysioNet 发布 | 同机构的方法一致性 | 受试者是否重叠 |
这张表说明了一件重要的事:本库的每一项主张,都能在某一篇论文里找到落点;但没有任何一项主张,能在另一份独立团队的数据上得到外部验证。这不是本库独有的问题,而是小样本方法论文的通病。使用者应当把「已发表的内部一致」与「已独立复现」当作两件事。
7.5 它为何能持续:一个被反复引用的冻结参照
小库能活下来的方式,通常不是靠数据量,而是靠它占据了一个别人不愿意重做的位置。本库的位置是「已冻结的脉选择结果」:重做这件事需要原始波形、需要按论文实现阈值搜索、需要处理每个受试者的噪声差异,成本高、收益低。有人做了并公开,后来者便会引用它,而不是重做。
这个机制还带来一个副产品:它的引用会集中在方法学论文里,而不是应用论文里。这解释了为什么它的下载量不大,却在点过程与皮电分析的圈子里稳定出现。只要整合发放模型仍是皮电分析的主流解释之一,这份冻结结果就仍有参照价值。
§8 生态位与历史
8.1 从皮肤电到点过程的这条线
皮肤电的研究史可以粗分三段。第一段是临床与心理生理学的描述期,重点是把皮肤电导测准、把反应与刺激对上;第二段是成分分离期,把慢的张力与快的相位分开,用指数衰减模型去拟合;第三段是事件化期,也就是本库所在的这一段,把连续信号转成点过程,用间隔分布做推断。
第三段的转折点是整合发放模型的引入。它把「汗腺为什么这样发放」解释成一个可推导的随机过程,从而给间隔分布一个先验形状(逆高斯),再把这个先验当作脉选择的判据。这个转向的意义在于:阈值不再是一个需要拍脑袋的超参数,而是一个可以被生理约束反推的量。
8.2 作者的系列工作与本库的位置
同组作者围绕这条线做了一串工作,本库是其中的数据落点之一。
| 年份 | 工作 | 与本库的关系 |
|---|---|---|
| 2020 | 点过程刻画皮肤电(PNAS) | 用清醒组数据验证逆高斯结构,是本库的科学基础 |
| 2020 | 整合发放模型解释脉冲幅度(预印本) | 幅度层面的理论支撑 |
| 2021 | 模型化脉选择(IEEE TBME) | 本库事件表所用的方法 |
| 2021 | 丙泊酚下行为与自主神经动态(PLoS ONE) | 与本库镇静组相关的分析,但受试者数不同 |
| 2021 | 本库发布 | 把方法论的中间产物冻结公开 |
这五件事连起来看,本库的位置很清楚:它不是一个新数据集,而是一组论文的中间产物被整理成可下载的形态。理解这一点,就不会期待它有额外的标注或更大的规模。
8.3 同类资源为什么不走这条路
绝大多数皮电数据集选择发布原始波形,原因很实际:波形是通用的,事件表是方法专属的。发布波形,别人可以用任何方法处理;发布事件表,别人只能用你的方法,或者把你的结果当作对照。前者受众广,后者受众窄。
本库选择后者,等于接受了一个较小的受众,换来一个较高的复用精度。这个取舍在方法学社区里是合理的,在应用社区里则显得不友好。这也是为什么同一批作者同时发布了父项目(波形)与本库(事件)——让两类受众各取所需。
8.4 它在今天的可用性
今天再回头看,这份数据的价值没有衰减,但它的使用方式变了。当年它的主要用途是复现作者的统计流程;今天,它更多被当作「皮电事件检测算法」的黑盒测试输入——你写了一版新的脉检测,把结果和它对齐,看差多少。
这个新用途也带来了新的坑:对齐的前提是两边用的是同一批原始波形。若拿它去测一个基于不同前置滤波的实现,差异里会同时含有滤波差异与算法差异。想清楚这一点,再用它当基准,才不会把工程差异误读成算法优劣。
§9 使用指引
9.1 三种角色的路径
| 角色 | 最短路径 | 主要收获 | 主要风险 |
|---|---|---|---|
| 方法研究者 | 取事件表 → 算间隔 → 拟合分布 → 与论文数值比对 | 验证自己的实现 | 把门槛设得过宽,忽略了阈值搜索 |
| 应用工程师 | 取事件表 → 算脉冲率与幅度分布 → 做可行性探针 | 判断皮电是否有信息 | 直接拿去做训练,过拟合 |
| 教学与综述作者 | 取两组各一位受试者 → 画间隔分布 → 讲点过程 | 一个干净的示例 | 把两组当对照讲,误导听众 |
第一类人应当从方法论文出发,把本库当作对齐目标;第二类人应当把它当作「假设是否值得投入」的快速检验;第三类人应当只取单组,避免在课堂上制造一个假的对照。
9.2 一条最短的可用流程
下面是本库最短的一条完整流程:取一位清醒受试者的事件表,算间隔,做分布拟合,输出一张可以写进论文的图。
#-- 最短流程:单受试者间隔分布与拟合
import numpy as np
def load_two(path_t, path_a):
t = np.loadtxt(path_t, delimiter=",", ndmin=1)
a = np.loadtxt(path_a, delimiter=",", ndmin=1)
assert t.shape == a.shape, "times 与 amps 长度不一致"
return t, a
def pipeline(path_t, path_a, nominal_seconds=3600.0):
t, a = load_two(path_t, path_a)
iq = np.diff(t)
mu, lam = float(iq.mean()), float(iq.mean() ** 3 / iq.var(ddof=1))
return {
"n": int(t.size),
"rate_per_min": t.size / (nominal_seconds / 60.0),
"iqi_mean_s": mu,
"iqi_median_s": float(np.median(iq)),
"ig_mu": mu,
"ig_lambda": lam,
"amp_median": float(np.median(a)),
}
if __name__ == "__main__":
print(pipeline("At-Rest/pulse_times_01.csv", "At-Rest/pulse_amps_01.csv"))
这个流程与 §4.4 的案例是同一件事的实现版:窗口级的问题在这里被收窄成单个受试者的整段统计,先跑通再看是否需要细化窗口。文中所有路径都按 At-Rest 目录相对当前工作目录书写,实际执行前请把目录改成你的解压位置。
9.3 引用方式
使用本库时,官方给出的引用格式为:作者列全、标题全称、标注版本 1.0、期刊署名为 PhysioNet、年份 2021、DOI 10.13026/r9p1-bk90,并建议同时附上 PhysioNet 平台本身的引用。若分析涉及父项目的数据来源,还应把 DOI 10.13026/arty-2540 一并列出。
论文方法段建议写明三点:使用了哪个目录(哪一组)、是否对两组做过器械协变量控制、是否自行重做过脉选择。第三点尤其重要——若你直接在作者的事件表上做分析,结论的成立范围就被限定在作者的脉选择方法之内;若你重做过,就应当在方法段说明你与作者方法的差异。
§10 AI 使用声明
| 项目 | 声明 |
|---|---|
| 文本生成 | 本文由 AI 辅助撰写,编辑负责结构与事实把关 |
| 数字来源 | 规模、结构、边界三类数字来自 PhysioNet 官方项目页与 Europe PMC 摘要 |
| 文件核验 | 项目页正文已取;文件目录在本次访问中返回 403,未能核对文件名与题头 |
| 论文信息 | 仅阅读摘要,未读全文 |
| 未核验内容 | 文件编号起止、时间零点口径、幅度的物理单位、各组事件条数、总字节数 |
| 图像 | 无配图;封面为生成式提示词,不含真实生理信号 |
| 免责 | 本文不构成临床建议;使用须遵守 PhysioNet Contributor Review Health Data License 1.5.0 |
常见误读(避坑清单)
| 说法 | 实际 | 证据 |
|---|---|---|
| 这是一份皮肤电原始波形库 | 只有事件表,原始波形在父项目 | 官方 Format 段与 Parent Projects 区 |
| 两组是同一批人前后对照 | 两组为不同个体 | 官方摘要明确写「不同的」健康志愿者 |
| 清醒组一共采了 11 人 | 采了 12 人,一人因雷诺现象排除 | 官方 Methods 段 |
| 镇静组就是丙泊酚十阶段九人那份 | 人数与编号体系都不同 | 两份 PhysioNet 项目的官方描述 |
| 脉冲时刻等于交感神经放电时刻 | 汗腺延迟与平滑使两者相差数秒 | 官方 Background 段对汗腺机制的说明 |
| 脉冲幅度可以直接跨人比较 | 幅度受皮位、皮肤厚度、电极接触影响 | 官方 Methods 段列出两种电极位置 |
| 可以拿它训练情绪分类模型 | 无刺激、无标签,官方明示观察性 | 官方 Usage Notes 段 |
| 许可等同于 ODC-BY | 为 PhysioNet Contributor Review 1.5.0 | 官方 Access 区 |
| 全库体量很小,可以一次取全 | 官方未公布体积,且部分地区受限 | 官方文件区提示与本次访问结果 |
| 时间单位是秒,可以直接当毫秒用 | 单位是秒,转换需自查 | 官方 Format 段 |
FAQ
问:这份数据能不能直接做深度学习的输入?
不能直接做。它没有波形,只有事件。若一定要用,只能把事件表当作特征,例如按窗口统计脉冲数与幅度,这已经不是端到端。
问:为什么只有 22 人还能发论文?
因为它的推断单位是事件与序列,而不是人。作者对 11 条清醒序列逐一做分布检验,报告每条都能被逆高斯描述。这种表述方式本身就不依赖人群层面的统计。
问:镇静组的丙泊酚浓度在哪?
不在本库。官方在数据描述里写明浓度随时间变化的情况见外部文献,本库不含给药曲线。
问:能把两组拼起来做二分类吗?
技术上前提具备(两类事件表),但结果会被器械与部位差异污染。若要尝试,必须把设备与电极部位作为协变量,并在结论里明确这一限制。
问:文件编号从 1 开始还是从 0 开始?
官方未公布。只能从实际下载的文件名判断,或从目录清单推断。
问:脉冲幅度的单位是什么?
官方未写明。应按相对量处理,不要当作微西门子。
问:为什么我下载不到文件?
文件区对部分访问地区返回不可用提示。这是地区策略,不是账号问题,也不是数据集下架。
问:它与父项目能否混用?
可以,但要清楚父项目只覆盖清醒组,且会给原始波形与分解成分。两者重叠部分的数据是一致的。
问:能不能用它评估新的脉检测算法?
可以,但它只能对齐到作者的方法。若你的实现前置滤波不同,差异中会混入滤波效应。
问:为什么要强调只取一组做教学?
因为两组混杂,课上演示成对照会传递错误的方法论。单组演示反而能干净地讲清点过程。
术语表
| 术语 | 英文 | 含义 |
|---|---|---|
| 皮肤电活动 | electrodermal activity, EDA | 皮肤电导随汗腺活动变化的统称 |
| 皮肤电导 | skin conductance | 两点之间的电导,单位西门子 |
| 张力成分 | tonic component | 缓慢变化的基线水平 |
| 相位成分 | phasic component | 秒量级的脉冲式上升与回落 |
| 脉冲 | pulse | 一次可辨识的电导上升事件 |
| 脉冲时刻 | pulse time | 脉冲发生的时间标号,单位秒 |
| 脉冲幅度 | pulse amplitude | 脉冲相对基线的抬升量 |
| 脉冲间隔 | inter-pulse interval | 相邻两次脉冲的时间差 |
| 点过程 | point process | 以事件时刻为基本单位的随机过程 |
| 整合发放 | integrate-and-fire | 驱动量累积超过阈值即发放的模型 |
| 逆高斯分布 | inverse Gaussian | 漂移扩散首次穿越时间的分布 |
| 广义逆高斯 | generalized inverse Gaussian | 含逆高斯为特例的三参数族 |
| 对数正态 | lognormal | 尾部较重的右偏分布 |
| 伽马分布 | gamma | 尾部较轻的右偏分布 |
| 拟合优度 | goodness of fit | 检验模型与数据吻合程度的方法 |
| 柯尔莫哥洛夫—斯米尔诺夫度量 | Kolmogorov-Smirnov | 经验分布与理论分布的最大偏差 |
| 交感神经 | sympathetic nervous system | 驱动汗腺分泌的神经分支 |
| 汗腺 | sweat gland | 分泌汗液的皮肤腺体 |
| 乙酰胆碱 | acetylcholine | 交感节后纤维作用于汗腺的递质 |
| 非惯用手 | non-dominant hand | 受试者不常用的那只手 |
| 远端指骨 | distal phalanx | 手指末节,电极所贴位置 |
| 丙泊酚 | propofol | 静脉麻醉药,用于本库镇静组 |
| 程控输注 | computer-controlled infusion | 按程序调节给药速率的方式 |
| 神经营养反馈系统 | Neurofeedback System | Thought Technology 公司的采集设备 |
| BedMaster | BedMaster | 麻省总医院的监护数据采集系统 |
| 站立位静息 | quiet wakefulness | 清醒但无任务的安静状态 |
| 雷诺现象 | Raynaud’s phenomenon | 肢端血管痉挛,影响皮电质量 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 清醒组人数 | 11 | 官方摘要与 Methods | 官方页面 |
| 清醒组采集人数 | 12 | 官方 Methods | 官方页面 |
| 清醒组年龄 | 22–34 岁 | 官方 Methods | 官方页面 |
| 清醒组时长 | 约 1 小时 | 官方摘要与方法 | 官方页面 |
| 清醒组采样率 | 256 Hz | 官方摘要与方法 | 官方页面 |
| 镇静组人数 | 11 | 官方摘要与 Methods | 官方页面 |
| 镇静组时长 | 约 3–4 小时 | 官方摘要与方法 | 官方页面 |
| 镇静组采样率 | 500 Hz | 官方摘要与方法 | 官方页面 |
| 两组总人数 | 22 | 官方数据描述 | 官方页面 |
| 文件命名 | pulse_times_##.csv / pulse_amps_##.csv | 官方 Format 段 | 官方页面 |
| 时刻单位 | 秒 | 官方 Format 段 | 官方页面 |
| 许可 | PhysioNet Contributor Review 1.5.0 | 官方 Access 区 | 官方页面 |
| 首次发布 | 2021-06-30 | 官方页眉 | 官方页面 |
| 排除受试者原因 | 雷诺现象 | 官方 Methods | 官方页面 |
| 总字节数 | 官方未公布 | — | 未核实 |
| 各组事件条数 | 官方未公布 | — | 未核实 |
附录 B:数字的来源分层
官方页面一级。 人数、年龄范围、记录时长、采样率、设备名、电极位置、排除理由、文件命名、时刻单位、许可名称、发布日期、父项目关系。这一层可以直接引用,出错责任在官方表述与转写之间。
论文摘要二级。 清醒组间隔分布符合逆高斯的结论、两组队列与器械差异下脉选择稳健的结论。这一层只用于理解方法的可信度,不用于陈述数据规模。
未核实三级。 文件编号起止、时间零点、幅度单位、各受试者事件条数、总体积、镇静组年龄、麻醉科文献中的具体给药程序。这一层在本页一律标注为未公布或未核实,不做推算。
附录 C:完整参考文献
- Subramanian S, Purdon P, Barbieri R, Brown E. Pulse Amplitudes from electrodermal activity collected from healthy volunteer subjects at rest and under controlled sedation (version 1.0). PhysioNet. 2021. doi:10.13026/r9p1-bk90.
- Boucsein W. Electrodermal Activity. Springer, 2012.
- Subramanian S, Barbieri R, Brown EN. Point process temporal structure characterizes electrodermal activity. PNAS, 2020. doi:10.1073/pnas.2004403117.
- Subramanian S, Purdon PL, Barbieri R, Brown EN. A Model-Based Framework for Assessing the Physiologic Structure of Electrodermal Activity. IEEE Trans Biomed Eng, 2021. doi:10.1109/TBME.2021.3071366.
- Subramanian S, Purdon PL, Barbieri R, Brown EN. Elementary Integrate-and-Fire Process Underlies Pulse Amplitudes in Electrodermal Activity. bioRxiv, 2020. doi:10.1101/2021.01.06.425499.
- Purdon PL, et al. Electroencephalogram Signatures of Loss and Recovery of Consciousness from Propofol. PNAS, 2013.
- Subramanian S, Barbieri R, Brown E. Electrodermal Activity of Healthy Volunteers while Awake and at Rest (version 1.0). PhysioNet, 2020. doi:10.13026/arty-2540.
- Subramanian S, Purdon PL, Barbieri R, Brown EN. Quantitative assessment of the relationship between behavioral and autonomic dynamics during propofol-induced unconsciousness. PLoS ONE, 2021. doi:10.1371/journal.pone.0254053.
附录 D:任务代码
下面这段代码把 §9.2 的流程批量化,输出一张按受试者排列的汇总表,可用于论文的描述性统计附录。
#-- 批量汇总:两组各自跑一遍描述统计并输出 CSV
import csv
import pathlib
import numpy as np
def group_table(root, group, nominal_seconds):
rows = []
d = pathlib.Path(root) / group
for t_path in sorted(d.glob("pulse_times_*.csv")):
idx = t_path.stem.split("_")[-1]
a_path = t_path.with_name(f"pulse_amps_{idx}.csv")
t = np.loadtxt(t_path, delimiter=",", ndmin=1)
a = np.loadtxt(a_path, delimiter=",", ndmin=1)
iq = np.diff(t)
rows.append({
"group": group,
"subject": idx,
"n_pulses": int(t.size),
"rate_per_min": round(t.size / (nominal_seconds / 60.0), 3),
"iqi_median_s": round(float(np.median(iq)), 3) if iq.size else "",
"amp_median": round(float(np.median(a)), 6) if a.size else "",
})
return rows
if __name__ == "__main__":
rows = []
rows += group_table("./eda-rest-sedation", "At-Rest", 3600)
rows += group_table("./eda-rest-sedation", "Propofol-Sedation", 3.5 * 3600)
with open("eda_summary.csv", "w", newline="") as f:
w = csv.DictWriter(f, fieldnames=list(rows[0].keys()))
w.writeheader()
w.writerows(rows)
print("rows", len(rows))
镇静组的标称时长在这里取三点五小时,是一个折中值;官方写的是约三到四小时。若要写进论文,应把这一取值作为方法段的一个明示参数,并做一次三点零与四点零的敏感性检查。
附录 E:如果只记五件事
第一,它是事件表而不是波形库。 每个受试者两个单列 CSV,时刻以秒为单位,幅度单位未公布。
第二,两组是不同的人。 11 名清醒静坐、11 名丙泊酚镇静,器械、部位、采样率、时长全不同,不是前后对照。
第三,它能做什么。 复现点过程统计、检验间隔分布形状、给脉检测算法做对齐基准。
第四,它不能做什么。 训练深度模型、做情绪识别、做器械无关的跨组比较、还原刺激响应。
第五,它为什么还在被引用。 因为它把最费力的脉选择冻结了下来,成了方法社区里一个不需要重做的参照点。
编辑说明
本页核验于 2026 年 10 月 28 日。项目页正文可直接取得;文件目录与文件接口在本次访问中返回 403 或地区限制提示,故文件命名、单位、零点等描述均转述官方正文,未逐文件核对。论文信息仅取自 Europe PMC 摘要。库内检索确认不存在与本库同名的既有记录;相近的记录按 §6.1 的表格逐一区隔。凡官方未公布的数字,本页一律标注未公布,未作推算或填补。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- dreamt — 共享标签:生理信号 / 可穿戴传感 / 评测基准
- hf-lung-v1 — 共享标签:生理信号 / 可穿戴传感 / 评测基准
- kinecal — 共享标签:生理信号 / 可穿戴传感 / 评测基准
- accelerometry-walk-climb-drive — 共享标签:生理信号 / 可穿戴传感 / 评测基准
- consumer-grade-wearables — 共享标签:生理信号 / 可穿戴传感 / 评测基准
- ecgiddb — 共享标签:生理信号 / 可穿戴传感 / 评测基准
- macecgdb — 共享标签:生理信号 / 可穿戴传感 / 评测基准
- videopulse — 共享标签:生理信号 / 可穿戴传感 / 评测基准
- unicaprop — 共享标签:生理信号 / 可穿戴传感
- grabmyo — 共享标签:生理信号 / 可穿戴传感 / 评测基准
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

