信息速览
心率变异性研究里有一个说出来有点尴尬的现实:公开的长时间心率序列数据,绝大多数只覆盖成年人,而覆盖到婴幼儿的那一类,又往往是几分钟到几十分钟的短片段。短片段不是没有用——五分钟、十分钟的 RR 间期序列足够算出时域与频域那批标准指标,这些指标有成熟的参考区间,也支撑了大部分临床与可穿戴场景的结论。可是一旦问题换成「这段序列有没有长程相关」「它的标度行为随年龄怎么变」「分形维度在婴儿和成人之间差多少」,五分钟就完全不够用了:这类非线性指标的估计本身需要成千上万个心搏才谈得上收敛,而且对序列里的伪差、漏搏与缺失片段极度敏感,一个未经处理的早搏就能把标度指数拖偏。
RR 间期健康人序列库(RR interval time series from healthy subjects)压的就是这个空白。阿根廷拉普拉塔国立大学与 CONICET 的研究组把 147 名健康志愿者的 24 小时动态心电图逐搏读成 RR 间期序列,年龄从 1 个月一直到 55 岁,其中 71 名还不满一岁,10 名超过 18 岁;序列以毫秒为单位的整数一行一个地存进纯文本文件,随库附一份 patient-info.csv 给出编号、年龄与性别。它有意识地把自己定位成非线性分析的素材,官方页面在背景段里直说这批序列是为了研究心率变异性的非线性特性而整理的,参考文献也集中在嵌入维数、长程相关、替代数据检验这一类方法上。
它的代价同样写在官方页面上,而且写得比它的优点更具体:伪差超过 8% 的序列不收,含有超过 20 秒伪差段的序列也不收;收下的序列里,含伪差的片段被整段删除,删掉之后前后两段直接拼接,所以序列可能不连续。这两条比任何宣传语都更能决定它能不能用在你的问题上——如果你要的是一条严格等间隔、逐搏连续的时间序列,它给不了;如果你要的是一条足够长、伪差已被清到很低水平的健康人序列,它几乎找不到替代品。它不是波形库,不是标注库,也不是临床队列,是一批为长程分析准备的健康人底本。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 全名 | RR interval time series from healthy subjects |
| 发布方 | PhysioNet(数据由阿根廷拉普拉塔国立大学与 CONICET 拉普拉塔科学技术中心研究组贡献) |
| 首次发布 | 2021 年 8 月 30 日,版本 1.0.0 |
| 最近改动 | 文件目录中 SHA256SUMS.txt 的修改日期为 2021 年 10 月 13 日,序列文件多为 2021 年 6 月 2 日 |
| 个体数 | 147 名健康志愿者 |
| 性别构成 | 72 名男性、67 名女性,另 8 名个体的性别信息不可得 |
| 年龄范围 | 1 个月至 55 岁;其中 71 名不满一岁,10 名超过 18 岁 |
| 单条时长 | 由 24 小时动态心电图(Holter)导出的 RR 间期序列 |
| 数据内容 | 逐搏 RR 间期,单位为毫秒,纯文本一行一个整数 |
| 采集设备 | 三通道 DMS300-7、DMS300-3A 与 Galix 记录仪,配 3M 电极 |
| 分析软件 | Galix 软件;DMS 侧用 CardioScan 10.0 与 11.0 |
| 文件格式 | 以个体编号命名的 .txt(ANSI 文本)序列文件,加 patient-info.csv 元数据表 |
| 体量 | 解压后合计 87.9 MB,官方 ZIP 压缩包 16.9 MB |
| 许可 | Creative Commons Attribution 4.0 International Public License(CC BY 4.0) |
| 典型用途 | 心率变异性的非线性分析、年龄相关标度行为研究、患病人群的健康对照组 |
§1 它要解决的具体麻烦
1.1 长序列与干净序列,通常只能选一个
做心率变异性分析的人迟早会遇到一对互相拉扯的要求。第一边是长度:时域指标如 SDNN 在五分钟窗口上就能算得比较稳,但要去谈长程相关、去谈去趋势波动分析里的标度指数、去谈多重分形谱的宽度,窗口得拉到几千上万个心搏,通常意味着数小时的记录。第二边是干净:记录越长,患者活动、电极松动、翻身压线造成的伪差越多,而伪差对非线性指标的影响远大于对均值类指标的影响——一个漏掉的 R 峰会让相邻的 RR 间期翻倍,一个错检的 R 峰会把一个间期劈成两半,这些异常值直接进入序列之后,标度行为的估计可以偏得很远。
临床场景把这对矛盾放大得更厉害。为了拿到几千个心搏,通常只能上 24 小时动态心电图;而 24 小时意味着患者要带着记录仪睡觉、走路、洗澡,伪差不可避免。反过来,为了拿到干净的短片段,就得让患者静躺,代价是长度。于是公开数据也照着这两条路分了家:一边是几分钟级的静息或标准化短记录,干净但短;一边是 24 小时级的长记录,长但带着伪差与活动状态的混杂。
这个库想做的是第三条路:把长记录和干净这两件事用「删」的方式强行合起来。它先要 24 小时的长度,然后把伪差比例过高的整条序列淘汰掉,把通过淘汰的序列里的伪差片段直接剪掉。代价写在官方使用说明里——剪掉之后前后直接拼接,拼接处的 RR 间期不再对应真实相邻的两次心搏。
1.2 三条常见的错误期待
第一条,期待它是原始波形库。它不是。目录里只有 RR 间期数字,没有心电波形,没有 R 峰位置,没有导联,也没有心率曲线。想做波形形态、想做 QRS 检测算法的评测、想重做一遍 R 峰定位,这里没有任何原始素材可供回溯。
第二条,期待序列是逐搏连续的。官方使用说明明确写了:伪差片段被删除后,缺口前后的两段被简单拼接,RR 间期可能不连续。也就是说,你不能默认第 n 个间期和第 n+1 个间期来自现实里相邻的两个心搏。任何依赖严格相邻关系的算法——某些心率震荡计算、某些基于逐差符号的分析——都要先想清楚拼接处怎么处理。
第三条,期待它能支撑临床结局研究。它没有任何用药记录、随访记录、检验值或终点事件。个体层面的信息只有 patient-info.csv 里的编号、年龄与性别三列。想做「心率变异性与预后」这类研究,这里没有结局变量可连。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 长程相关、标度指数、多重分形等非线性指标 | 24 小时量级的健康人 RR 序列,伪差已清除到低水平 | 够,这是它最对口的地方 |
| 年龄对心率变异性的影响 | 年龄从 1 个月到 55 岁,含 71 名不满一岁者 | 够,且婴幼儿段是别处几乎没有的 |
| 患病人群的健康对照 | 全部为健康志愿者,入选有明确的正常判据 | 够做对照,需注意人群与设备差异 |
| 标准时域与频域 HRV 指标 | 序列够长,可自行按时段切分计算 | 够,但需自己定义时段与窗口 |
| 心律失常的逐搏类型识别 | — | 不够,没有心搏类型标注,也没有波形 |
| R 峰检测算法的评测 | — | 不够,R 峰定位已由原作者完成并固化 |
| 用药、干预、随访、结局相关研究 | — | 不够,元数据只有编号、年龄、性别 |
| 昼夜节律与睡眠分期的对照分析 | 24 小时覆盖,但无时间戳与睡眠标注 | 不够,序列不含绝对时间信息 |
| 多中心泛化验证 | 单一研究组、单一设备体系 | 不够,只能做跨库而非跨中心 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 你在做非线性心率变异性方法,缺长序列验证 | 提供 24 小时量级、伪差已清的健康人序列 | 先按官方口径复述伪差处理方式,再决定拼接处是否插补 |
| 你在做年龄相关的自主神经成熟研究 | 覆盖 1 个月到 55 岁,婴幼儿段样本密集 | 用 patient-info.csv 的年龄列分层,注意年龄以年为单位带小数 |
| 你手上有一批病人 RR 序列,缺健康对照 | 提供同口径的健康人底本 | 先确认你的病人序列的伪差处理口径是否与它一致 |
| 你想复现已发表标度行为结论 | 官方列出七篇引用文献,其中含原始方法论文 | 按 §9.3 的引用方式核对版本与阈值定义 |
| 你要教心率变异性的非线性分析课 | 数据格式极简,无需专用软件即可读取 | 用 §5.3 的几行代码读一条序列即可开讲 |
| 你在做可穿戴设备的 RR 精度评估 | 提供 Holter 导出序列作为参考侧 | 注意它的 RR 确定误差约 8 毫秒,不宜当金标准 |
1.5 一句话判断
它不适合当「更全的数据集」,而适合当「更长且更干净的底本」:在健康人这一侧,把从婴儿到成人的长时程心率变异性铺成一条可用的基线,而这个基线正是大多数患病队列研究所缺的那一半。
1.6 不适合谁:四条边界
不适合拿来当波形数据源。 没有原始心电信号,没有 R 峰坐标,做不了任何形态学或检测算法的工作。
不适合拿来当逐搏连续的严格序列。 官方明说拼接处不连续,把它当成与现实逐搏一一对应的序列会引入系统性偏差。
不适合拿来做临床结局或干预研究。 元数据表里没有用药、没有随访、没有终点。
不适合拿来做多中心或跨设备的泛化验证。 全部序列来自同一研究组的同一批设备与分析软件流程,只能作为单一来源对待。
§2 数据构成与规格
2.1 一名个体一个文件,目录是扁平的
官方文件目录的结构非常简单:根目录下直接摆放全部序列文件,没有按年龄、性别或采集日期分出子目录。每个序列文件的名字就是该个体的编号加 .txt 后缀,官方数据描述段的说法是「每个个体由一个 ID 号标识,这个个体的心率变异性时间序列就是一个 ID.txt 文件」。除序列文件之外,根目录只有三个附属文件:patient-info.csv 存个体信息,LICENSE.txt 是许可全文,SHA256SUMS.txt 是全部文件的校验和清单。
没有 RECORDS 之类的记录名清单文件,这意味着要枚举全部个体,得从 patient-info.csv 的 File 列读,或者直接列目录。这一点和用惯了 WFDB 格式库的人的直觉不同,后者通常有一个 RECORDS 文件可以一行一个记录名地读。
2.2 字段字典
| 信息项 | 所在位置 | 取值形态 | 含义 | 使用注意 |
|---|---|---|---|---|
| File | patient-info.csv 第 1 列 | 整数编号,如 0、2、3、4000 | 个体标识,同时是序列文件的文件名 | 编号不是连续的,也不从 1 开始 |
| Age (years) | patient-info.csv 第 2 列 | 数值,单位年,可带小数,如 4.5、1.42 | 该个体记录时的年龄 | 婴幼儿段的小数是年为单位的分数,不是月龄 |
| Gender | patient-info.csv 第 3 列 | M 或 F | 性别 | 官方说明另有 8 名个体的性别信息不可得 |
| RR 间期 | ID.txt 每一行 | 一个整数 | 相邻两次心搏之间的间隔,单位毫秒 | 行尾为回车换行,读取时按空白切分即可 |
| 文件编码 | ID.txt | ANSI 文本 | 纯文本存储 | 用 ascii 或 latin-1 解码均可,不要用 utf-8 强解带重音符的内容 |
| 校验和 | SHA256SUMS.txt | 文件名与 SHA256 值 | 用于校验下载完整性 | 官方在 2021 年 10 月 13 日更新过这个文件 |
这张表要传达的核心是:整个库在数据结构上只有两层,一层是「每行一个毫秒整数」的序列,一层是「一行一个个体的三列元数据」。没有任何事件标注、没有时间戳、没有分层字段。
2.3 一个序列文件的解剖
以 000.txt 为例。用浏览器或命令行取这个文件的前几行,看到的是一串裸整数:
789
727
789
750
812
789
每一行是一个 RR 间期,单位毫秒。前六个值分别是 789、727、789、750、812、789 毫秒,换算成瞬时心率大致在每分钟 74 到 82 次之间——这是一个成年人在安静状态下的典型区间,而 000 号个体在 patient-info.csv 里登记的年龄是 53 岁、性别为男性。把视角换到编号 4000 开头的那一段文件,行内的数值会明显变小,因为那一段对应的是婴幼儿,心率快、间期短。
行尾是回车换行(CRLF),这是 Windows 系文本工具的默认写法,也和官方说的 ANSI 格式一致。用 Python 读取时不必关心行尾,按空白切分即可;用 shell 处理时要小心 \r 被带进数值里,尤其是用 awk 做算术时,行尾的回车会让字符串转数字的结果出错。
文件之间没有长度约定。每条序列来自 24 小时记录,但每个人在这 24 小时里的心搏次数不同,被剪掉的伪差片段长度也不同,所以文件的字节数从两百多 KB 到八百多 KB 都有。这个文件大小的差异是结构性的,不是质量差异,不应拿来筛样本。
2.4 编号的两段区间与个体映射
把目录里全部 147 个序列文件的编号排开,会看到编号明显分成两段:一段是从 000 到 427 这一带的三位数编号,另一段是从 4000 到 4123 这一带的四位数编号。官方页面没有解释这两段编号的含义,也没有给出它们与年龄、采集批次或设备的对应关系,因此这里只能作为文件命名的结构事实列出,不能当作分组依据使用。
真正可用的分组依据只有 patient-info.csv 的 Age (years) 与 Gender 两列。需要注意的是年龄列是带小数的年数:婴幼儿段会出现 1.42、4.5 这样的值,说明记录时精确到月甚至更细。做年龄分层时,一岁以下的那一组是 71 名,这一组在别处几乎没有替代;而一岁到十八岁之间的那一段,官方只给了总数与两端的人数,没有逐岁的明细。
| 分组口径 | 官方给出的数值 | 说明 |
|---|---|---|
| 全部个体 | 147 名 | 官方数据描述段原文 |
| 男性 | 72 名 | 同上 |
| 女性 | 67 名 | 同上 |
| 性别不可得 | 8 名 | 同上,三者相加为 147 |
| 不满一岁 | 71 名 | 同上 |
| 超过 18 岁 | 10 名 | 同上 |
| 年龄下界 | 1 个月 | 摘要段原文 |
| 年龄上界 | 55 岁 | 摘要段原文 |
2.5 与常见生理信号格式的差异
PhysioNet 上多数心电类资源采用 WFDB 格式:一个头文件配一个二进制信号文件,再加一个二进制注释文件。熟悉这套格式的人上手这个库时会有几处不适应,下表把它们摊开:
| 对比项 | 本库 | WFDB 格式的典型心电库 |
|---|---|---|
| 信号本体 | 无,只有 RR 间期数字 | 有波形,按采样点存储 |
| 头文件 | 无 .hea | 有,声明采样率、增益、导联 |
| 时间基准 | 隐含在 RR 间期的累加里 | 采样点序号除以采样率 |
| 注释 | 无 | 有 .atr,含心搏位置与类型 |
| 元数据 | patient-info.csv,三列 | 写在头文件注释行里 |
| 读取工具 | 纯文本即可,无需专用库 | 通常需要 wfdb 库 |
| 单位 | 毫秒,整数 | 物理量,需按增益换算 |
| 断续表示 | 无法表示,缺口被直接拼接 | 可由注释标记伪差段 |
这张表最有用的一行是最后一行。WFDB 格式的库可以在注释里标出「从这里到这里是伪差」,使用者因此可以自己决定是插补还是剪掉;本库把这个决定提前做掉了,并且没有留下缺口位置的任何痕迹。这是它在使用上的分水岭:接受这个决定的人拿到的是干净且长的序列,不接受的人则无从回溯。
2.6 数值的物理含义与精度边界
RR 间期是相邻两次心搏 R 峰之间的时间间隔,单位毫秒,其倒数就是瞬时心率。这个量在心率变异性分析里是唯一的原始输入,时域、频域、非线性三类指标都从它算起。
精度边界由采集与分析链路共同决定,官方把它写得很具体:
| 环节 | 官方给出的参数 | 含义 |
|---|---|---|
| 记录时长 | 24 小时 | 每名个体一次 Holter 记录的覆盖时长 |
| 记录仪 | DMS300-7、DMS300-3A、Galix,三通道 | 三种设备混用,3M 电极 |
| Galix 采样率 | 读入 512 与 1024 Hz 可选,写出 128 Hz | 分析用信号的写出采样率 |
| DMS 采样率 | 信号平均心电分析为每通道 1024 Hz;其余情形读入 512 Hz、写出 128 Hz | 同上 |
| RR 间期确定误差 | 约 8 毫秒 | 官方原话:约为 R 峰定位误差的两倍 |
| 伪差比例上限 | 8% | 超过此值的整条序列不收录 |
| 伪差片段长度上限 | 20 秒 | 含超过此长度片段的序列不收录 |
| 序列是否含伪差 | 不含 | 官方说明收下的序列中伪差片段已被删除 |
写出采样率 128 Hz 这一项值得单独说一句。它决定了 RR 间期在时间轴上的分辨率大约是 7.8 毫秒,与官方给出的约 8 毫秒确定误差在同一量级。换句话说,这个库的 RR 间期精度被限制在个位数毫秒级,用它去做需要亚毫秒精度的分析(比如某些极短时尺度的高频成分研究)是不合适的。
§3 它是谁的数据
3.1 贡献者与机构
官方页面列出四位作者:Isabel María Irurzun、Leopoldo Garavaglia、Maria Magdalena Defeo、Julieta Thomas Mailland。前三位的署名机构集中在阿根廷拉普拉塔:Irurzun 与 Garavaglia 隶属于 CONICET 拉普拉塔科学技术中心下的理论与应用物理化学研究所(INIFTA)与拉普拉塔国立大学;Thomas Mailland 的署名在 INIFTA 与拉普拉塔国立大学精确科学学院;Defeo 的署名机构是 Rodolfo Rossi 教授综合医院(Hospital Interzonal General de Agudos Prof. Dr. Rodolfo Rossi),这是一方临床侧的力量。
这个组合解释了很多事。物理化学研究所的出身解释了为什么这批数据的方法论重心在非线性时间序列分析——嵌入维数、长程相关、替代数据检验——而不是在临床诊断;而医院侧的参与解释了为什么入选判据是一份由心内科医师逐条把关的 Holter 正常标准。官方明确写到:记录里的心脏事件由 Holter 软件自动检测分类,再由两名心内科医师检查与更正。
3.2 时间线
| 时间 | 事件 | 意义 |
|---|---|---|
| 2021-06-02 | 多数序列文件的修改日期 | 数据主体入库时间 |
| 2021-08-09 | patient-info.csv 与个别序列文件的修改日期 | 元数据定稿 |
| 2021-08-26 | LICENSE.txt 的修改日期 | 许可文本随版本确定 |
| 2021-08-30 | 版本 1.0.0 在 PhysioNet 发布 | 首次公开 |
| 2021-10-13 | SHA256SUMS.txt 的修改日期 | 校验和清单最后更新 |
| 2024 年及以后 | 官方页面列出 7 篇引用文献 | 使用者从原团队扩展到外部研究组 |
到目前为止,库只有一个版本 1.0.0,官方没有给出任何扩版或修订的说明。版本 DOI 是 10.13026/51yd-d219,指向最新版本的 DOI 是 10.13026/c61a-z467。
3.3 采集场景:一次严格的健康人筛选
它不是从医院信息系统里捞出来的既有记录,而是一次有入组标准的前瞻性志愿者招募。官方方法段的原文是:健康受试者在经过详尽问诊与临床检查之后被招募为志愿者;研究方案由拉普拉塔国立大学(UNLP)伦理委员会批准;按照赫尔辛基宣言,所有受试者在参与前都被告知研究内容并签署书面知情同意,16 岁以下儿童的同意由其父母或法定监护人给出。
入组标准有三条并列:无疾病临床表现、未服药、心电图正常。第三条由一张正常判据表具体化,这张表是理解「健康」二字在本库里到底意味着什么的关键:
| 编号 | 判据 | 含义 |
|---|---|---|
| I | 夜间最低频率 > 60 次/分 | 排除夜间显著心动过缓 |
| II | 夜间停搏 < 3 秒 | 排除长间歇 |
| III | 室性早搏 < 100 次/24 小时,且无成对、无短阵、无多形性 | 排除有意义的室性异位节律 |
| IV | 室上性早搏 < 100 次/24 小时,且无成对 | 排除有意义的室上性异位节律 |
| V | 无传导阻滞或传导障碍 | 排除传导系统病变 |
采集侧的细节同样写得很细:24 小时记录,三通道,DMS300-7 与 DMS300-3A 数字记录仪加 Galix 记录仪,3M 电极;Galix 侧用 Galix 软件分析,DMS 侧用 CardioScan 10.0 与 11.0。事件由软件自动检测分类,再由两名心内科医师检查更正。
这里有一句官方说明容易被略过:正常判据限制了非窦性心搏的数量上限,因此记录里残留的少量非窦性心搏没有被剔除。也就是说,序列里允许存在有限数量的早搏,它们对应的 RR 间期会出现在序列中。这对做非线性分析的人是必须知道的事实——那些短间期不是伪差,是真实心搏,而官方没有把它们标出来。
3.4 数据来源的三个层次
理解这份数据要先分清三层:Holter 原始波形(未公开)、逐搏 R 峰与校正结果(未公开)、伪差清除后的 RR 间期序列(公开)。第一层不可得,说明为什么第三方无法重做 R 峰检测;第二层不可得,说明为什么伪差片段的位置与长度无从复原;第三层是唯一的交付物,决定了所有下游分析都被锁定在原作者的这两个决定上。
这个结构带来一个直接的后果:本库无法用于评测 R 峰检测算法,也无法用于比较不同的伪差处理策略。它是一份「已处理完毕」的成果,不是一份可供再加工的原料。
§4 它最独特的东西
4.1 从满月到五十五岁,而且婴儿占了将近一半
年龄跨度本身不算罕见,罕见的是跨度里的重心。官方数据描述段给出的 147 名个体中有 71 名不满一岁——接近一半的样本落在生命最初的十二个月里,而这一段的自主神经正在经历最剧烈的变化。做心率变异性的人都知道,从新生儿到学龄前,心率变异性的各项指标并不是缓慢漂移,而是在数量级上发生变化;要把这条曲线画出来,需要的是密集的婴幼儿样本,而不是在成年人堆里插几个儿童。
这一点直接决定了它的用途边界:它不是「成人健康人 RR 库」的加长版,而是一份以婴幼儿为重心、向上延伸到青年的底本。想找大批成年健康人的 24 小时 RR 序列,别处有更对口的资源;想找婴儿的,这里几乎是唯一的选择。
4.2 二十四小时,而不是五分钟
第二项独特性是长度,而且长度在这里有具体的含义。时域与频域的标准指标在五分钟窗口上就能算,这才有了一系列以短时记录为基础的临床参考值;但非线性指标不一样,它们估计的是序列在多个时间尺度上的统计结构,窗口越短,能看到的尺度范围越窄,标度指数的估计方差越大。
官方把这一点讲得很直接:这批序列是为了支持长期特性(long-term characteristics)的研究而共享的,参考文献里的几篇也正是关于标度行为随年龄的变化、关于嵌入维数、关于长程相关在疾病中的丢失。反过来说,如果你要做的只是算一个五分钟的 RMSSD,用它是杀鸡用牛刀,而且还要额外承担拼接处不连续带来的麻烦。
4.3 案例:三条可以自己验证的观察
取 000.txt 的前六个值 789、727、789、750、812、789 毫秒。这不是统计,是把文件打开就能看到的结构事实,用它足以说明三件事:
| 观察 | 具体表现 | 对分析的含义 |
|---|---|---|
| 数值是毫秒整数 | 789、727 等都是整数,没有小数 | 序列的量化步长是 1 毫秒,比采集侧的约 8 毫秒误差更细 |
| 相邻值在波动 | 789 与 727 相差 62 毫秒 | 逐搏差异本身就存在,做平滑或重采样要写清窗口 |
| 未见极端值 | 前六个值都在 700 到 820 毫秒之间 | 说明这段序列处在被清理过的状态,不代表整条 24 小时都如此 |
再取编号 4000 一带的任意一个文件,会看到数值明显更小——婴幼儿的心率快,RR 间期短。这两个例子合起来说明了本库最重要的一条使用原则:年龄是这条数据的第一分层变量,任何不分层就把 147 条序列混在一起的分析,得到的都是年龄结构而非生理结构的混合结果。
需要提醒的是,上面这些值是从文件开头直接读到的,不是对全序列的统计结论。整条序列在 24 小时里的波动范围、夜间与白天的差异、伪差被剪掉之后留下的拼接处数量,都需要使用者自己按研究目的去处理,官方没有给出任何逐条的汇总。
4.4 伪差处理:剪掉而不是插补
这是它最独特、也最容易被误读的一项决定。面对伪差,常见做法有两条:插补(用插值或模型把缺口填上,保持序列等间隔)与剪除(把缺口整段删掉,前后拼接)。本库选了后者,并且给出了两条量化门槛:整条序列的伪差比例不超过 8%,单个伪差片段不超过 20 秒。官方的理由写得很有分寸——这两个阈值是为了在不显著改变序列动力学行为的前提下移除伪差段,判断依据来自它引用的方法学文献,其中 20 秒这个上限的理由是它远低于序列的相关长度。
代价同样明确:拼接处的两个 RR 间期不再对应现实中相邻的两拍。官方使用说明的原话是,缺口前后的两段被简单拼接,RR 间期可能不连续。对依赖严格相邻关系的分析,这是一个必须写进方法节的事实;对依赖长程统计结构的分析,它被控制在很低的水平——这也是那两条门槛存在的意义。
| 处理方式 | 本库的选择 | 对下游的含义 |
|---|---|---|
| 插补 | 未采用 | 序列里不存在被填上的合成值 |
| 剪除并拼接 | 采用 | 拼接处不连续,且位置不可复原 |
| 保留伪差并标记 | 未采用 | 无法自行决定处理策略 |
| 整条淘汰 | 对超阈者采用 | 8% 与 20 秒两道门槛决定了谁能入库 |
4.5 边界条件:什么情况下它不再适用
| 条件 | 是否适用 | 判断依据 |
|---|---|---|
| 你要做长程相关、标度指数、多重分形 | 适用,且是最对口的场景 | 24 小时序列、伪差已清、无合成值 |
| 你要做年龄相关的自主神经成熟研究 | 适用 | 年龄 1 个月至 55 岁,婴幼儿段密集 |
| 你要为患病人群配健康对照 | 适用 | 全部为健康志愿者,入组判据明确 |
| 你要评测 R 峰检测算法 | 不适用 | 没有波形,R 峰定位已固化 |
| 你要做严格逐搏相邻关系的分析 | 谨慎 | 拼接处不连续,官方已明示 |
| 你要做昼夜节律或睡眠分期相关分析 | 不适用 | 序列无时间戳,无睡眠标注 |
| 你要做用药、随访或结局研究 | 不适用 | 元数据只有编号、年龄、性别 |
| 你要做多中心泛化验证 | 不适用 | 单一研究组、单一设备体系 |
| 你需要亚毫秒级的间期精度 | 不适用 | RR 确定误差约 8 毫秒,写出采样率 128 Hz |
| 你要做心律失常的类型识别 | 不适用 | 无心搏类型标注;少量非窦性心搏未被剔除且无标记 |
这张表最该被记住的是第七行与第十行。第七行排除了它在临床研究上的大部分想象空间;第十行则提醒那些想拿它做早搏相关分析的人——序列里可能存在真实的非窦性心搏,但没有任何标记能指出它们在哪。
§5 怎么拿到
5.1 目录结构与下载面
| 路径 | 内容 | 大小量级 |
|---|---|---|
| /files/rr-interval-healthy-subjects/1.0.0/ | 根目录,扁平摆放全部序列文件 | — |
| …/000.txt 至 …/4123.txt | 每个个体一个 RR 间期序列文件 | 单个文件 200 KB 到 900 KB 不等 |
| …/patient-info.csv | 个体编号、年龄、性别 | 约 1.7 KB |
| …/LICENSE.txt | CC BY 4.0 许可全文 | 约 14.5 KB |
| …/SHA256SUMS.txt | 全部文件的 SHA256 校验和 | 约 10.7 KB |
官方给出的体量是解压后合计 87.9 MB,ZIP 压缩包 16.9 MB。压缩比很高,原因不难理解:序列文件是纯文本整数,冗余极大。这意味着下载很快,但解压后会占几十兆,做全量扫描时按文本逐行读会比较慢。
5.2 批量下载
官方页面直接给了三条下载途径,照抄即可:
#-- 方式一:wget 递归,官方页面原文给出的写法
wget -r -N -c -np https://physionet.org/files/rr-interval-healthy-subjects/1.0.0/
#-- 方式二:AWS 命令行免签同步(官方给的 S3 开放桶)
aws s3 sync --no-sign-request s3://physionet-open/rr-interval-healthy-subjects/1.0.0/ ./rrhs
#-- 方式三:官方 Python 包,会处理登录与目录
physionet download rr-interval-healthy-subjects --version 1.0.0
#-- 下载后核对校验和,官方提供了 SHA256SUMS.txt
cd rr-interval-healthy-subjects/1.0.0 && sha256sum -c SHA256SUMS.txt | grep -v ': OK$' | head
最后一行是值得养成的习惯。纯文本数据在传输中被截断不会报错,只会静默少几行;校验一遍几乎不花时间。
5.3 用几行 Python 直接读一条序列
这个库最大的实用优点是:不需要任何专用库。
import urllib.request
url = 'https://physionet.org/files/rr-interval-healthy-subjects/1.0.0/000.txt'
raw = urllib.request.urlopen(url).read().decode('ascii')
#-- 行尾是 CRLF,按空白切分即可,不要用 splitlines 后直接 int
rr = [int(x) for x in raw.split()]
print(rr[:6]) #-- [789, 727, 789, 750, 812, 789],单位毫秒
#-- 转成秒与瞬时心率(次/分)
sec = [x / 1000.0 for x in rr[:6]]
bpm = [60000.0 / x for x in rr[:6]]
print([round(v, 1) for v in bpm])
如果要读本地已下载的整个目录:
import pathlib
#-- 遍历根目录下的全部序列文件,文件名即个体编号
for p in sorted(pathlib.Path('1.0.0').glob('*.txt')):
if p.name in ('LICENSE.txt', 'SHA256SUMS.txt'):
continue
vals = [int(x) for x in p.read_text(encoding='ascii').split()]
print(p.stem, vals[:3])
break
第二段里那个 continue 是必要的:根目录下有两个非序列的 .txt 文件,直接用 glob(‘*.txt’) 会把 LICENSE.txt 与 SHA256SUMS.txt 也扫进来,而它们的内容不是整数,会在 int() 处抛异常。这是本库最容易踩的第一个坑。
5.4 转成通用的表结构
下游如果走 pandas 或常规张量管线,通常要把「每人一条不定长序列」变成「每人一行」或「每窗一行」的表。
import pandas as pd
import pathlib
#-- 读元数据表,列名带空格,读取后建议重命名
meta = pd.read_csv('1.0.0/patient-info.csv')
meta = meta.rename(columns={'File': 'sid', 'Age (years)': 'age', 'Gender': 'sex'})
print(meta.columns.tolist(), meta.shape)
#-- 逐个文件读成"每人一行"的长表:编号、年龄、性别、序列长度、前 5 个值
rows = []
for p in sorted(pathlib.Path('1.0.0').glob('[0-9]*.txt')):
vals = [int(x) for x in p.read_text(encoding='ascii').split()]
rows.append({'sid': int(p.stem), 'head': vals[:5]})
seq = pd.DataFrame(rows)
df = meta.merge(seq, on='sid', how='left')
print(df.head())
glob 里的 [0-9]*.txt 是关键:序列文件的名字全部以数字开头,而 LICENSE.txt 与 SHA256SUMS.txt 以字母开头,用这个模式可以干净地只取序列文件,比在循环里判断文件名更省事。
5.5 年龄与性别的正确用法
import pandas as pd
meta = pd.read_csv('1.0.0/patient-info.csv')
meta = meta.rename(columns={'File': 'sid', 'Age (years)': 'age', 'Gender': 'sex'})
#-- 婴幼儿组:官方数据描述段给出不满一岁者为 71 名
infant = meta[meta['age'] < 1.0]
adult = meta[meta['age'] > 18.0]
#-- 性别缺失不是空字符串,需按官方说明的口径处理
known = meta[meta['sex'].isin(['M', 'F'])]
print(infant.shape, adult.shape, known.shape)
最后一行打印的三个形状属于使用者自己的核对动作,不是官方给出的数字。把它们和官方的 71 名、10 名对一下,是验证元数据是否被正确读取的最快办法;若对不上,通常是年龄列被读成了字符串,或编号列被读成了浮点数导致合并失败。
5.6 五个最容易出错的地方
| 位置 | 错误写法 | 后果 | 正确做法 |
|---|---|---|---|
| 文件枚举 | glob(‘*.txt’) 全收 | LICENSE.txt 与 SHA256SUMS.txt 混入,int() 抛错 | 用 glob(‘[0-9]*.txt’) 或按文件名白名单过滤 |
| 行尾处理 | 按 \n 切分后直接 int |
CRLF 的 \r 留在字符串里,awk 算术出错 |
按空白 split,或先 strip |
| 序列连续性 | 默认相邻值对应相邻心搏 | 拼接处引入虚假的大跳变 | 阅读官方使用说明,按研究目的决定是否插补 |
| 年龄单位 | 把 1.42 当成 1 岁 42 个月 | 年龄分层全错 | 单位是年,带小数;0.5 表示半岁 |
| 精度预期 | 当成亚毫秒级金标准 | 高频指标被误差主导 | 官方给出 RR 确定误差约 8 毫秒 |
§6 与库内条目的关系
6.1 关系图谱
| 站内条目 | 与本库的关系 | 分工 |
|---|---|---|
| 正常窦性心律的十八个整天 — MIT-BIH NSRDB | 同为健康人 RR 序列,但人群偏成年 | 成人段对照,与本库的婴幼儿段互补 |
| 七段记录,最长一天 — MIT-BIH LTDB 长时程心电库 | 同为长时程心电来源 | 它给波形,本库只给间期 |
| 长时程心电记录库 — LTSTDB | 同为长时程,重心在事件标注 | 事件驱动的对照 |
| 三物种的正常窦性心律底本 — PhysioZoo 哺乳动物心电库 | 同为正常窦性心律底本 | 跨物种对照与方法学参照 |
| 静息二十分钟里的衰老曲线 — Autonomic Aging 心肺信号库 | 同为自主神经与年龄主题 | 短时程静息,与本库的 24 小时互补 |
| 心跳摆得比睡着还大 — PhysioNet 冥想心率库 | 同为生理状态下的心率序列 | 状态干预对照 |
| 发作之后心率为何摆动 — 部分性癫痫发作后心率振荡库 | 同为心率动态分析 | 病理事件触发的对照 |
这张表要说清的只有一件事:本库在「年龄下探到婴儿」与「长度做到 24 小时」这两格上站住了位置,其余维度在站内都能找到更专门的替代。
6.2 检索路径
| 你要找的东西 | 检索词 | 会落到哪里 |
|---|---|---|
| 成人健康人的 RR 序列 | nsrdb、normal sinus rhythm |
§6.1 第一行 |
| 长时程原始心电波形 | ltdb、ltstdb、long-term |
§6.1 第二、三行 |
| 正常窦性心律方法学底本 | physiozoo、normal sinus |
§6.1 第四行 |
| 年龄与自主神经 | autonomic aging、心率变异 |
§6.1 第五行 |
| 生理状态干预下的心率 | meditation、heart rate |
§6.1 第六行 |
| 伪差处理与替代数据检验 | artifact、surrogate、TISEAN |
§4.4 与 §9.3 的引用文献 |
6.3 与其他库的分工判据
| 任务 | 主粮仓该用什么 | 本库的位置 | 原因 |
|---|---|---|---|
| 非线性心率变异性方法研究 | 无可替代者之一 | 主力 | 24 小时、伪差已清、无合成值 |
| 婴幼儿心率变异性研究 | 无可替代者之一 | 主力 | 71 名不满一岁者 |
| 健康对照组的搭建 | 视对照人群而定 | 主力之一 | 入组判据明确,可写进方法节 |
| 成人健康人 HRV 参考值 | 成人健康人库 | 辅助 | 成人段样本相对少 |
| R 峰检测算法评测 | 带波形的长时程库 | 不适用 | 无波形 |
| 心律失常类型识别 | 带心搏标注的库 | 不适用 | 无类型标注 |
| 昼夜节律与睡眠分析 | 带时间戳与睡眠标注的多模态库 | 不适用 | 无时间戳 |
| 结局与干预研究 | 临床队列库 | 不适用 | 无随访与终点 |
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
先纠正一个常见误判:把「只有 147 人」当成质量不足。心率变异性研究里,样本量的意义与图像分类完全不同——这里的基本单位不是一个人,而是一条足够长的序列;一条 24 小时记录提供的心搏数量,是几十条五分钟记录的总和。评价它应当问的是:在它想回答的那个问题上,年龄结构与序列长度够不够。答案是够,而且婴幼儿这一段别处没有。
另一方面,147 人做人群层面的统计推断仍然偏少。要做「年龄与某指标的回归曲线」,147 个点分布在 1 个月到 55 岁之间,且近一半挤在一岁以下,曲线的形状会被样本结构强烈影响。这不是缺陷,是使用前必须知道的约束。
7.1 五维评分
| 维度 | 分数 | 理由 |
|---|---|---|
| 数据规模 | 3 | 147 名个体,人数偏少但单条极长,按心搏计并不小 |
| 标注质量 | 3 | 无逐搏标注;伪差处理规范但缺口位置不可复原 |
| 任务适配 | 5 | 长时程非线性分析的婴幼儿底本几乎无可替代 |
| 文档完整 | 5 | 官方把设备、采样率、误差、阈值、判据、伦理都写了 |
| 可获取性 | 5 | CC BY 4.0、免注册、体量小、无需专用软件 |
五项合计 21 分(满分 25)。分数结构是清晰的:文档与获取拉满,任务适配拉满,规模与标注两项被它的形态本身限定。
7.2 质量的两层:定位精度与入组判据
第一层是间期数值准不准。官方给出 RR 间期确定误差约 8 毫秒,说明这是 R 峰定位误差的两倍;写出采样率 128 Hz 也把这个数字约束在同一量级。这一层决定了它不适合亚毫秒级分析。
第二层是人挑得对不对。官方给出五条 Holter 正常判据,并由两名心内科医师复核软件自动检测的结果。这一层相当扎实,是它能当健康对照的根本。
| 用途 | 8 毫秒级误差的影响 | 建议 |
|---|---|---|
| 长程相关与标度指数 | 小,误差在远小于分析尺度的层面上 | 可直接使用 |
| 时域指标(SDNN 等) | 小 | 可直接使用 |
| 频域高频段成分 | 中到大,高频能量对间期抖动敏感 | 需评估后再用 |
| 心率震荡、极短时尺度指标 | 大 | 不适合 |
| 心率变异性作为临床终点 | 取决于效应量 | 需先做误差敏感性分析 |
7.3 已知的、可枚举的偏差
| 偏差 | 表现 | 影响 |
|---|---|---|
| 单一来源 | 全部序列来自同一研究组的同一套设备与软件流程 | 不能当多中心数据用 |
| 年龄结构不均 | 近一半个体不满一岁,成人段偏少 | 不分层的整体分析会被引向婴幼儿 |
| 性别信息不全 | 8 名个体性别不可得 | 性别相关分析需先处理缺失 |
| 记录仪混用 | DMS300-7、DMS300-3A、Galix 三种设备 | 设备间差异未在文件层面标注 |
| 采样率设置不一 | Galix 读入 512/1024 Hz 可选,DMS 侧另有设置 | 分析用写出采样率统一为 128 Hz,但读入环节不一致 |
| 非窦性心搏未剔除 | 判据只限制数量上限,未逐条剔除与标记 | 序列中可能含真实早搏对应的短间期 |
| 缺口不可复原 | 伪差片段被删除且无位置痕迹 | 无法追溯、无法比较不同伪差处理策略 |
| 无时间戳 | 序列不含绝对时间 | 昼夜节律与睡眠相关分析做不了 |
7.4 外部验证矩阵
官方页面列出 7 篇引用文献,其中几篇能看出它的使用方式正在外扩:
| 引用方 | 做法 | 讲得通的地方 | 风险 |
|---|---|---|---|
| 原团队方法学论文 | 用它做非线性特性与年龄效应分析 | 数据即为其研究所生,口径一致 | 结论的自洽性依赖同一批人 |
| 年龄相关的心率变异性综述类研究 | 把它作为从新生儿到成年的数据来源 | 年龄跨度的稀缺性被直接利用 | 需自行处理分层 |
| 恰加斯病心率波动研究 | 把它作为健康对照侧 | 同团队方法学,可比性强 | 病例侧与对照侧的设备一致性需检查 |
| 可穿戴心率指标研究 | 把它作为长时程健康人底本 | 24 小时长度对可穿戴指标有参考价值 | 8 毫秒误差与可穿戴精度不在一个量级 |
| 时延嵌入的形态学方法研究 | 当作长序列的算法测试场 | 序列长、无合成值 | 拼接处不连续需在方法节说明 |
这些引用说明它作为「长时程健康人底本」的身份已经成立,但它作为大规模训练语料的角色从未出现——这既因为它只有 147 条,也因为它没有任何标签可供监督学习。
7.5 它为何能持续
它没有更新,也没有第二个版本,却一直被引用,原因是它占着一个别人不愿再占的坑:招募健康婴幼儿做 24 小时动态心电图,需要伦理审批、儿科配合、家长同意,还要在事后逐搏校正确认心电图正常。这个成本远高于在成年人里发一批记录仪。只要婴幼儿段的健康人心率序列仍然稀缺,它就不会被新库替代。
§8 生态位与历史
8.1 历史沿革
它属于 PhysioNet 数据捐赠里比较晚近的一类:不是 1990 年代到 2000 年代那一批由大型医院与工程中心贡献的信号库,而是 2020 年代由研究组把自己的论文支撑数据整理后共享的成果。这类捐赠的共同特征是目的性极强——数据是为了支撑一组特定方法学结论而采集的,共享时把方法学论文的引用一并挂在页面上。本库的官方页面明确要求额外引用原始论文:Garavaglia、Gulich、Defeo、Thomas Mailland 与 Irurzun 关于年龄对健康人心率变异性影响的那篇 PLoS One 文章。
这也解释了它的形态:不像通用库那样尽量保留原始素材供各种用途,而是只交付处理到可直接分析的状态。
8.2 与挑战赛的关系
它与各类生理信号挑战赛没有关系。官方页面没有列出任何挑战赛关联,也没有提供挑战赛常用的训练集与测试集划分、标签文件或评分脚本。想找带标签、带划分、带基线的竞赛型数据,它不是合适的对象。
8.3 生态位:底本而不是粮仓
| 角色 | 主力粮仓 | 底本 |
|---|---|---|
| 典型用法 | 大规模训练、预训练 | 方法学验证、对照基线、跨人群比较 |
| 需要的前提 | 数据量大、标签细 | 人群定义清晰、采集与处理口径可追溯 |
| 代表库 | 大规模带标签的生理信号库 | 本库、其他小体量健康人底本 |
| 失败模式 | 过拟合、标签噪声累积 | 把 147 条当大样本做人群推断 |
它坐在右边这一列。用它做主力训练语料会立刻遇到样本量问题;用它当底本,则几乎找不到更合适的替代。
8.4 谁在用它,用来做什么
从官方列出的引用文献看,使用者大致分三类:做非线性时间序列方法的研究组(把它当长序列测试场)、做年龄与自主神经发育的研究者(把它当婴幼儿到成年的跨度样本)、做疾病对照的临床研究者(把它当健康侧)。第三类的用法最值得留意——官方自己就建议,这些数据可以作为进行性心率变异性改变类疾病、先天性心脏病等研究的对照组。
§9 使用指引
9.1 三种角色的路径
| 角色 | 第一天 | 第一周 | 注意事项 |
|---|---|---|---|
| 非线性方法研究者 | 读官方使用说明,按 §5.3 读一条序列 | 复述伪差处理口径,做拼接处敏感性分析 | 方法节必须写明序列可能不连续 |
| 儿科与发育研究者 | 按 patient-info.csv 做年龄分层 | 建立婴幼儿组与成人组的对照 | 年龄单位是年且带小数 |
| 临床对照研究者 | 核对五条入组判据是否适用于你的病例侧 | 统一伪差处理与指标口径后再比较 | 设备与人群差异需写进局限 |
9.2 一条最短的可用流程
#-- 1. 取元数据表与一个样例序列
curl -sL https://physionet.org/files/rr-interval-healthy-subjects/1.0.0/patient-info.csv -o patient-info.csv
curl -sL https://physionet.org/files/rr-interval-healthy-subjects/1.0.0/000.txt -o 000.txt
#-- 2. 看一眼元数据表结构与前几行(注意列名带空格)
head -3 patient-info.csv
#-- 3. 全量下载并校验(官方给了 SHA256SUMS.txt)
wget -r -N -c -np https://physionet.org/files/rr-interval-healthy-subjects/1.0.0/
cd physionet.org/files/rr-interval-healthy-subjects/1.0.0 && sha256sum -c SHA256SUMS.txt | grep -v ': OK$'
import pandas as pd
import pathlib
#-- 4. 读元数据并按年龄分层,注意单位是年
meta = pd.read_csv('patient-info.csv').rename(
columns={'File': 'sid', 'Age (years)': 'age', 'Gender': 'sex'})
infant = meta[meta['age'] < 1.0]
#-- 5. 逐个序列文件读入;glob 只取数字开头的文件
seqs = {int(p.stem): [int(x) for x in p.read_text(encoding='ascii').split()]
for p in pathlib.Path('.').glob('[0-9]*.txt')}
#-- 6. 取一名婴幼儿个体的序列,看前几个值
sid = int(infant['sid'].iloc[0])
print(sid, seqs[sid][:6])
9.3 引用方式
| 引用对象 | 内容 |
|---|---|
| 数据集 | Irurzun, I. M., Garavaglia, L., Defeo, M. M., & Thomas Mailland, J. (2021). RR interval time series from healthy subjects (version 1.0.0). PhysioNet. https://doi.org/10.13026/51yd-d219 |
| 原始论文 | Garavaglia L, Gulich D, Defeo MM, Thomas Mailland J, Irurzun IM. The Effect of Age on the Heart Rate Variability of Healthy Subjects. PLoS One |
| 平台 | PhysioNet 平台综述论文,按官方页面 Cite 按钮生成 |
| 许可 | Creative Commons Attribution 4.0 International Public License |
写论文时建议同时注明:使用的版本号(1.0.0)、伪差处理口径(8% 与 20 秒两条门槛、缺口被剪除并拼接)、以及是否按年龄分层。
§10 AI 使用声明
| 项目 | 声明 |
|---|---|
| 文本生成 | 本文由 AI 辅助撰写,编辑把关结构与事实 |
| 数字来源 | 规模、结构、边界三类数字来自 PhysioNet 官方页面与官方文件目录 |
| 文件核验 | patient-info.csv、000.txt、LICENSE.txt、SHA256SUMS.txt 经直接访问确认 |
| 不一致说明 | 官方摘要写年龄下界为 1 个月,数据描述段写 71 名不满一岁,两者不冲突但口径不同,正文已分别标注 |
| 论文信息 | 仅依据官方页面列出的引用文献题录,未读全文 |
| 未核验内容 | 每条序列的具体间期条数与拼接处数量;编号分两段区间的含义;三种记录仪各自覆盖哪些个体;8 名性别不可得个体的具体编号;非窦性心搏在各序列中的实际数量与位置 |
| 图像 | 无配图;封面为生成式提示词,不含真实心电图 |
| 免责 | 本文不构成临床建议;数据使用须遵守 CC BY 4.0 的署名要求 |
常见误读(避坑清单)
| 说法 | 实际 | 证据 |
|---|---|---|
| 「它提供 24 小时原始心电波形」 | 只有 RR 间期数字,没有波形 | 官方数据描述段:文件为含 RR 间期的 .txt |
| 「序列是逐搏连续的」 | 伪差片段被剪除后前后拼接,可能不连续 | 官方使用说明原文 |
| 「它是成年健康人的 RR 库」 | 147 人中 71 人不满一岁,重心在婴幼儿 | 官方数据描述段 |
| 「147 人里男女各占一半」 | 72 男、67 女,另有 8 人性别不可得 | 官方数据描述段 |
| 「数据里没有任何早搏」 | 判据只限制数量上限,少量非窦性心搏未剔除且未标记 | 官方方法段原文 |
| 「RR 间期精确到亚毫秒」 | RR 间期确定误差约 8 毫秒 | 官方方法段原文 |
| 「文件名从 1 连续编到 147」 | 编号分 000–427 与 4000–4123 两段,且不连续 | 官方文件目录 |
| 「它带时间戳,可以做昼夜分析」 | 序列只有间期数值,无绝对时间信息 | 官方文件目录与数据描述段 |
| 「可以拿它训练心律失常分类模型」 | 无心搏类型标注 | 官方页面未列出任何标注文件 |
| 「它的年龄单位是月」 | 单位是年,可带小数 | patient-info.csv 列名为 Age (years) |
| 「根目录全是序列文件」 | 还有 LICENSE.txt 与 SHA256SUMS.txt 两个 .txt | 官方文件目录 |
FAQ
Q1:它到底有没有原始心电波形?
没有。库里只有 RR 间期序列,每个个体一个以编号命名的 ANSI 纯文本文件,一行一个毫秒整数。原始 24 小时 Holter 波形、R 峰位置、伪差片段的位置都没有公开。所以做波形形态分析或 R 峰检测算法评测,用不了它;做心率变异性的序列分析,它反而是省事的——不需要专用库,纯文本即可读。
Q2:序列里的间期是不是严格对应相邻两次心搏?
不一定。官方使用说明写得很清楚:含伪差的片段被整段删除,删除之后缺口前后的两段被简单拼接,因此 RR 间期可能不连续。官方给出的两条门槛是整条序列伪差比例不超过 8%、单个伪差片段不超过 20 秒,用意是把这种不连续控制在不会明显改变序列动力学行为的水平。做依赖严格相邻关系的分析时,这一点必须写进方法节。
Q3:为什么婴幼儿这么多?会不会影响我的人群分析?
147 名个体中有 71 名不满一岁,这是官方数据描述段给出的数字,也是这个库最稀缺的地方。它意味着任何不分层就把全部序列混在一起的分析,得到的实际上是年龄结构混合后的结果,而不是某个生理效应。正确做法是先按 patient-info.csv 的年龄列分层,再在层内做分析;年龄单位是年且带小数,一岁以下的判定请用小于 1.0。
Q4:RR 间期的精度够我用吗?
取决于尺度。官方给出的 RR 间期确定误差约 8 毫秒,并说明这大约是 R 峰定位误差的两倍;分析用信号的写出采样率是 128 Hz,对应的时间分辨率也在个位数毫秒量级。做长程相关、标度指数、时域指标这类尺度远大于毫秒的分析,这个误差基本不影响结论;做频域高频段、心率震荡、极短时尺度指标,误差会直接进入结果,需要先做敏感性分析。
Q5:它能不能给患病人群当健康对照?
可以,这是官方自己建议的用法之一——官方使用说明写到,这些数据来自含儿科受试者的健康人群,可用作心率变异性进行性改变类疾病、先天性心脏病等研究的对照组。但要注意两件事:一是入组判据是五条 Holter 正常标准,你的病例侧的筛选口径要描述清楚;二是设备体系与人群来源都是单一的,对照结论的适用范围要在局限里说明。
术语表
| 术语 | 解释 |
|---|---|
| RR 间期 | 相邻两次心搏 R 峰之间的时间间隔,本库单位为毫秒 |
| 心率变异性(HRV) | 逐搏间期的波动,反映自主神经对窦房结的调节 |
| Holter | 便携式长时程心电监护,本库为 24 小时记录 |
| 自主神经系统 | 交感与副交感两套调节通路,是心率变异性的主要来源 |
| 窦房结 | 心脏的天然起搏点,间期的起点与终点由此定义 |
| 伪差 | 由电极松动、运动、干扰造成的非生理性信号畸变 |
| 长程相关 | 序列在相隔很远的位置之间仍存在的统计依赖 |
| 标度行为 | 统计量随分析尺度变化的规律,通常用指数刻画 |
| 嵌入维数 | 把一维序列重构到多维相空间所需的维数 |
| 替代数据检验 | 用保持线性特征、破坏非线性结构的合成序列做统计对照 |
| 去趋势波动分析 | 估计序列标度指数的常用方法 |
| 时域指标 | 如 SDNN、RMSSD,直接由间期序列的统计量给出 |
| 频域指标 | 由间期序列的功率谱分频段给出 |
| 非窦性心搏 | 起源不在窦房结的心搏,如早搏 |
| 室性早搏 | 心室提前除极,对应一个明显缩短的间期 |
| 传导阻滞 | 传导通路受阻,本库入组判据将其排除 |
| TISEAN | 官方提到的非线性时间序列分析软件包 |
| ANSI 文本 | 本库序列文件的文本编码形式,行尾为回车换行 |
| CC BY 4.0 | 知识共享署名 4.0 国际许可,允许自由使用但须署名 |
| patient-info.csv | 本库唯一的元数据表,含编号、年龄、性别 |
| SHA256SUMS.txt | 官方提供的全部文件校验和清单 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 个体数 | 147 名 | 官方数据描述段 | 官方页面 |
| 男性 | 72 名 | 官方数据描述段 | 官方页面 |
| 女性 | 67 名 | 官方数据描述段 | 官方页面 |
| 性别不可得 | 8 名 | 官方数据描述段 | 官方页面 |
| 不满一岁者 | 71 名 | 官方数据描述段 | 官方页面 |
| 超过 18 岁者 | 10 名 | 官方数据描述段 | 官方页面 |
| 年龄范围 | 1 个月至 55 岁 | 官方摘要段 | 官方页面 |
| 记录时长 | 24 小时 | 官方方法段 | 官方页面 |
| RR 确定误差 | 约 8 毫秒 | 官方方法段 | 官方页面 |
| 伪差比例上限 | 8% | 官方方法段与使用说明 | 官方页面 |
| 伪差片段长度上限 | 20 秒 | 官方方法段与使用说明 | 官方页面 |
| 写出采样率 | 128 Hz | 官方方法段 | 官方页面 |
| 序列文件数 | 147 个 | 官方文件目录 | 官方文件 |
| 元数据表列数 | 3 列(File、Age (years)、Gender) | patient-info.csv | 官方文件 |
| 序列单位 | 毫秒整数,一行一个 | 官方数据描述段与 000.txt | 官方页面与文件 |
| 解压后体量 | 87.9 MB | 官方文件区 | 官方页面 |
| ZIP 包体量 | 16.9 MB | 官方文件区 | 官方页面 |
| 许可 | CC BY 4.0 | 官方许可区 | 官方页面 |
| 版本与发布日 | 1.0.0,2021-08-30 | 官方版本区 | 官方页面 |
| 版本 DOI | 10.13026/51yd-d219 | 官方 DOI 区 | 官方页面 |
附录 B:数字的来源分层
第一层:官方页面与官方文件。 个体数、性别构成、年龄段人数、年龄范围、记录时长、设备与采样率、RR 确定误差、伪差两条门槛、体量、许可、版本与 DOI。这些数字来自项目主页的摘要、方法、数据描述与使用说明四段,以及官方文件目录与 patient-info.csv、000.txt 的直接访问。
第二层:官方给出的文献题录。 关于年龄对心率变异性影响的原始论文、关于标度行为与替代数据的方法学文献,均只取官方页面列出的题录,未读全文。题录只能支撑「这些方法曾被用在这些数据上」,不能支撑具体结论的数值。
第三层:未核实。 每条序列的间期条数与拼接处数量、编号两段区间的含义、三种记录仪与个体的对应关系、8 名性别不可得个体的编号、非窦性心搏在各序列中的数量与位置。这些需要全量下载后逐条统计或与原作者确认,正文中凡是涉及的地方都只做定性表述。
附录 C:完整参考文献
| 编号 | 文献 | 链接 | 用途 |
|---|---|---|---|
| 1 | RR interval time series from healthy subjects v1.0.0 | https://physionet.org/content/rr-interval-healthy-subjects/1.0.0/ | 全部规模、结构、边界数据的来源 |
| 2 | 该库的官方文件目录 | https://physionet.org/files/rr-interval-healthy-subjects/1.0.0/ | 文件命名、patient-info.csv、校验和清单 |
| 3 | Garavaglia L, Gulich D, Defeo MM, Thomas Mailland J, Irurzun IM. The Effect of Age on the Heart Rate Variability of Healthy Subjects. PLoS One | 由官方页面 Cite 区列出 | 原始论文与引用要求 |
| 4 | Irurzun IM, Defeo MM, Garavaglia L, Thomas Mailland J, Mola EE. Scaling behavior in the heart rate variability characteristics with age | 官方参考文献 5 | 标度行为方法的出处 |
| 5 | Andrés DS, Irurzun IM, Mitelman J, Mola EE. Increase in the embedding dimension in the heart rate variability | 官方参考文献 1 | 嵌入维数方法的出处 |
| 6 | Goldberger A 等. PhysioBank, PhysioToolkit, and PhysioNet | https://doi.org/10.1161/01.cir.101.23.e215 | 平台背景 |
| 7 | Hegger R, Kantz H, Schreiber T. Practical implementation of nonlinear time series methods: The TISEAN package | 官方参考文献 14 | 官方提到的分析工具 |
附录 D:任务代码
任务一:按年龄分层读取并核对
import pandas as pd
import pathlib
#-- 元数据:列名带空格,重命名后再用
meta = pd.read_csv('patient-info.csv').rename(
columns={'File': 'sid', 'Age (years)': 'age', 'Gender': 'sex'})
#-- 只取数字开头的序列文件,避开 LICENSE.txt 与 SHA256SUMS.txt
seqs = {}
for p in pathlib.Path('.').glob('[0-9]*.txt'):
seqs[int(p.stem)] = [int(x) for x in p.read_text(encoding='ascii').split()]
#-- 按官方给出的两个年龄切点分组
infant = meta.loc[meta['age'] < 1.0, 'sid'].tolist()
adult = meta.loc[meta['age'] > 18.0, 'sid'].tolist()
for sid in infant[:3]:
print('infant', sid, meta.loc[meta['sid'] == sid, 'age'].item(), seqs[sid][:5])
任务二:从 RR 间期算一组最基础的指标
import numpy as np
rr = np.array(seqs[infant[0]], dtype=float) #-- 单位毫秒
#-- 时域:均值间期、SDNN、RMSSD
print('mean NN', rr.mean())
print('SDNN ', rr.std(ddof=1))
print('RMSSD ', np.sqrt(np.mean(np.diff(rr) ** 2)))
#-- 提醒:拼接处的差分会混入非生理跳变,做逐差类指标前先想清楚
d = np.diff(rr)
print('diff 的绝对值上限', np.abs(d).max())
第二段最后一行不是统计结论,而是给使用者一个自检手段:如果差分里出现远大于生理范围的跳变,那很可能落在拼接处附近。
附录 E:如果只记五件事
| 序号 | 记住什么 | 为什么 |
|---|---|---|
| 1 | 147 名健康志愿者,年龄 1 个月至 55 岁,其中 71 名不满一岁 | 年龄结构是它一切用法的前提 |
| 2 | 只有 RR 间期,没有波形、没有标注、没有时间戳 | 决定了它能做什么与不能做什么 |
| 3 | 伪差比例上限 8%、片段上限 20 秒,缺口被剪除并拼接 | 序列可能不连续,必须写进方法节 |
| 4 | RR 间期确定误差约 8 毫秒 | 亚毫秒级分析不适用 |
| 5 | CC BY 4.0、免注册、纯文本、无需专用库 | 门槛极低,十几分钟能跑通第一条序列 |
编辑说明
本文的核验时间为 2026 年 10 月 29 日。核对方式为直接访问 PhysioNet 项目页与官方文件目录,逐一确认 patient-info.csv、000.txt、LICENSE.txt、SHA256SUMS.txt 的可访问性与内容;论文侧只取官方页面列出的题录,未读全文。官方摘要写年龄下界为 1 个月、数据描述段写 71 名不满一岁,两处口径不同但不冲突,正文分别标注来源。未覆盖的内容包括:每条序列的间期条数与拼接处数量、编号两段区间的含义、三种记录仪与个体的对应关系、8 名性别不可得个体的编号、非窦性心搏的实际数量与位置。这些需要全量下载后逐条统计或与原作者确认,本文按要求只写规模、结构、边界三类数字。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- nsrdb — 共享标签:生理信号 / 心电信号 / 心率变异性 / 健康人群
- ltdb — 共享标签:生理信号 / 心电信号 / 心率变异性 / 健康人群
- ltstdb — 共享标签:生理信号 / 心电信号 / 心率变异性 / 健康人群
- physiozoo — 共享标签:生理信号 / 心电信号 / 心率变异性 / 健康人群
- autonomic-aging-cardiovascular — 共享标签:生理信号 / 心电信号 / 心率变异性 / 健康人群
- meditation — 共享标签:生理信号 / 心电信号 / 心率变异性
- szdb — 共享标签:生理信号 / 心电信号 / 心率变异性
- ecgiddb — 共享标签:生理信号 / 心电信号 / 健康人群
- shareedb — 共享标签:生理信号 / 心电信号 / 健康人群
- ecg-arrhythmia — 共享标签:生理信号 / 心电信号
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。
