信息速览
PhysioZoo 在 PhysioNet 上的正式名称是 PhysioZoo - mammalian NSR databases,一句话概括:三个物种、四十五段清醒动物的正常窦性心律心电,每段配一份人工校正过的 R 峰位置。它不是一个临床队列,也不是一套算法,而是一份给跨物种心率变异性研究用的「干净底本」——所有记录都经过同一套标注流程,因而可以互相比较。
它与同名软件的关系需要先说清楚。physiozoo.com 上的 PhysioZoo 是一款开源 HRV 分析软件,本页讨论的是 PhysioNet 收录的那份数据;两者共享文件格式与术语,但分别署名、分别引用,许可证也各自独立。把二者混为一谈,是初次接触时最常见的错位。
数据规模不大:四十五段记录合计约八个半小时,按物种分成狗、兔、小鼠三组,采样率分别为 500 Hz 与 1000 Hz 两档。它的价值不在体量,而在于「同一把尺子量三种心跳」——这在公开数据里极为稀缺。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 正式名称 | PhysioZoo - mammalian NSR databases |
| 版本与日期 | 1.0.0,2019 年 8 月 27 日发布 |
| 提交者 | Ori Shemla、Joachim Behar |
| 托管平台 | PhysioNet(RRID:SCR_007345) |
| DOI | 10.13026/p63q-hq95 |
| 物种 | 狗、兔、小鼠(无人类) |
| 记录数 | 45 条(狗 17、兔 20、小鼠 8) |
| 动物数 | 29 只(狗 17、兔 4、小鼠 8) |
| 总时长 | 约 8.5 小时(狗 1:33:55、兔 3:31:13、小鼠 3:28:07) |
| 采样率 | 狗 500 Hz;兔与小鼠 1000 Hz |
| 导联 | 单导联 |
| 标注 | R 峰位置(人工校正)、信号质量(官方文字描述) |
| 格式 | WFDB / 纯文本 / MATLAB 三套并存 |
| 目录组织 | 按格式分三顶层,格式内按物种分三子目录 |
| 许可 | ODC-BY 1.0 |
| 体积 | 未压缩约 401.3 MB,ZIP 约 117.3 MB |
| 配套论文 | Behar 等,Frontiers in Physiology,2018 |
§1 它要解决的具体麻烦
1.1 跨物种比较缺的不是数据,是同一把尺子
比较生理学里有一个长期存在的尴尬:想比较人和狗的心率变异性,手上却没有可比的两组数据。人类有 MIT-BIH、有 NSRDB、有各类 Holter 库,动物数据则散落在各实验室自己的硬盘里,采样率不同、标注规范不同、连「什么算一次心搏」都可能不同。研究者能做的往往是各自算一套指标,然后心照不宣地把数字放在同一张表里。
PhysioZoo 想解决的就是这一层。它把三种体型相差两个数量级的哺乳动物放在同一套采集与标注流程下:同一套 R 峰检测加人工校正、同一套头文件字段、同一种目录结构、同一种注释器命名。结果是你拿到的不只是「三段心电」,而是「三段可以用同一行代码读进来、用同一套指标算出来」的心电。
这件事的意义在频段上最明显。心率变异的功率谱要靠频段划分来解释,而人、狗、鼠的静息心率从每分钟六七十次一路走到五六百次,固定的人类频段(LF 0.04–0.15 Hz、HF 0.15–0.4 Hz)套到小鼠身上几乎全错位。这套数据的配套论文正是围绕「用一条标度关系把频段按物种体重和心率换算」展开的,数据本身则是那条关系的实证材料。
1.2 三条常见的错误期待
拿到这份数据的人,脑子里通常已经有一个预设。以下三种预设都会让人在半小时内发现「不对劲」,而问题不在数据,在预设。
| 常见预设 | 实际情况 | 后果 |
|---|---|---|
| 「这是个 HRV 数据集,可以直接训人类 HRV 模型」 | 无一例人类记录,全部为动物 | 模型跨物种迁移,指标尺度全错 |
| 「四十五段,够做深度学习」 | 合计八个半小时,个体仅二十九只 | 训练集过小,只能做验证或预训练 |
| 「有正常也有异常,可以做二分类」 | 全部为正常窦性心律,无病理组 | 没有任何阴性/阳性标签可用 |
第一条最要命。PhysioZoo 的指标体系和人类 HRV 完全同构——同样的 SDNN、RMSSD、LF/HF——数字看起来可以直接比,但生理基础不同。小鼠静息心率可达每分钟五六百次,同一段十分钟记录里心搏数是人的近十倍,SDNN 的绝对值天然更大。把小鼠的 SDNN 当成人类量级去解读,是这类数据最典型的误用。
第二条关乎实验设计。二十九只动物、四十五段记录,放在深度学习的语境里是「极小样本」。它适合做的是:算法正确性验证、跨物种基线校准、预训练语料的补充、频谱方法的对照实验。不适合做的是:端到端大模型训练、人群级别的统计推断。
第三条关乎任务定义。库内没有房颤、没有心衰、没有起搏,也就没有任何可供二分类的标签。若任务是心律失常检测,这份数据只能充当「正常类」的补充,且物种不匹配。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 一条能跑的 R 峰参考标注 | 每段一条人工校正的峰位序列 | 够,且质量高于多数自动标注 |
| 跨物种心率与 HRV 基线 | 三物种、同一流程下的测量 | 够做基线,不够做人群分布 |
| 人类 HRV 正常值参考 | 无人类记录 | 不够,须换 NSRDB 一类库 |
| 心律失常检测训练 | 全部正常窦性心律 | 不够,无阳性样本 |
| 长时程(24 小时)节律分析 | 最长约四十分钟 | 不够,昼夜节律无从谈起 |
| 多导联形态学分析 | 单导联 | 不够,无导联间关系 |
| 心跳检测算法的鲁棒性测试 | 三种心率量级、不同信噪比 | 够,且比单一物种更有区分度 |
| 频段划分方法的验证 | 三物种的 RR 序列 | 够,这正是它的设计目的 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 刚写完一个 R 峰检测器,想找带金标准的数据验收 | 四十五段人工校正的峰位可直接当参考 | 先按物种分组算灵敏度,再看低心率段是否漏检 |
| 做跨物种 HRV,苦于找不到同流程的三物种数据 | 采集与标注流程统一,可直接横向比 | 先做重采样统一到 1000 Hz,再算频域指标 |
| 想在小鼠上验证某个频段换算公式 | 八段小鼠记录,采样率足够 | 用对应论文的标度关系做对照,别用人类频段 |
| 手上有兽医心电数据,缺正常对照 | 狗 17 段可作正常参考 | 注意品种、体重未记录,只能做量级对照 |
| 想教学生「心率变异性是什么」 | 三种心率并排,直观 | 用小鼠段做演示,心率差异一眼可见 |
| 要训练心律失常分类模型 | 只能提供正常类 | 正常类从这里取,异常类另找 MIT-BIH 系列 |
| 需要一个可商用、许可干净的小型心电集 | ODC-BY 1.0,署名即可商用 | 保留 LICENSE.txt 与引用信息 |
1.5 一句话判断
这是一份为「跨物种可比」而生的底本,不是为「规模」而生的训练集;它的正确用法是当尺子,不是当砖头。
1.6 不适合谁:四条边界
不适合做人类 HRV 研究的人。 库里没有一例人类记录。任何声称「在 PhysioZoo 上验证了人类 HRV 指标」的说法,验的其实是动物指标的可计算性,不是人类生理。
不适合做病理分类的人。 全部记录为正常窦性心律。没有房颤、没有早搏标注、没有心衰分级。想要阴性样本可以来取,想要阳性样本必须去别处。
不适合做长时程分析的人。 最长的一段约四十分钟,多数在五到三十分钟之间。昼夜节律、睡眠分期、体位变化带来的自主神经波动,这份数据一概没有。
不适合把记录数当样本数的人。 兔的二十条记录只来自四只动物。按记录做交叉验证会把同一只兔的不同片段分到训练集和测试集,指标虚高。正确做法是按动物分组划分。
§2 数据构成与规格
2.1 三个物种、三种格式、四十五个记录名
整套数据的第一层不是物种,而是格式。顶层只有三个文件夹:wfdb_format、text_format、matlab_format。每个文件夹内部才是物种:dog、mouse、rabbit。物种内部再按记录建目录,记录目录内放该记录的全部文件。
这个「格式优先」的组织方式有明确的取舍。好处是三套格式各自完整,随便挑一套下载即可自洽;坏处是按物种浏览时要先进格式目录,且三套格式的文件名不完全一致——这一点在写脚本时最容易踩。
三种格式的记录数完全一致,都是四十五段。同一段信号在三处各存一份,换算成物理量之后应当逐点相同,差别只在容器。
| 层级 | 内容 | 数量 |
|---|---|---|
| 第一层 | 格式目录 | 3 个 |
| 第二层 | 物种目录 | 每个格式下 3 个 |
| 第三层 | 记录目录 | 每个格式下 45 个 |
| 第四层 | 记录文件 | WFDB 3 个 / 文本 2 个 / MATLAB 2 个 |
2.2 字段与记录的完整字典
WFDB 头文件是本数据集信息密度最高的地方。以狗的第一条记录为例,头文件只有三行有效内容,却把采样率、样本数、增益、基线、通道语义全部交代了。
| 字段 / 位置 | 含义 | 取值示例 | 是否每记录都有 |
|---|---|---|---|
| 第一行第 1 段 | 记录名 | Dog_01 | 是 |
| 第一行第 2 段 | 通道数 | 1 | 是 |
| 第一行第 3 段 | 采样率 Hz | 500 或 1000 | 是 |
| 第一行第 4 段 | 样本总数 | 134258 | 是 |
| 第二行第 1 段 | 数据文件名 | Dog_01.dat | 是 |
| 第二行第 2 段 | 存储格式码 | 16 | 是 |
| 第二行第 3 段 | 增益与基线 | 51300.0027(-1159)/mV | 是 |
| 第二行第 4 段 | ADC 分辨率 | 0(未标注) | 是 |
| 第二行第 5 段 | ADC 零点 | 0 | 是 |
| 第二行第 6 段 | 首样本值 | -1487 | 是 |
| 第二行第 7 段 | 校验和 | 25886 | 是 |
| 第二行第 8 段 | 块大小 | 0 | 是 |
| 第二行第 9 段 | 通道描述 | Data (electrography) | 是 |
| 第三行 | 物种与整合层级注释 | #Mammal:dog,Integration_level:electrocardiogram | 是 |
| 注释文件 | 参考 R 峰 | .qrs | 是 |
注释器清单只有一个名字,含义写得很直白。
#-- ANNOTATORS 文件全文,仅两列
qrs reference beat
这两列说明:全库只有一种标注类型,即「参考心搏」。没有节律类型标注、没有起搏标注、没有噪声标注的独立注释流。想区分正常与异常心搏,这份数据给不了。
文本格式的头信息换了一种写法,更像配置清单而不是定长记录。
#-- peaks_Dog_01.txt 的开头若干行(结构示意,非逐字符转录)
Mammal: dog
Fs: 500
Integration_level: electrocardiogram
Channels:
同一条记录在 MATLAB 格式下文件名是 elctrography_Dog_01.mat——注意这里的拼写与文本格式的 electrography 不同,少了一个 e。这不是笔误的转述,而是包内实际存在的差异,写通配符时两个都要覆盖。
| 格式 | 信号文件命名 | 峰位文件命名 | 单记录文件数 |
|---|---|---|---|
| WFDB | 记录名.hea / .dat | 记录名.qrs | 3 |
| 纯文本 | electrography_记录名.txt | peaks_记录名.txt | 2 |
| MATLAB | elctrography_记录名.mat | peaks_记录名.mat | 2 |
2.3 一条记录的完整解剖
取狗的第一条记录,从目录到字节逐层看一遍。这一段约十三万四千个采样点,按 500 Hz 折算约四分半钟,是全库最短的一档。
#-- 目录结构(以狗的第一条记录为例)
wfdb_format/dog/Dog_01/
├── Dog_01.hea 142 字节,纯文本头信息
├── Dog_01.dat 268516 字节,格式码 16 的二进制波形
└── Dog_01.qrs 25738 字节,参考 R 峰注释
#-- 头文件正文(三行)
Dog_01 1 500 134258
Dog_01.dat 16 51300.0027(-1159)/mV 0 0 -1487 25886 0 Data (electrography)
#Mammal:dog,Integration_level:electrocardiogram
三行信息值得拆开读。第一行的 500 是采样率,134258 是样本数,两者相除得 268.516 秒,即四分二十八秒半,与官方给出的最短时长一致。第二行的 51300.0027(-1159)/mV 是增益与基线:把整数样本除以这个增益、减去基线,才得到毫伏值。这个增益数值带四位小数,显然是从标定结果反算而来,不是整数倍放大。
格式码 16 意味着每样本占两个字节。134258 乘 2 等于 268516,恰好等于 .dat 文件的字节数——这是一个可以立刻做的自检:文件大小对不上,说明下载不完整。第七位的 25886 是校验和,wfdb 库读入时会核对。
.qrs 文件 25738 字节,装的是峰位。按 WFDB 注释的压缩格式,每个注释占两个字节起,实际数量取决于时间差编码。全库十八条狗记录合计约一万零八百余个 R 峰,均摊到每条约六百四十个;这一段虽是最短的一档,峰数仍在这个量级附近,具体条数需读注释文件才知道,官方未逐条列出。这个量级在 §4.4 的案例里还会再用到。
2.4 规模表:三个物种的对照
三个物种的规模差异极大,且差异的方向不止一个。狗的记录多但短,兔的记录少但长,小鼠的记录最长也最少。
| 项目 | 狗 | 兔 | 小鼠 |
|---|---|---|---|
| 记录数 | 17 | 20 | 8 |
| 动物数 | 17 | 4 | 8 |
| 每只动物记录数 | 1 | 5 左右(3 至 7 段不等) | 1 |
| 采样率 | 500 Hz | 1000 Hz | 1000 Hz |
| 平均时长 | 5 分 31 秒 | 10 分 34 秒 | 29 分 44 秒 |
| 最短时长 | 4 分 09 秒 | 4 分 53 秒 | 13 分 53 秒 |
| 最长时长 | 6 分 48 秒 | 26 分 00 秒 | 39 分 38 秒 |
| 合计时长 | 1 小时 33 分 55 秒 | 3 小时 31 分 13 秒 | 3 小时 28 分 07 秒 |
| R 峰标注总数 | 10,871 | 50,452 | 109,865 |
| 低质量段占比 | 2.7% | 1.0% | 0.4% |
| 总字节量占比 | 最小 | 中 | 最大 |
一个反直觉的地方:狗的记录数最多,但总时长最短、标注数最少。原因在心率和时长两头——狗的心率接近人类量级,单段又只有五分钟上下,因此每条记录的心搏数只有六百多个;小鼠单段近半小时、心率又快,于是八条记录贡献了全库过半的标注。
这也意味着按「记录数」做配平是错的。三个物种的有效样本量应当按心搏数或总时长衡量,狗的记录数与它的信息量严重不成比例。
2.5 与同类资源的字段差异
| 维度 | PhysioZoo | NSRDB(人类) | CHF2DB | MIT-BIH 房颤库 |
|---|---|---|---|---|
| 对象 | 狗 / 兔 / 鼠 | 人类 | 人类 | 人类 |
| 记录数 | 45 | 18 | 29 | 25 |
| 单位时长 | 4 分至 40 分 | 21 至 24 小时 | 近 24 小时 | 10 小时 |
| 原始波形 | 有 | 有 | 无(仅 RR) | 有 |
| 采样率 | 500 / 1000 Hz | 128 Hz | 128 Hz | 250 Hz |
| 导联数 | 1 | 2 | 0 | 2 |
| R 峰标注 | 有 | 有 | 无(RR 即数据) | 有 |
| 节律标注 | 无 | 有 | 无 | 有 |
| 病理分组 | 无 | 无 | 心衰 | 房颤 |
| 多物种 | 是 | 否 | 否 | 否 |
表格右侧三列是人类库,左列是动物库。真正的差别不在行数,而在「有没有节律语义」:人类库会告诉你这一拍是正常、是房颤、是早搏;PhysioZoo 只告诉你这一拍在哪里。它把「这一拍是什么」的判断留给了使用者,这与它的定位一致——它是给算法做参照的,不是给诊断做训练的。
2.6 三种格式的体积账
同一批信号存三份,代价是体积。整包未压缩约四百兆,其中真正不可替代的只有一份——另外两份是同一信号的重新编码。理解这笔账,能帮你在带宽有限时只取一份。
| 格式 | 单条记录典型体积 | 编码方式 | 冗余度 |
|---|---|---|---|
| WFDB | 约 270 KB(狗第一条) | 二进制,两字节一样本 | 低 |
| 纯文本 | 约 1.4 MB(同一条) | ASCII 十进制文本 | 高,约为 WFDB 的六倍 |
| MATLAB | 约 535 KB(同一条) | 压缩容器 | 中,介于两者之间 |
| 峰位(WFDB) | 约 26 KB | 差分编码 | 低 |
| 峰位(文本) | 约 4 KB | 每行一个整数 | 低 |
文本格式的体积膨胀来自十进制表示:一个整数在二进制里占两字节,写成文本平均要六到七个字符。这也是为什么只想要波形时不该下文本包——同样的信息量,多付五倍带宽。
MATLAB 的 .mat 是压缩容器,体积介于两者之间,但它把信号与元信息打包在一起,读取时依赖具体字段名。若只做数值分析,WFDB 仍是最省事的一档。
2.7 元数据的天花板
本库的元数据只有四层:记录名、物种、采样率、整合层级。除此之外的一切——体重、年龄、品种、性别、麻醉状态、电极位置的具体坐标——都没有以字段形式出现。
| 元数据项 | 是否提供 | 缺失的后果 |
|---|---|---|
| 物种 | 是 | 无 |
| 采样率 | 是 | 无 |
| 整合层级 | 是 | 无 |
| 记录时长 | 可由样本数推算 | 无 |
| 体重 | 否 | 标度关系只能用物种均值代入 |
| 年龄 | 否 | 无法分析年龄效应 |
| 性别 | 否 | 无法做性别分层 |
| 品种 | 否(狗) | 无法区分品种间心率差异 |
| 电极位置 | 仅文字描述 | 无法做导联层面的复核 |
| 麻醉/给药 | 仅一句「未给药」 | 无剂量与时间信息 |
这张表是判断「能不能做」的最快入口。凡是要按个体属性分层的分析,本库都做不了;凡是只按物种分层的分析,本库都够用。
§3 核心层 A:它的身份是一份「参考实现数据」
3.1 数据集与软件的分工
PhysioZoo 这个名字在公开语境里至少指两样东西。一样是 physiozoo.com 上的开源 HRV 分析软件,带图形界面,能做 RR 序列校正、时域频域指标计算、非线性指标计算;另一样是 PhysioNet 上这份数据。二者是配套关系,不是同一件作品。
区分它们有实际后果。软件有版本迭代、有更新日志、有功能增删;数据从 2019 年 8 月发布至今只有一个 1.0.0 版,未再变动。软件用 GPL 一类的代码许可证,数据用 ODC-BY 1.0。引用时要分别引:数据引 DOI,软件引它的仓库或论文。
| 维度 | 数据集 | 软件 |
|---|---|---|
| 正式名 | PhysioZoo - mammalian NSR databases | PhysioZoo |
| 载体 | PhysioNet | physiozoo.com |
| 版本 | 1.0.0(2019-08-27) | 持续迭代 |
| 许可 | ODC-BY 1.0 | 代码类开源许可 |
| 引用方式 | DOI 10.13026/p63q-hq95 | 软件仓库与论文 |
| 本页范围 | 是 | 否 |
这个分工解释了数据为何这样组织。三种格式并存,本质上是为了让不同工具链都能直接吃进去:WFDB 给 PhysioNet 生态,纯文本给不想装库的人,MATLAB 给 PhysioZoo 软件本身。
3.2 命名里的 NSR 指什么
NSR 是 normal sinus rhythm,正常窦性心律。这个标签在本库里是「采集时未发现心律失常」,而不是「经过临床判读确认健康」。差别在于:动物没有病史、没有随访、没有超声心动图,所谓正常只是「这段心电上看不出异常节律」。
对使用者而言,这意味着两件事。第一,不能把 NSR 当成「健康对照」的严格同义词;第二,跨物种比较时,NSR 是唯一共同的分母,反倒是它的优点——三类动物都在同一个节律前提下被记录,比较才有意义。
3.3 版本与身份信息
| 项 | 值 |
|---|---|
| 版本号 | 1.0.0 |
| 发布日期 | 2019-08-27 |
| 文件时间戳跨度 | 2019-04-27 至 2019-08-27 |
| DOI | 10.13026/p63q-hq95 |
| RRID | SCR_007345(平台级) |
| 记录清单文件 | RECORDS,1.8 KB |
| 校验和文件 | SHA256SUMS.txt,43.8 KB |
| 文件路径说明 | filenames_and_folders.txt,12.9 KB |
| 许可证全文 | LICENSE.txt,19.9 KB |
注意时间戳:数据文件多落在 2019 年 4 月底,注释文件落在 6 月中,许可证与发布落在 8 月底。这条时间线说明标注工作是在信号入库之后补做的,中间隔了约两个月。对使用者没有直接影响,但能解释为什么 .qrs 的时间戳与 .dat 不同。
3.4 与其他哺乳动物心电资源的区别
公开的动物心电数据并不少,但多数学术数据集有两个共同问题:一是单一物种,二是标注口径各自为政。PhysioZoo 的稀缺性正在于它同时解决了两件事——三个物种、一套口径。
另一个区别是「整合层级」字段。头文件里的 Integration_level 取值为 electrocardiogram,这个词在电生理里指体表或皮下记录到的整体心电,与 electrogram(心内或心肌局部电位)、action potential(单细胞动作电位)相对。这个字段的存在说明数据模型是按「可扩展到其他层级」设计的,虽然当前版本只填了心电一级。
| 资源类型 | 例子 | 与本库的关系 |
|---|---|---|
| 单物种动物心电 | 各实验室自建狗/鼠心电库 | 本库可与它们做跨库校验 |
| 多物种但异口径 | 多中心拼合的生理库 | 本库的优势是口径统一 |
| 人类正常心律 | NSRDB | 可作跨物种对照的另一端 |
| 人类病理心律 | MIT-BIH 房颤库、CHF2DB | 提供本库缺失的阳性样本 |
3.5 为什么单导联反而是合理选择
看到「单导联」三个字,多数人的第一反应是「信息不足」。放在临床语境里这个判断成立:十二导联才能看缺血定位、看电轴、看束支阻滞。但本库的任务不是诊断,而是定位心搏与量化节律,这两件事一个导联就够。
| 任务 | 单导联够不够 | 原因 |
|---|---|---|
| R 峰定位 | 够 | R 峰在任一导联都是振幅最高的点之一 |
| RR 间期与 HRV | 够 | 只需时间信息,不需要空间信息 |
| 心率趋势 | 够 | 同上 |
| 心律失常分类 | 部分够 | 房颤靠 RR 不规则即可识别,室性需形态 |
| 缺血定位 | 不够 | 需要多导联的空间关系 |
| 电轴与传导阻滞 | 不够 | 需要至少两导联的向量投影 |
| 形态学深度学习 | 勉强 | 单一视角,泛化受限 |
另一个现实理由是动物实验的可行性。在清醒、自由活动的狗身上贴十二个电极不现实,在小鼠身上更不可能——小鼠用的是植入式遥测,一个通道已经是很大的手术负担。单导联不是妥协的产物,而是这类实验的天花板。
这也解释了为什么全库的心电通道都叫 Data,而不是 Lead I 或 ECG1 之类带解剖含义的名字。官方没有声称它对应哪个体位,因此也不能被当成标准导联来用。
3.6 它与「基准数据集」的区别
本库常被称作 benchmark,但它缺了基准数据集的两个要件:固定的划分与公开的评测指标。
| 要件 | 本库 | 典型基准数据集 |
|---|---|---|
| 固定训练/测试划分 | 无 | 有 |
| 官方评测脚本 | 无 | 有 |
| 排行榜 | 无 | 有 |
| 参考实现 | 有(配套软件) | 常有 |
| 统一指标定义 | 部分(频段需自行换算) | 有 |
因此更准确的称呼是「参照集」:它提供可复现的输入与金标准,但不规定你怎么评分。好处是用法自由,坏处是不同论文之间的数字不可直接比较——这一点在阅读引用它的文献时要留意。
§4 核心层 B:标注质量与结构特色
4.1 标注是怎么来的
全库的标注流程可以概括成三步:算法初检、人工校正、质量分级。官方说明写得很具体——R 峰先由峰值检测算法定位,再由单一受训标注员逐条核对,修正漏检与误检。单一标注员这件事有利有弊:好处是口径一致,不会出现两个标注员对同一拍的判断分歧;坏处是没有标注员间一致性数据,无法量化标注不确定性。
第三步是质量分级。规则是:连续三个或更多心搏无法用肉眼辨认 R 峰时,这一段被标为低质量,并把其中的注释移除。这解释了一个容易困惑的现象——为什么某段信号里有一截没有峰位标注。那不是标注遗漏,而是刻意剔除。
| 环节 | 做法 | 对使用者的影响 |
|---|---|---|
| 初检 | 峰值检测算法 | 可能漏掉低幅或形态异常的心搏 |
| 校正 | 单一受训标注员逐条核对 | 口径统一,但无一致性系数 |
| 剔除 | 连续三拍以上不可辨认则移除注释 | RR 序列会出现真实缺口 |
| 分级 | 标为低质量 | 官方给出各物种低质量占比 |
三个物种的低质量占比分别是狗 2.7%、兔 1.0%、小鼠 0.4%。这个梯度与信号获取方式吻合:狗用体表电极加胶带固定,最易受活动干扰;兔用皮下电极,居中;小鼠用植入式遥测,最稳。
4.2 分段:记录数不等于个体数
兔的二十条记录是本库最容易被误读的结构。它们不来自二十只兔,而来自四只——每只动物的长时程记录被切成若干段,命名为 Rabbit_01_part_1 到 Rabbit_01_part_5、Rabbit_03_part_1 到 Rabbit_03_part_7 这样。
| 动物 | 分段数 | 记录名形态 |
|---|---|---|
| 兔 1 号 | 5 | Rabbit_01_part_1 至 part_5 |
| 兔 2 号 | 5 | Rabbit_02_part_1 至 part_5 |
| 兔 3 号 | 7 | Rabbit_03_part_1 至 part_7 |
| 兔 4 号 | 3 | Rabbit_04_part_1 至 part_3 |
这一结构直接决定划分策略。若按记录做随机划分,同一只兔的不同片段会同时出现在训练与测试两侧,模型只需记住这只兔的波形特征就能「泛化」,指标虚高。正确做法是按记录名前缀聚合到动物级,再做分组划分。
狗与小鼠没有这个问题:十七只狗各一条,八只鼠各一条,记录与个体一一对应。
4.3 信号质量标注的两种口径
官方文字描述说每条记录包含信号质量标注。但在逐条的文件目录里,WFDB 包只有三个文件:头文件、数据文件、峰位注释文件。没有独立的信号质量文件,注释器清单里也只有 qrs 一项。
于是出现了两个口径。口径 A:官方说明称提供信号质量标注,并在方法部分描述了「连续三拍不可辨认即标低质量并移除」的规则。口径 B:实际可下载的文件清单中,只有低质量段占比这一个汇总性数字,逐拍的的质量标签没有以独立文件出现。差额的构成,官方未作说明。
| 口径 | 内容 | 可得性 |
|---|---|---|
| A(官方文字) | 每条记录含信号质量标注 | 需阅读说明 |
| B(文件清单) | 只有头/数据/峰位三类文件 | 直接可下载 |
| 汇总指标 | 各物种低质量占比 | 官方页面给出 |
实践上的处理办法很简单:把「某段内没有峰位」当作低质量的代理信号。这不如逐拍标签精确,但对多数任务够用——反正你要的也只是「这段能不能用」。
4.4 案例:狗 Dog_01 的四分半钟
拿全库最短的一段走一遍完整流程,能看清这套数据的全部关节。这一段是 Dog_01,五百赫兹采样,十三万四千余个样本,四分二十八秒半,六百多个 R 峰。
先看时间轴。134258 除以 500 等于 268.516 秒。若按人类静息心率每分钟七十次估算,四分半钟应有约三百一十五次心搏;实际标注数是六百三十九,对应心率约每分钟一百四十三次。这是狗的正常静息心率区间,也解释了为什么同样时长的记录,狗的心搏数比人类多一倍。
再看数值范围。头文件给出增益五万一千三百余(ADC 单位每毫伏)与基线负一千一百五十九。这意味着原始整数样本除以增益、再减基线,才能还原成毫伏。若跳过这一步直接把整数当微伏用,波幅会差三个数量级。
最后看结构。这一段只有一条记录、一个文件、一份注释,不存在分段问题;但兔的段落就不是这样。§4.2 讲的分段结构,在狗身上完全不出现,在小鼠身上也不出现——只有兔需要按前缀还原个体。
这一段还说明了一件事:短记录不等于低价值。四分半钟、六百多拍,足以验证一个 R 峰检测器的灵敏度与正检率;也足以算出一段 RR 序列的时域指标。它不够的是频域分析——四分半钟对 LF 频段(周期最长二十五秒)只能容纳十来个完整周期,谱估计的方差会很大。这一点在 §4.4 的案例里属于边界条件,不是缺陷。
4.5 特色:一条能跨物种换算的频段
这套数据的设计初衷写在配套论文的标题里:为哺乳动物心率变异性分析定义一个通用的功率谱频段标度关系。翻译成大白话:不同体型的动物心跳快慢差很多,频谱的频段不能都用人类那一套,得按体重或心率换算。
PhysioZoo 数据在这条关系里扮演实证材料。三个物种、心率跨度从每分钟七十次到六百次,刚好覆盖标度关系的两端。研究者可以用同一套算法在三个物种上算谱,再看按公式换算后的频段是否对齐——这是单一物种数据做不到的实验。
| 物种 | 静息心率量级(次/分) | 与人类频段的错位程度 |
|---|---|---|
| 狗 | 一百上下 | 轻,频段可近似沿用 |
| 兔 | 两百上下 | 中,HF 上界需上移 |
| 小鼠 | 五百上下 | 重,人类频段基本失效 |
这也是它区别于普通动物心电库的地方:那些库给的是「波形」,这份数据给的是「波形加一个可比较的尺度」。
4.6 峰位的时间基准
峰位文件里存的是整数,但整数代表什么,决定了后续所有计算是否正确。本库的注释以样本序号为坐标,不是毫秒、不是秒。换算只有一条公式:样本序号除以采样率,得到秒。
| 物种 | 采样率 | 一个样本的时长 | 一个心搏约含样本数 |
|---|---|---|---|
| 狗 | 500 Hz | 2 毫秒 | 三百至四百之间 |
| 兔 | 1000 Hz | 1 毫秒 | 一百五十至三百 |
| 小鼠 | 1000 Hz | 1 毫秒 | 六十至一百二十 |
这个换算在跨物种时最容易被忽略。同样是「RR 等于 200」,在狗身上是 0.4 秒、心率每分钟一百五十次;在小鼠身上是 0.2 秒、心率每分钟三百次。若脚本里忘了除采样率,两个物种的 RR 会落在同一数值区间,看上去「可比」,其实差一倍。
另一个细节是舍入。峰位只能落在整数样本上,真实峰值落在两个样本之间时,误差最大半个样本周期。对狗是 1 毫秒,对兔鼠是 0.5 毫秒——相对于数百毫秒的 RR,这点误差可以忽略,但在计算高频成分(如 RMSSD)时会引入微小噪声,跨物种比较 RMSSD 时尤需注意。
4.7 分段的接缝
兔的记录被切成多段,接缝处的处理没有官方说明。可能的做法有两种:段与段之间不重叠,或留少量重叠以保证边界的完整心搏。无论哪种,跨段拼接都会遇到两个问题。
| 问题 | 表现 | 处理建议 |
|---|---|---|
| 接缝处 RR 异常 | 拼接后首个 RR 可能偏大或偏小 | 丢弃每段首尾各一拍 |
| 段长不等 | 三到七段,各段时长不同 | 按样本数加权,不按段平均 |
| 段内低质量段位置未知 | 只能看峰位缺口 | 用间隔阈值筛除 |
务实的做法是:拼接前先丢弃每段的第一拍与最后一拍,再从剩余序列算指标。这会损失少量数据,但能避免接缝引入的伪影污染统计量。对只有四只兔的样本量而言,这点损失可以接受。
§5 核心层 C:怎么把数据取到手
5.1 三条下载路径
官方提供三种取数方式,按数据量选择即可。整包适合一次拿全,逐文件适合只要一两个物种,对象存储适合在云上批量拉。
#-- 路径一:整包下载(约 117.3 MB)
wget https://physionet.org/content/physiozoo/1.0.0/physiozoo-1.0.0.zip
unzip physiozoo-1.0.0.zip -d physiozoo
#-- 路径二:只取 WFDB 目录(推荐,体积最小且够用)
wget -r -N -c -np https://physionet.org/files/physiozoo/1.0.0/wfdb_format/
#-- 路径三:AWS 开放数据镜像,无需凭证
aws s3 sync --no-sign-request \
s3://physionet-open/physiozoo/1.0.0/ ./physiozoo-1.0.0/
第三条路径的桶名是 physionet-open,公开只读,不加 --no-sign-request 会因为找不到凭证而失败。
5.2 目录在哪一层
拿到包之后第一件事是确认层级。格式在最外层,物种在第二层,记录在第三层——与多数 PhysioNet 项目「记录直接铺在根目录」的习惯不同。
#-- 确认目录层级(只列两层,避免长输出)
cd physiozoo-1.0.0
ls
#-- 预期输出:LICENSE.txt RECORDS SHA256SUMS.txt matlab_format text_format wfdb_format
ls wfdb_format
#-- 预期输出:dog mouse rabbit
ls wfdb_format/dog | head -3
#-- 预期输出:Dog_01 Dog_02 Dog_03
RECORDS 文件里写的是相对路径,一行一条,例如 wfdb_format/dog/Dog_01/Dog_01。这意味着可以直接把它当批量处理的输入清单,不用自己拼路径。
5.3 用 wfdb 读一条记录
Python 侧的标准读法是 wfdb 库。它的 rdrecord 会自动按头文件解析增益与基线,返回物理量(毫伏)而不是原始整数。
#-- 读一条记录并核对基本参数
import wfdb
rec = wfdb.rdrecord("physiozoo-1.0.0/wfdb_format/dog/Dog_01/Dog_01")
print(rec.fs) #-- 500
print(rec.sig_len) #-- 134258
print(rec.sig_name) #-- ['Data']
print(rec.units) #-- ['mV']
print(rec.p_signal.shape) #-- (134258, 1),已换算为物理量
ann = wfdb.rdann("physiozoo-1.0.0/wfdb_format/dog/Dog_01/Dog_01", "qrs")
print(len(ann.sample)) #-- 该段的 R 峰个数
print(ann.sample[:5]) #-- 前五个峰位样本号
p_signal 已经做过增益换算,直接拿到毫伏;若要用原始整数,读 d_signal。这一点在做位深一致性检查时有用——不同物种的增益差得很远,混用会让归一化失效。
5.4 不装库也能读文本格式
文本格式的存在意义就是「不装库也能看」。信号文件是纯文本,一行一个采样值,可以直接用 numpy 读。
#-- 读文本格式的信号与峰位
import numpy as np
sig = np.loadtxt("physiozoo-1.0.0/text_format/dog/Dog_01/electrography_Dog_01.txt",
skiprows=1)
peaks = np.loadtxt("physiozoo-1.0.0/text_format/dog/Dog_01/peaks_Dog_01.txt",
skiprows=8)
print(sig.shape, sig[:3])
print(peaks.shape, peaks[:5])
skiprows 的具体数值取决于该文件头部有多少行说明,狗、兔、鼠不完全一致。稳妥做法是先读前二十行看清结构再决定跳过几行,不要写死。
5.5 读 MATLAB 格式
MATLAB 格式给的是 .mat 容器,Python 侧用 scipy 或 h5py 都能打开。注意文件名里的拼写差异——elctrography,少一个 e。
#-- 读 MATLAB 格式(注意文件名拼写为 elctrography)
from scipy.io import loadmat
m = loadmat("physiozoo-1.0.0/matlab_format/dog/Dog_01/elctrography_Dog_01.mat")
print([k for k in m.keys() if not k.startswith("__")])
print(m["Fs"] if "Fs" in m else "字段名需按实际文件确认")
官方说明称 .mat 内含 Fs 字段,取值 500 或 1000。字段名大小写在三种物种间是否完全一致,官方未逐一列出,实际使用前先打印一次键名最稳。
5.6 校验与版本固定
数据一旦进了实验流程,版本就要钉死。官方提供 SHA256 清单,下载后先校验再使用。
#-- 校验完整性(在解压后的根目录执行)
sha256sum -c SHA256SUMS.txt --quiet && echo "全部校验通过"
#-- 只统计记录条数,确认与 RECORDS 一致
wc -l RECORDS
#-- 预期输出:45
第 45 行这个数字值得记一下:记录清单四十五行,与官方公布的记录数一致。若下载中断,wc 会给出更小的数,比逐条比对文件更快发现问题。
5.7 六种常见取数故障
取数环节的坑大多不是因为数据有问题,而是因为路径假设错了。以下六种按出现频率排列。
| 故障 | 症状 | 处置 |
|---|---|---|
| 以为记录在根目录 | ls 看不到 Dog_01 | 先进 wfdb_format 再进 dog |
| 文件名写死不区分格式 | 找不到 electrography 或 elctrography | 用 glob 匹配两种拼写 |
| 把整数当毫伏 | 波幅大三个数量级 | 除以增益、减基线,或用 rdrecord |
| 忘记 RECORDS 是相对路径 | 拼出的路径多余一层 | 直接以 RECORDS 行为路径 |
| 只下 .hea 不下 .dat | 读取报长度不符 | 三条文件必须成套 |
| ZIP 未完整下载 | 校验和失败 | 重下并用 SHA256 复核 |
第二条尤其隐蔽:文本格式叫 electrography,MATLAB 格式叫 elctrography,两个名字在同一个包里同时存在。写脚本时若按其中一个写死前缀,换格式就会静默零命中——不报错,只是什么都读不到。
第四条的价值在于省事。RECORDS 的每一行本身就是可直接使用的相对路径,批量循环时不必再拼「物种目录加记录名」,少一层拼接就少一处出错。
§6 与库内词条的关系
6.1 关系图谱
库内与心率变异相关的词条不少,但绝大多数是人类数据。PhysioZoo 的位置是「跨物种那一极」,与人类库构成对照而非替代。
| 库内词条 | 对象 | 与本词条的关系 |
|---|---|---|
| nsrdb | 人类正常窦性心律 | 同为 NSR,但物种不同;可做跨物种对照的两端 |
| chf2db | 人类心衰 RR 间期 | 只有 RR 无波形;本库有原始波形,可反推 RR |
| afpdb | 人类房颤预测 | 提供本库缺失的阳性样本与长时程 |
| ltafdb | 人类长时程房颤 | 时长量级差两个数量级 |
| mit-bih-afdb | 人类房颤二分类 | 节律标注齐全,本库无节律标注 |
| wctecgdb | 人类体表心电 | 同为体表电极,可对照信噪比 |
| fantasia | 人类与老年人静息心电 | 同为静息态短记录,可比时长结构 |
| cardiac-atlas-project | 人类心脏电生理 | 层级不同,本库只到体表心电 |
排序上的建议是:先看 nsrdb 建立人类基线,再看本词条理解跨物种的可比性问题,最后按任务去 afpdb 或 chf2db 取阳性样本。
6.2 检索路径
库内检索时,本词条会被哪些关键词命中,直接决定了它能否被需要它的人找到。
| 你输入的关键词 | 是否命中本词条 | 说明 |
|---|---|---|
| 心率变异 / HRV | 是 | 核心用途之一 |
| RR 间期 | 是 | 可由峰位直接导出 |
| 哺乳动物 | 是 | 唯一的多物种心电库 |
| 小鼠心电 / 狗心电 | 是 | 物种级检索 |
| 房颤 | 否 | 库内无房颤记录 |
| 十二导联 | 否 | 单导联 |
| 长时程 Holter | 否 | 最长约四十分钟 |
| 心音 / 超声 | 否 | 仅心电 |
6.3 三种组合使用的方案
单用本库的场景很少,多数研究是把它和人类库搭着用。三种搭配各有明确目的。
| 方案 | 组合 | 目的 | 注意 |
|---|---|---|---|
| 尺度校准 | 本库 + nsrdb | 用人类基线校验跨物种换算 | 先统一到同一采样率 |
| 阴性补充 | 本库 + mit-bih-afdb | 给房颤分类器补正常类 | 物种不同,只宜做鲁棒性测试 |
| 方法迁移 | 本库 + 任一 RR 库 | 验证同一套指标实现是否通用 | RR 库无波形,接口不同 |
第一种最稳。用人类的正常窦性心律段作基准,把三个物种的指标按标度关系折算到「相当于人类多少」,再看折算后的分布是否重叠。重叠程度就是这套换算的可信度。
第二种要谨慎。物种不同意味着波形形态、心率量级、噪声结构都不同,把动物正常段当人类阴性样本,模型学到的可能是「这不是人」。合理的做法是只在鲁棒性测试里用,不进主训练集。
第三种最省事也最容易出错。RR 库直接给间期序列,本库给原始波形加峰位,两者的输入接口不同;若把间期序列当波形喂进去,形状对上、语义全错。
6.4 与软件生态的关系
本库的三种格式,对应三种读取生态。理解这张映射,能避免「装了库却读不进去」的折腾。
| 生态 | 读取方式 | 适配格式 | 常见问题 |
|---|---|---|---|
| PhysioNet 生态 | wfdb 库 | WFDB | 需 pip 安装 |
| 通用科学计算 | numpy / pandas | 纯文本 | 需处理头部行 |
| MATLAB 生态 | load 命令 | .mat | 拼写与字段名 |
| PhysioZoo 软件 | 内置加载器 | 三种皆可 | 需匹配版本 |
第四行是本库存在的直接理由:软件要能一键加载,数据就必须提供它认识的格式。这也是为什么三种格式的目录层级完全平行——软件按同一套规则找文件。
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
评分之前先纠正一个容易发生的错位:本库的质量不应按「临床队列」的标准衡量,而应按「算法参照集」的标准衡量。前者看代表性、看随访完整性、看人群覆盖;后者看标注可靠性、看流程一致性、看格式可用性。用前一套标准读它,会得出「样本太少、人群单一、无随访」的结论,这些判断都对,但都不构成缺陷——它本来就没打算做那件事。
另一个容易误判的点是「四十五」这个数字。它看起来像一个小型临床研究,实际上是一个工具配套数据集。规模小是设计选择,不是资源不足。
7.1 五维评分与 DAIMS 就绪度
| 维度 | 分值 | 依据 |
|---|---|---|
| 标注可靠性 | 4.5 / 5 | 人工逐条校正,但单一标注员、无一致性系数 |
| 结构规范性 | 5 / 5 | 三格式齐全、头文件规范、有校验和与清单 |
| 规模充分性 | 2 / 5 | 八个半小时、二十九只动物,只够验证 |
| 覆盖面 | 2.5 / 5 | 三物种是亮点,但无病理、无长时程、无多导联 |
| 可用性 | 5 / 5 | ODC-BY、即下即用、三种格式、有 DOI |
| 合计 | 19 / 25 | 结构与可用性满分,规模与覆盖是短板 |
DAIMS 就绪度按十二项逐条核对,满分二十四分。
| 序号 | DAIMS 检查项 | 状态 | 说明 |
|---|---|---|---|
| 1 | 是否有稳定标识符 | 通过 | DOI 10.13026/p63q-hq95 |
| 2 | 是否有明确许可证 | 通过 | ODC-BY 1.0,附全文 |
| 3 | 是否可匿名访问 | 通过 | 无需注册 |
| 4 | 是否有数据字典 | 部分 | 头文件字段有说明,缺逐字段文档 |
| 5 | 是否有统一命名规则 | 通过 | 物种前缀加两位序号 |
| 6 | 是否有版本号 | 通过 | 1.0.0 |
| 7 | 是否有校验和 | 通过 | SHA256SUMS.txt |
| 8 | 是否有划分建议 | 缺失 | 官方未给训练/测试划分 |
| 9 | 是否有多格式导出 | 通过 | WFDB / 文本 / MATLAB |
| 10 | 是否有标注质量指标 | 部分 | 只有低质量占比,无一致性系数 |
| 11 | 是否有采集元数据 | 部分 | 有物种与采样率,缺体重、年龄、品种 |
| 12 | 是否有血缘与处理记录 | 部分 | 有路径说明,无逐步处理日志 |
合计十六分(通过六项、部分五项、缺失一项),属「可直接接入、需自行补文档」一档。
7.2 分数的读法
十九分与十六分这两个数字,容易被读成「中等偏上」。更准确的读法是:它在「能不能接」这一侧几乎没有损耗,在「够不够用」这一侧损耗明显。也就是说,接入成本接近零,但接进来之后能做的实验有限。
对算法验证类任务是好事——你不需要写解析器、不需要处理缺失值、不需要猜字段含义。对建模类任务是坏事——数据量摆在那里,再干净的流程也变不出样本。
7.3 已知的、可枚举的偏差
| 偏差 | 表现 | 影响 |
|---|---|---|
| 物种偏差 | 只有狗、兔、鼠 | 无法外推到其他哺乳动物 |
| 个体偏差 | 二十九只动物,来源集中 | 个体差异被少数几只主导 |
| 时长偏差 | 四分钟到四十分钟 | 无昼夜节律信息 |
| 状态偏差 | 全部清醒、未给药 | 无麻醉、睡眠、运动状态 |
| 标注偏差 | 单一标注员 | 系统性偏好无法估计 |
| 结构偏差 | 兔按段拆分 | 记录数虚高,个体数被掩盖 |
| 元数据偏差 | 无体重、年龄、品种 | 无法做体型相关的协变量分析 |
最后一条对跨物种研究尤其要紧。频段标度关系恰恰依赖体重,而本库没有给出每只动物的体重。想做严格的标度验证,只能用物种均值近似——这是数据本身的边界,不是分析者能补的。
7.4 外部验证矩阵
| 验证方向 | 可用手段 | 结论强度 |
|---|---|---|
| 峰位正确性 | 与自动检测器交叉比对 | 中,缺第二标注员 |
| 格式正确性 | 与 wfdb 官方读取器对齐 | 高,格式标准 |
| 波形一致性 | 三种格式逐点比对 | 高,同源同值 |
| 跨库一致性 | 与人类 NSRDB 比心率结构 | 低,物种不同 |
| 生物学合理性 | 心率与体重关系是否符合文献 | 中,缺体重字段 |
| 标注完整性 | 峰位间隔分布是否连续 | 中,低质量段会造成缺口 |
三种格式的逐点一致性值得单独做一次。同源数据在不同容器里出差异,通常来自增益换算的舍入——文本格式存的是物理量,WFDB 存的是整数。比对时应先统一到整数域,再谈是否一致。
7.5 它为何能持续:因为它是某个方法的标准参照
公开数据集能长期存活,通常靠三种力量之一:被大规模竞赛采用、被主流工具箱内置、被某个方法论文当作基准。PhysioZoo 属于第三种。它的配套论文提出了一条跨物种频段标度关系,而这条关系的验证离不开三物种的真实数据;只要还有人做跨物种 HRV,这份数据就会被引用一次。
再加上 ODC-BY 的宽松许可与 PhysioNet 的长期托管,它的存续成本极低——没有需要维护的服务、没有需要定期更新的隐私审查、没有会过期的申请流程。一份静态的、许可干净的、格式标准的小数据集,往往是活得最久的那一类。
§8 生态位与历史
8.1 历史沿革
时间线不长,但每一步都有痕迹。文件时间戳显示信号在 2019 年 4 月底入库,注释在 6 月中补齐,许可证与发布在 8 月底完成。配套论文早一年发表,也就是说先有方法与结论,后有配套数据的公开。
| 时间 | 事件 |
|---|---|
| 2018 年 | 配套论文发表于 Frontiers in Physiology |
| 2019-04 | 信号与峰位文件生成 |
| 2019-06 | 注释文件定稿 |
| 2019-08-27 | 1.0.0 版发布于 PhysioNet |
| 至今 | 未再发布新版本 |
8.2 与人类 HRV 库的生态位差
人类 HRV 库的生态位是「临床与人群研究」,关键词是长时程、多导联、有随访、有病理分组。PhysioZoo 的生态位是「方法与算法」,关键词是跨物种、口径统一、短记录、无病理。
这两个生态位不重叠,也不竞争。真正的竞争发生在「动物心电」这个更小的圈子里——那里有各实验室自建的数据、有零散公开的单物种库,PhysioZoo 的优势只是「三个物种同一口径」,劣势是每个物种的量都不大。
8.3 谁在用它
| 使用者类型 | 典型用途 | 常见误用 |
|---|---|---|
| 算法工程师 | 验证 R 峰检测器 | 拿它当人类数据调参 |
| 比较生理研究者 | 跨物种心率基线 | 忽略体重字段缺失 |
| 教学者 | 演示心率差异 | 只展示波形不讲尺度 |
| 兽医研究者 | 狗的正常参考 | 忽略品种差异 |
| 数据平台建设者 | 格式转换的测试样本 | 把三格式当三份数据 |
8.4 未来演化
从数据本身看,可预期的演化方向有三条:补物种(如猪、羊等更接近人类体型的动物)、补元数据(体重、年龄、品种)、补标注层级(从峰位扩展到节律)。这三条都需要重新采集或重新标注,工作量远大于发一个补丁版本,因此 1.0.0 长期不动的可能性很高。
对使用者而言,务实的假设是:这份数据就以现在的样子存在,不要等更新。
8.5 它在文献里的三种出场方式
同一份数据,在不同论文里的位置完全不同。看清这三种位置,能判断一篇引用它的文章到底做了多少工作。
| 出场方式 | 典型表述 | 工作量含义 |
|---|---|---|
| 作为唯一数据 | 「我们在三物种数据上验证了该方法」 | 全部结论依赖这八个半小时 |
| 作为补充验证 | 「另在三物种数据上复核了趋势」 | 主结论来自别处 |
| 仅作为来源说明 | 「数据取自 PhysioZoo 库」 | 可能只用了其中一段 |
第一种要留意样本量。八个半小时、二十九只动物支撑一个方法学结论是够的,支撑一个生理学结论则不够。第二种最稳,因为它把本库放在「可推广性检验」的位置。第三种几乎没有信息量,只能说明数据来源。
判断一篇论文属于哪一种,看它报告了几段记录、几个物种、有没有做按动物分组的划分。三个都答不上来,多半是第三种。
§9 使用指引
9.1 三种角色的路径
| 角色 | 最短路径 | 关键动作 |
|---|---|---|
| 只想快速看一眼 | 下载单条记录,读文本格式 | 看 peaks 文件行数即知心搏数 |
| 要跑算法 | 下载 WFDB 全量,用 wfdb 读 | 先按物种分组,再按动物分组 |
| 要做跨物种研究 | 下载三物种全部,统一重采样 | 先补体重近似值,再做标度换算 |
第一条路径常被忽略。文本格式的 peaks 文件行数减去头部行数,就是这一段的心搏数,不需要任何库。用它做快速筛查,比装环境快得多。
9.2 一条最短的可用流程
把「读一条记录、算 RR、算时域指标」压成一段能直接跑的代码。这是验证环境是否配好最快的方式。
#-- 最短流程:读记录 -> 取峰位 -> 算 RR -> 算时域指标
import wfdb
import numpy as np
rec = wfdb.rdrecord("physiozoo-1.0.0/wfdb_format/rabbit/Rabbit_01_part_1/Rabbit_01_part_1")
ann = wfdb.rdann("physiozoo-1.0.0/wfdb_format/rabbit/Rabbit_01_part_1/Rabbit_01_part_1", "qrs")
rr = np.diff(ann.sample) / rec.fs #-- 单位为秒
rr = rr[(rr > 0.1) & (rr < 3.0)] #-- 剔除明显异常间隔
print("心搏数", len(ann.sample))
print("平均 RR", round(float(rr.mean()), 4), "秒")
print("SDNN", round(float(rr.std(ddof=1)), 4), "秒")
print("RMSSD", round(float(np.sqrt(np.mean(np.diff(rr) ** 2))), 4), "秒")
这段代码里 0.1 与 3.0 两个阈值是按兔的心率区间设的,换到小鼠要收紧,换到狗要放宽。写死阈值的脚本跨物种复用时会静默出错——它不报错,只是把大量真实心搏当异常删掉。
9.3 引用方式
数据与论文要分别引。只引论文不引数据,等于没有标明来源;只引数据不引论文,看的人不知道这套数据为何这样设计。
Shemla, O., & Behar, J. (2019). PhysioZoo - mammalian NSR databases
(version 1.0.0). PhysioNet. https://doi.org/10.13026/p63q-hq95
Behar, J. A., Rosenberg, A. A., Shemla, O., Murphy, K. R., Koren, G.,
Billman, G. E., & Yaniv, Y. (2018). A Universal Scaling Relation for
Defining Power Spectral Bands in Mammalian Heart Rate Variability
Analysis. Frontiers in Physiology, 9. https://doi.org/10.3389/fphys.2018.01001
ODC-BY 1.0 要求署名。署名的最小形态是上述两条引用加一句「数据来自 PhysioNet」。
§10 AI 使用声明
| 项目 | 说明 |
|---|---|
| 数据来源 | PhysioNet 公开数据集,无需申请 |
| AI 参与环节 | 本页文本由 AI 起草,数字取自官方页面与文件本身 |
| 未参与环节 | 数据采集、标注、原始论文撰写均与 AI 无关 |
| 可用于训练吗 | 可以,ODC-BY 1.0 允许,需署名 |
| 可再分发吗 | 可以,需保留许可证与来源 |
| 需注意的伦理 | 动物实验数据,无人类受试者隐私问题 |
| 引用义务 | 数据 DOI 与配套论文各引一次 |
| 免责 | 本页不构成临床或兽医诊断建议 |
常见误读(避坑清单)
| 说法 | 实际 | 证据 |
|---|---|---|
| 「这是 PhysioZoo 软件」 | 这是软件配套的数据集,软件另在 physiozoo.com | 正式名称含 databases,载体为 PhysioNet |
| 「四十五只动物」 | 四十五段记录,二十九只动物 | 兔二十段仅来自四只 |
| 「含人类对照」 | 无一例人类记录 | 三个物种目录下均为动物 |
| 「有房颤样本」 | 全部正常窦性心律 | 注释器仅 qrs 一项 |
| 「二十四小时长程」 | 最长约四十分钟 | 小鼠最长段三十九分三十八秒 |
| 「三份数据可当三倍增广」 | 三套格式同源同值 | 同记录名在三目录各一份 |
| 「有逐拍质量标签」 | 只有低质量段占比的汇总 | WFDB 目录仅三类文件 |
| 「采样率统一」 | 狗五百赫兹,兔鼠一千赫兹 | 头文件与官方说明一致 |
| 「文件名三格式一致」 | MATLAB 里拼作 elctrography | 目录清单可见少一个 e |
| 「阳性阴性都能取」 | 只有正常类 | 无病理分组 |
FAQ
Q1:PhysioZoo 到底是软件还是数据?
两者都有且相互独立。PhysioNet 收录的是数据集,physiozoo.com 发布的是分析软件。数据可被该软件直接加载,但署名、许可、引用都分开。
Q2:为什么不含人类数据却被归入 HRV 资源?
因为它服务的正是 HRV 方法学。跨物种频段换算、RR 序列校正、谱估计流程,这些方法在三物种上验证过才有说服力。人类数据在别的库里。
Q3:四十五段记录能训练模型吗?
只能做验证、预训练或小样本实验。八个半小时、二十九只动物,端到端训练会严重过拟合。它的定位是参照集,不是训练集。
Q4:兔的记录为什么被切成很多段?
原始记录较长,发布时按段拆分以便单文件加载。代价是记录数与个体数脱钩,统计前必须按记录名前缀聚合。
Q5:低质量段怎么处理?
官方规则是连续三拍以上无法辨认 R 峰即标低质量并移除注释。使用时会看到 RR 序列出现异常长的间隔,那是真实缺口,不是漏标。
Q6:三种格式该选哪个?
默认选 WFDB,生态最全、工具最多。不装库选文本,做 MATLAB 分析选 .mat。三者内容同源,选一个即可,不要重复下载。
Q7:能直接算 LF/HF 吗?
能算,但频段不能照搬人类。狗可近似沿用,兔与鼠必须按标度关系换算,否则算出来的功率占比没有生理意义。
Q8:需要重采样吗?
跨物种混合时必须。狗五百赫兹、兔鼠一千赫兹,R 峰时间分辨率差一倍,不统一会让模型学到采样率而非生理差异。
Q9:许可允许商用吗?
允许。ODC-BY 1.0 只要求署名,不限制商业使用。署名时保留 DOI 与许可证名称。
Q10:有缺失值吗?
波形层面没有,每条记录都是连续信号。峰位层面有——低质量段被刻意剔除,因此 RR 序列存在缺口。
Q11:为什么没有体重和年龄?
官方未提供。这对跨物种标度研究是实质缺口,只能以物种均值近似,误差无法量化。
Q12:还会有新版本吗?
自 2019 年 8 月发布以来未更新。补物种或补元数据都需要重新采集,短期内不宜期待。
术语表
| 术语 | 含义 |
|---|---|
| NSR | 正常窦性心律,本库全部记录所属的节律类别 |
| HRV | 心率变异性,相邻心搏间隔的波动程度 |
| RR 间期 | 相邻两个 R 峰之间的时间间隔 |
| R 峰 | 心电 QRS 波群中振幅最高的正向峰,常用作心搏定位点 |
| WFDB | PhysioNet 的波形数据库格式与配套工具库 |
| 注释器 | WFDB 中标注流的名称,本库只有 qrs 一种 |
| .qrs | 参考心搏位置的注释文件后缀 |
| 整合层级 | 头文件字段,区分体表心电、心内电图、动作电位 |
| 增益 | 头文件中 ADC 单位与毫伏的换算系数 |
| 基线 | 头文件中零点偏移量,还原物理量时需减去 |
| 格式码 16 | WFDB 中每样本两字节的存储格式 |
| 低质量段 | 连续三拍以上不可辨认 R 峰、注释被移除的区间 |
| 分段记录 | 兔的长记录被切成的 part_N 片段 |
| 分组划分 | 按动物而非按记录切分训练与测试集 |
| 标度关系 | 频段随体重或心率变化的换算公式 |
| LF / HF | 低频与高频功率频段,人类常取 0.04–0.15 与 0.15–0.4 Hz |
| SDNN | RR 序列的标准差,时域指标 |
| RMSSD | 相邻 RR 差值的均方根,时域指标 |
| 遥测 | 植入式传感器无线传输信号,小鼠采用 |
| 体表电极 | 贴于皮肤的电极,狗采用 |
| 皮下电极 | 埋于皮下的电极,兔采用 |
| 校验和 | 文件完整性校验值,本库为 SHA256 |
| ODC-BY | 开放数据共享署名许可 |
| DAIMS | 数据资产接入成熟度清单,用于逐项核对就绪度 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 记录总数 | 45 | RECORDS 行数 | 官方文件 |
| 动物总数 | 29 | 记录名前缀归并 | 官方文件推导 |
| 狗记录数 | 17 | 目录清单 | 官方文件 |
| 兔记录数 | 20 | 目录清单 | 官方文件 |
| 小鼠记录数 | 8 | 目录清单 | 官方文件 |
| 狗采样率 | 500 Hz | 头文件 | 官方文件 |
| 兔采样率 | 1000 Hz | 头文件 | 官方文件 |
| 鼠采样率 | 1000 Hz | 头文件 | 官方文件 |
| 合计时长 | 约 8.5 小时 | 官方说明 | 官方页面 |
| 未压缩体积 | 401.3 MB | 文件列表 | 官方页面 |
| ZIP 体积 | 117.3 MB | 下载页 | 官方页面 |
| 许可证 | ODC-BY 1.0 | LICENSE.txt | 官方文件 |
| 发布日期 | 2019-08-27 | 项目页 | 官方页面 |
附录 B:数字的来源分层
| 层级 | 内容 | 可信度 |
|---|---|---|
| 一级:官方页面 | 记录数、时长、采样率、体积、许可、DOI | 高,直接引用 |
| 二级:官方文件 | 头文件字段、目录结构、文件命名、校验和 | 高,可复现 |
| 三级:论文摘要 | 采集条件、动物状态、标注流程 | 中高,需与页面互证 |
| 四级:推导 | 动物数、单段心搏数、字节数换算 | 中,依赖前三级 |
| 未核实 | 采集地、原始采集年份、体重年龄 | 低,官方未给 |
附录 C:完整参考文献
- Shemla O, Behar J. PhysioZoo - mammalian NSR databases (version 1.0.0). PhysioNet. 2019. doi:10.13026/p63q-hq95
- Behar JA, Rosenberg AA, Shemla O, Murphy KR, Koren G, Billman GE, Yaniv Y. A Universal Scaling Relation for Defining Power Spectral Bands in Mammalian Heart Rate Variability Analysis. Frontiers in Physiology. 2018;9. doi:10.3389/fphys.2018.01001
- Goldberger A, Amaral L, Glass L, Hausdorff J, Ivanov PCh, Mark R, Mietus J, Moody GB, Peng CK, Stanley HE. PhysioBank, PhysioToolkit, and PhysioNet. Circulation. 2000;101(23):e215-e220.
- PhysioNet. Research Resource for Complex Physiologic Signals. RRID:SCR_007345.
附录 D:任务代码
按任务给三段可直接改用的代码。第一段做物种级统计,第二段做按动物分组的划分,第三段校验三格式一致性。
#-- 任务一:按物种汇总心搏数与总时长
import wfdb
from pathlib import Path
root = Path("physiozoo-1.0.0/wfdb_format")
for sp in ["dog", "rabbit", "mouse"]:
beats, secs = 0, 0.0
for rec_path in sorted((root / sp).glob("*/*.hea")):
name = rec_path.stem
rec = wfdb.rdrecord(str(rec_path.with_suffix("")))
ann = wfdb.rdann(str(rec_path.with_suffix("")), "qrs")
beats += len(ann.sample)
secs += rec.sig_len / rec.fs
print(sp, "记录", len(list((root / sp).glob("*/*.hea"))),
"心搏", beats, "小时", round(secs / 3600, 2))
#-- 任务二:按动物分组划分,避免同兔跨集
import re
from sklearn.model_selection import GroupKFold
names = ["Rabbit_01_part_1", "Rabbit_01_part_2", "Rabbit_02_part_1",
"Rabbit_03_part_1", "Rabbit_03_part_7"]
groups = [re.match(r"(Rabbit_\d+)", n).group(1) for n in names]
gkf = GroupKFold(n_splits=4)
for tr, te in gkf.split(names, groups=groups):
print("训练", [names[i] for i in tr], "测试", [names[i] for i in te])
#-- 任务三:三格式同记录的心搏数应当一致
for f in wfdb_format/dog/Dog_01/Dog_01.qrs; do
echo "wfdb: $(python3 -c 'import wfdb;print(len(wfdb.rdann("wfdb_format/dog/Dog_01/Dog_01","qrs").sample))')"
done
wc -l text_format/dog/Dog_01/peaks_Dog_01.txt
第三段的两条命令输出应只差头部行数。如果差得多,说明某一套在导出时出了问题,优先怀疑峰位的时间基准。
附录 E:如果只记五件事
- 这是数据集,不是软件;软件同名但另在 physiozoo.com。
- 四十五段记录、二十九只动物、约八个半小时,全部为动物。
- 兔的记录按段拆分,记录数不等于个体数,划分必须按动物分组。
- 无人类、无房颤、无长时程、无多导联——四条硬边界。
- 采样率两档,跨物种混合前必须统一重采样。
编辑说明
本页数字取自 PhysioNet 项目页、文件目录清单、RECORDS 与 ANNOTATORS 文件,以及三个物种各一条头文件的原文。采集条件与标注流程取自配套论文摘要。采集地与原始采集年份官方未给出,正文已标为未核实。分布类统计(RR 直方图、峰位间隔分位数、逐段信噪比)不在本页范围内,需要者应自行计算。三格式一致性仅做了结构性核对,未做逐点逐样本比对。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- wctecgdb — 共享标签:生理信号 / 心电信号 / 心血管疾病
- ahadb — 共享标签:生理信号 / 心电信号 / 心血管疾病
- chfdb — 共享标签:生理信号 / 心电信号 / 心血管疾病
- crisdb — 共享标签:生理信号 / 心电信号 / 心血管疾病
- cudb — 共享标签:生理信号 / 心电信号 / 心血管疾病
- ltdb — 共享标签:生理信号 / 心电信号 / 心血管疾病
- ltstdb — 共享标签:生理信号 / 心电信号 / 心血管疾病
- iafdb — 共享标签:生理信号 / 心电信号 / 心血管疾病
- mvtdb — 共享标签:生理信号 / 心电信号 / 心血管疾病
- nsrdb — 共享标签:生理信号 / 心电信号 / 心血管疾病
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

