信息速览
一九九九年,波士顿的一间实验室里,一位禅修者静坐了约一小时。事后把那一小时的心跳画成曲线,胸口的位置在五秒之内上下摆过三十多次。同一批研究者手上还有另外四组人的心跳:睡着的、按节拍器呼吸的、赛前休息的铁人三项选手,以及这些禅修者冥想之前的那一段。
这个库就是那篇论文背后的原始逐搏序列。它不提供心电波形,只提供每一次心搏发生的时刻,和由相邻两次心搏间隔换算出的瞬时心率。五组人被放进同一个出版单元,构成了一个少见的、把「冥想」与三种非冥想状态并列比较的公开样本。
以下按官方页面、平台文件与论文正文三处口径,把这个库的边界讲清楚:它记录了什么、结构如何、在什么条件下会给出错误结论。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 全名 | Heart Rate Oscillations during Meditation |
| 托管平台 | PhysioNet,版本 1.0.0 |
| 首次发布 | 2000 年 10 月 13 日 |
| DOI | 10.13026/C2B880 |
| 平台署名 | Chung-Kang Peng(贝斯以色列女执事医疗中心) |
| 原始论文 | Peng 等,International Journal of Cardiology,1999 年第 70 卷,101 至 107 页 |
| 分组 | 五组:禅修 8 人、昆达里尼瑜伽 4 人、睡眠 11 人、节律呼吸 14 人、铁人三项 9 人 |
| 受试者 | 46 人(按组相加,官方未给总数) |
| 记录数 | 58 段(RECORDS 清单逐行列出) |
| 模态 | 逐搏心率序列,由 Holter 心电派生 |
| 原始波形 | 不含,头文件声明零路信号 |
| 时间基准 | 注释 128 赫兹;文本为首列秒、次列次/分 |
| 单段时长 | 10 分钟至 6 小时不等 |
| 体积 | 8.7 兆字节(ZIP 8.8 兆字节) |
| 许可 | ODC-BY 1.0,免注册 |
| 缺什么 | 心电波形、呼吸通道、冥想起止事件标记 |
§1 它要解决的具体麻烦
1.1 想证明「冥想改变了心跳」,先得排除四种别的解释
冥想研究中有一个反复出现的困境:你想说冥想让心跳变得不一样,但任何一次测量都同时包含四种可能。人坐着不动,心率本来就会降;呼吸放慢,心率本来就会跟着摆;体能好的人,静息心率本来就更稳;而一个人在自己家里冥想,和躺在实验室里被人盯着,本来就不是一回事。
要拆开这四种解释,最直接的办法是同一个人前后配对,再加几组不同状态的外部对照。这个库的价值不在于样本量大,而在于它把这五组放进了同一个出版单元,让「冥想」这个词有了可比的邻居。
这四层可以逐个拆。冥想前的那一小时是第一道:同一副电极、同一天、同一个人,唯一的变量是有没有在冥想。按节拍器呼吸的十四人是第二道:如果只是呼吸变慢,他们也应该出现同样的摆动。夜间睡眠的十一名受试者是第三道:如果只是休息,睡够六小时的人也该如此。赛前休息的九名铁人三项选手是第四道:如果只是体能好,训练有素的心脏应该表现得更夸张。四道对照各堵一条替代解释,缺一条,结论就松一分。
这也解释了为什么库里有三个看起来与冥想无关的组。它们不是陪衬,是把「冥想」从「休息」「慢呼吸」「体能」里切出来的手术刀。
1.2 三条常见的错误期待
第一条,期待它是一份心电波形库。 库名里没有 ECG 字样,但很多人看到「心率」就默认里面有波形。实际的头文件只有一行,形如 C1med 0 128 0,第一个数字是信号路数,写的是零。也就是说,波形在源头就被折算掉了,留下的只有每一次心搏的位置。
第二条,期待它标注了冥想的起止时刻。 论文里确实写了「冥想开始与结束用事件标记划分」,瑜伽组连各子阶段都做了标记。但公开发布时,冥想期与冥想前期被切成了两个文件,区别体现在文件名后缀上,注释文件里读不到一个「冥想开始」的标记。
第三条,期待它是「冥想者与普通人」的两组对照。 库里的三个对照组不是「不冥想的人」,而是「睡着的人」「按节拍器呼吸的人」「赛前休息的运动员」。他们代表三种特定的生理状态,不是一般人群的代表样本。
| 常见预设 | 库里的实际情况 | 会造成的后果 |
|---|---|---|
| 里面有心电波形 | 头文件声明零路信号 | 按波形格式写的读取代码第一步就报错 |
| 有冥想开始时间戳 | 只有 pre 与 med 两个文件名后缀 | 找「冥想第 10 分钟」时会找不到锚点 |
| 对照组是普通健康人 | 睡眠、节律呼吸、赛前运动员 | 把结论外推到「冥想者优于常人」会过度 |
| 记录从第 0 秒开始 | 首列是 Holter 开机起的累计秒 | 直接画图会得到一条右侧挤扁的曲线 |
| 是一个大脑成像数据集 | 没有任何中枢信号 | 与脑电、功能磁共振类冥想数据完全不可互换 |
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 逐搏心率与 RR 间期 | 五十八段原始时间戳与瞬时心率 | 够,这是全部内容 |
| 冥想前后的同人配对 | 禅修与瑜伽各有一套 pre/med | 够,配对设计干净 |
| 与慢呼吸的对照 | 十四人固定 0.25 赫兹呼吸 | 够,是论文最锋利的一刀 |
| 与睡眠状态的对照 | 十一人整夜自由呼吸 | 够,但人群与体位都不同 |
| 心电形态、QRS 宽度、T 波 | 无波形 | 不够,一点都不给 |
| 呼吸频率与潮气量 | 无呼吸通道 | 不够,论文用的是推算值 |
| 冥想的具体起止分钟 | 只有文件级切分 | 勉强,只能整段处理 |
| 大样本组间统计 | 两个冥想组分别八人与四人 | 不够,功效很低 |
| 纵向追踪、多次随访 | 每人只有一次 | 不够 |
| 冥想类型之间的直接比较 | 两组都做了,但人数悬殊 | 勉强,只能描述不能检验 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 你要做一个心率变异性分析的练手项目,手头没有数据 | 五十八段格式极简的两列文本,十分钟能跑通 | 从 metron 组入手,十段十分钟记录最容易对齐(§5.2) |
| 你在读自主神经与冥想的文献,想核对原文数字 | 论文与本库同源,可逐段复算幅度 | 先看 §4.3 的案例,确认时间轴口径再动手 |
| 你要给「慢呼吸」找一个非冥想对照 | 十四人固定频率呼吸,是最贴近的对照 | 直接把它当作呼吸性窦性心律不齐的参照组 |
| 你要做睡眠期心率变异性基线 | 十一人整夜记录,时长足够 | 先按 §5.4 重零,再决定切窗长度 |
| 你想训练一个「冥想状态」分类器 | 两组各八段与四段配对样本 | 必须按受试者留一,报告诚实的基线 |
| 你的课题要求原始心电信号 | 只给注释与派生心率 | 换库,另找带波形的冥想或静息记录 |
| 你要研究呼吸与心率的耦合 | 无呼吸通道,只有心率一侧 | 只能做单侧分析,或另配合并呼吸记录的库 |
| 你在教学,要讲清楚 RR 间期怎么变成瞬时心率 | 两列文本把换算过程摆得很明白 | 用一段十分钟记录现场演示,学生一次就懂 |
1.5 一句话判断
它不证明冥想有益,只证明一件事:在两种传统冥想中,心跳可以在几秒内摆过每分钟三十次,而睡着的运动员做不到这一点。
1.6 不适合谁:四条边界
不适合拿它做「冥想者与常人」的群体推论。 八名禅修者是研究生与博士后,练习仅一到三个月;四名瑜伽练习者被描述为进阶水平,年龄跨度从二十岁到五十二岁。这十二个人不是冥想人群的代表样本,三个对照组也不是普通人群的代表样本。任何「冥想者比一般人如何」的结论,都超出了这批数据的构造。
不适合拿它做心电信号处理。 库里没有波形。滤波、基线漂移校正、QRS 检测算法评测、导联脱落检测,这些题目需要采样点,而这里一个采样点都没有。头文件声明零路信号这件事,是硬边界,不是文档遗漏。
不适合拿它做呼吸生理的定量研究。 论文用了心电派生呼吸的技术推算呼吸频率与相对幅度,但那条推算出来的呼吸曲线没有随库发布。只有心率一侧,无法分离「呼吸变慢」与「心率对呼吸的敏感度变高」。
不适合拿它做临床或老年人群的判断。 受试者是健康成人,年龄上限五十五岁,没有任何疾病分组。关于高血压、心衰、糖尿病自主神经病变的推论,需要另找带病人的库。
§2 数据构成与规格
2.1 五个子目录、三类文件、两套命名
整个库的组织方式很老派:一个组一个子目录,文本文件按组放,注释与头文件统一放在 data/ 根下。文本文件带内容,注释文件带位置,头文件带说明,三者同名不同后缀或不同写法。
| 目录 | 组 | 受试者 | 命名式 |
|---|---|---|---|
| data/chi | 禅修 | C1 至 C8,八人 | C1.pre、C1.med |
| data/yoga | 昆达里尼瑜伽 | Y1 至 Y4,四人 | Y1.pre、Y1.med |
| data/normal | 睡眠自由呼吸 | N1 至 N11,十一人 | N1 |
| data/metron | 节律呼吸 | M1 至 M14,十四人 | M1 |
| data/ironman | 赛前睡眠 | I1 至 I9,九人 | I1 |
| data/(根) | 全部 | 五十八组注释 | C1med.hea、N1.qrs |
命名上有一处必须提前知道:冥想两组的文本文件用点号分隔(C1.med),而对应的注释与头文件把点号去掉(C1med.qrs)。三个对照组的两种写法一致,都是 N1。写脚本时若用同一个字符串去拼两类路径,冥想组一定会拼错。
三类文件各管一件事。文本文件是给人看的,两列数字,一行一次心搏;注释文件是给程序看的,二进制,标出每次心搏落在第几格;头文件是给解析器看的,只有一行,说明这条记录有几路信号、时间基准是多少。三者同名,但冥想组的文本带点号、注释不带。记录清单 RECORDS 是遍历入口,注释者说明 ANNOTATORS 是一行免责——它写的是自动检测器产出、未审核。
#-- 先看清目录形状:五组各一个子目录,注释与头文件在根下
cd meditation/1.0.0
ls data
wc -l data/RECORDS
#-- 冥想组的文本用点号,注释文件不带点号
ls data/chi | head -4
cat data/C1med.hea
这段跑完会看到两件事:RECORDS 是五十八行,C1med.hea 只有一行十五个字节。后者是理解整个库的关键——头文件里没有信号描述段,因为根本没有信号。
2.2 字段与记录的完整字典
文本文件的字段只有两个,但每一个都有容易踩的口径问题。
| 列 | 取值示例 | 说明 |
|---|---|---|
| 第 1 列 | 19149.633 | 自 Holter 开机起累计的秒数,不是从零开始 |
| 第 2 列 | 64.5161 | 该次心搏的瞬时心率,单位次每分 |
| 分隔符 | 一个空格 | 节律呼吸组用制表符,按任意空白处理 |
| 行数 | 与心搏数相等 | 一行对应一次心搏,不做重采样 |
第二列的六位小数不是精度,是换算痕迹。60 除以 0.93 秒得 64.5161,分母是毫秒级的 RR 间期,所以小数位再多,分辨率仍然停在一毫秒。把它当成六位有效数字去算方差,会得到虚假的精细度。
头文件只有一行,四个字段按顺序是记录名、信号路数、采样率、采样点数。C1med 这条记录读作:名字叫 C1med,零路信号,时间基准 128 赫兹,零个采样点。第三个字段常被误当成心电采样率,它其实是注释的时间分辨率,一格约 7.8 毫秒。心电原始采样率是多少,库里查不到,因为波形不在库里。第四个数为零,意味着没有任何数据段可读,任何按「采样点数乘以路数」估算文件大小的公式在这里都给出零。
注释文件是 WFDB 的二进制格式,一个心搏两字节,时间以 128 赫兹为格。官方在 ANNOTATORS 里写得很直白:qrs unaudited beat annotations from an automated detector,即自动检测器产出、未审核。这句话与论文里「注释经人工核验」的表述并存,两个口径都在平台上,平台没有解释差异。
| 项 | 内容 |
|---|---|
| 格式 | WFDB 二进制注释,MIT 传统格式 |
| 时间基准 | 128 赫兹,一格约 7.8 毫秒 |
| 注释者声明 | 自动检测器产出,未审核 |
| 注释内容 | 心搏位置,官方称全部标为正常 |
| 异常搏动 | 官方提示可能存在少量异常搏动 |
| 事件标记 | 官方未说明保留冥想起止标记 |
| 与文本的关系 | 文本可由注释经 ihr 程序重建,两者应一致 |
2.3 一条记录的完整解剖
以 C1 的冥想段为例,从库到一次心搏,一共五层。每一层都能单独取出来看,也都有人在这一层上出错。
#-- 逐层解剖一段记录:注释、时间基准、心搏数
import wfdb
ann = wfdb.rdann("data/C1med", "qrs")
print("注释条数", len(ann.sample))
print("时间基准", ann.fs)
print("首个样本", ann.sample[0])
print("末个样本", ann.sample[-1])
print("符号种类", set(ann.symbol))
#-- 样本号除以时间基准即秒,可换算成首行的时间戳
print("首搏秒", ann.sample[0] / ann.fs)
跑完会看到注释条数与文本行数一致,符号集合只有一个元素,即「正常心搏」。这条记录的首搏落在一万九千一百四十九秒附近,与文本首行的时间戳对得上——两者本来就是同一份数据的两种表示。
五层结构一层比一层细。库分五组,组就是目录;一个人可能贡献一段或两段,禅修与瑜伽两组是两段,其余三组是一段;一段记录由几千到几万次心搏组成;每一次心搏在注释里占两个字节,在文本里占一行。层级之间没有交叉索引文件,靠命名约定连接:目录名给组,字母给受试者,后缀给前后。理解这一点,不需要任何元数据表也能把五十八段还原成一张受试者名单。
还有一处要留意:第一个注释不一定是记录的第一次心搏。平台自己说明,这些记录前面通常有一段很长的无注释区间,禅修组尤其明显——佩戴十小时,注释只覆盖冥想前后的两段。文本的行密度因此不等于记录的完整程度,用行数乘以平均 RR 去估算佩戴时长会严重低估。要判断一段记录覆盖了多长时间,只能看首末两行的时间戳。
2.4 各组的时长、体位与时间轴
官方对时长的描述只在页面正文里,按组给,不给汇总。体位与状态也只在页面或论文里出现,文件本身不携带这些信息。
| 组 | 记录数 | 官方时长 | 体位与状态 |
|---|---|---|---|
| chi | 十六 | 每段约一小时 | 静坐,听录音引导 |
| yoga | 八 | 十七至四十七分钟 | 盘坐,呼吸与唱诵 |
| normal | 十一 | 六小时(N3 为 4.6 小时) | 夜间睡眠,自由呼吸 |
| metron | 十四 | 十分钟 | 仰卧,0.25 赫兹节拍呼吸 |
| ironman | 九 | 一至一点七小时 | 赛前睡眠 |
时间轴是这批数据最容易被误读的一处。第一列的零点不在冥想开始,也不在入睡,而在记录仪开机的那一刻。禅修组戴了约十小时,所以文本的第一行就落在五小时附近;节律呼吸组只录十分钟,第一行就接近零。
| 记录 | 首行秒 | 首末跨度 | 落在佩戴期的位置 |
|---|---|---|---|
| C1.pre | 15552.672 | 约五十八分钟 | 约四小时十九分起 |
| C1.med | 19149.633 | 约五十五分钟 | 约五小时十九分起 |
| M1 | 1.116 | 约十分钟 | 从开机起 |
| N1 | 57363.008 | 约四小时十四分 | 约十五小时五十六分起 |
| I1 | 32402.195 | 约一小时三十九分 | 约九小时起 |
最后一行值得多看一眼:N1 的首末跨度只有四小时十四分,而官方写六小时。差额不是矛盾,而是口径不同——文本覆盖的是「有注释的区间」,官方写的是「记录时长」,页面自己也提示这些记录前面通常有一段很长的无注释区间。把跨度当成总时长去算总心搏数,会低估。
2.5 与同类资源的字段差异
| 维度 | 本库 | 心电波形库(如 ecg-arrhythmia) | 睡眠多导库(如 isruc-sleep) |
|---|---|---|---|
| 最小单位 | 一次心搏 | 一个采样点 | 一个采样点,多通道 |
| 是否含波形 | 否 | 是 | 是 |
| 是否含呼吸 | 否 | 否 | 通常含气流或胸腹带 |
| 时间轴 | 绝对秒,起点非零 | 采样点序号 | 采样点序号,按时段 |
| 标签粒度 | 段级(组别与前后) | 搏动级、节律级 | 三十秒 epoch |
| 体积量级 | 十兆字节 | 百兆至千兆字节 | 百兆至千兆字节 |
| 典型用途 | 心率振荡与自主神经 | 检测算法与节律分类 | 睡眠分期 |
这张表说明它的定位:在心电类资源的谱系里,它站在最轻的一端——把几十兆的波形压成几兆的逐搏序列,换来的是一次能看完整组、能在笔记本上跑完全部记录的便利,代价是所有与形态有关的问题都做不了。
§3 三个身份:它是什么、不是什么、像什么
3.1 它报告的是心跳的节律,不是心脏的电活动
心跳有两个可测的面:电活动与机械结果。心电记录的是电,逐搏序列记录的是机械结果的时间间隔。这个库只保留后者,且只保留到「每一次搏动发生在第几秒」这一层。
| 说法 | 判断与依据 |
|---|---|
| 逐搏心率序列库 | 成立,文本两列即累计秒与瞬时心率 |
| 心电波形库 | 不成立,头文件声明零路信号 |
| 呼吸信号库 | 不成立,无呼吸通道,论文用的是推算值 |
| 冥想者与常人对照库 | 部分成立,对照组是睡眠、节律呼吸与赛前运动员 |
| 冥想前后配对库 | 成立,限两组,禅修八对与瑜伽四对 |
| 中枢神经影像库 | 不成立,没有任何脑源信号 |
3.2 五组人的分工
五组不是并列的五个数据集,而是一个比较设计里的五个位置。两个处理组、三个对照组,其中睡眠组还兼任「夜间基线」,节律呼吸组兼任「慢呼吸基线」。
| 组 | 人数 | 角色 | 记录段数 |
|---|---|---|---|
| chi | 8 | 处理组一,冥想前后各一段 | 十六 |
| yoga | 4 | 处理组二,冥想前后各一段 | 八 |
| normal | 11 | 对照一,夜间自由呼吸 | 十一 |
| metron | 14 | 对照二,固定频率慢呼吸 | 十四 |
| ironman | 9 | 对照三,赛前睡眠 | 九 |
统计上,论文对组内前后用配对 t 检验,对组间用独立样本 t 检验,显著性水平定在双侧 0.01。因为两个冥想组各自人数太少,作者把它们合并成十二人再与对照组比较。这个合并有代价:合并之后,禅修与瑜伽之间的差异失去检验的可能,只能分别描述。要复算,必须沿用同一套聚合方式,否则得到的数字与论文不可比。
3.3 两种法门:一个初学,一个进阶
两组冥想不是同一种实践的两个变体,而是两套来源不同的方法。把它们放在一起,是为了说明现象不只出现在一种传统里。
| 项 | 禅修(Chi / Qigong) | 昆达里尼瑜伽 |
|---|---|---|
| 师承 | Xin Yan 所传 | Yogi Bhajan 所传 |
| 练习资历 | 初学,多数为一至三个月 | 进阶水平 |
| 身份 | 研究生与博士后 | 论文未写 |
| 年龄 | 二十六至三十五岁,均值二十九 | 二十至五十二岁,均值三十三 |
| 性别 | 女五男三 | 女二男二 |
| 佩戴时长 | 约十小时 | 约一个半小时 |
| 基线 | 冥想前一小时的自发状态 | 十五分钟安静呼吸 |
| 姿势 | 静坐,听录音引导 | 盘坐 |
| 内容 | 随呼吸观想腹中莲花开合 | 呼吸与唱诵的序列练习 |
| 事件标记 | 起止有标记 | 各子阶段有标记 |
两组的基线长度差了四倍,这会直接影响「冥想前」这一段的性质:禅修组的 pre 是日常活动中的一小时,瑜伽组的 pre 是实验室内十五分钟的安静坐姿。前者包含走动、说话、进食后的代谢变化,后者更接近标准的静息态。
3.4 它与「冥想数据集」这个词的距离
公开数据里被称作冥想数据集的,多数是脑电或功能磁共振。前者看频段功率与事件相关电位,后者看网络连接与区域激活,两者都以中枢信号为对象。这个库站在另一条线上:它看的是自主神经对心脏的调节,测量对象是心搏间隔。同一批受试者、同一个词,落到的器官完全不同。检索时把两者混为一谈,会得到大量看似相关、实际无法合并的结果。
所以它的正确位置是「冥想研究里的自主神经分支」,而不是「冥想研究的总入口」。把两者混为一谈,是检索阶段最常见的错配。
§4 质量与特色
4.1 人工核验与自动检测:两个并存的注释口径
同一个平台上,两处文字对注释的来历说法不同。论文方法部分写的是磁带经扫描后「注释经人工核验」;而库目录下的 ANNOTATORS 文件写的是「自动检测器产出、未审核」。两句话都不算错,但指向两种不同的可信度。
| 环节 | 论文口径 | 平台文件口径 | 差额 |
|---|---|---|---|
| 注释产生 | Marquette 8000T 扫描后人工核验 | 自动检测器产出 | 人工核验是否覆盖全库,未说明 |
| 异常搏动 | 未单独讨论 | 提示可能存在少量 | 数量未给 |
| 离群值处理 | 每段剔除不足百分之一 | 未说明剔除规则 | 剔除前后的对照不可得 |
| 时间基准 | 未写 | 头文件 128 赫兹 | 只能从文件读出 |
对这个差异的处理方式很简单:把它当成两个都成立的说法,不去判断谁对。需要高可信标注的课题,应按「可能含少量未纠正的错误搏动」来设计鲁棒性检验;只做组间幅度比较的课题,这个差异影响很小,因为少数误检不会改变分钟级的振荡包络。
影响可以粗估。一段一小时的记录约有四千次心搏,若自动检测的误检率在千分之一量级,也就四五次;四五次错误的间期被剔除或保留,对分钟级包络几乎没有影响,但对单次 RR 的极值统计有影响。做极值、做熵、做分形维数的人要比做包络的人更在意这个差异。
4.2 现象本身:低频段的大摆
论文报告的核心是幅度,不是均值。观察集中在两处:频段落在哪里,摆幅能有多大。两者都只对部分受试者成立,也都需要与对照比才有意义。
论文报告的频段是 0.025 至 0.35 赫兹,大致覆盖文献里常用的低频与高频两段,但不完全等同:低频通常算 0.04 至 0.15,高频算 0.15 至 0.4,两段相加略宽于本研究关心的区间。作者自己在讨论里提醒,本研究的傅里叶功率只能近似地与别处的低频加高频之和相比。幅度上的标志性数字是五秒内三十至三十五次每分的摆动,出现在部分受试者身上,不是全组共性。频谱上的单例是另一名禅修者约 0.05 赫兹的峰。至于摆动是否由呼吸驱动,论文用心率与心电派生呼吸信号的相干给出了肯定回答,但那条呼吸曲线没有随库发布。
论文表一给出的组均值以图版形式印在 PDF 里,网页正文没有列出具体数值。本词条不转述未在网页出现的数字,只保留方向性结论。
4.3 案例:C1 的两段
C1 是禅修组的第一人。他戴了约十小时记录仪,在第五小时前后冥想了一小时,公开的数据被切成两段:C1.pre 与 C1.med。把两段并排看,能一次看清这个库四个最容易出错的地方。
| 项 | C1.pre | C1.med |
|---|---|---|
| 首行秒 | 15552.672 | 19149.633 |
| 末行秒 | 19043.117 | 22475.391 |
| 首末跨度 | 约五十八分钟 | 约五十五分钟 |
| 文本行数 | 4049 | 4034 |
| 首位小数 | 64.5161 对应 0.93 秒 | 同上,换算规则一致 |
| 末行心率 | 约六十七次每分 | 约八十七次每分 |
第一处,两段的起点都不在零。pre 从四小时十九分起,med 从五小时十九分起,中间隔着一百零六秒的空档。第二处,两段的跨度都不是整一小时,官方写「约一小时」,实际五十八与五十五分钟,用整一小时去算总心搏数会偏。第三处,两段的行数几乎相等,但这不代表心率相同,只代表心搏数接近。第四处,med 段末尾的心率在往上走,末四行的值从八十四一路升到九十,这是冥想结束、人开始活动的痕迹。
#-- 把 C1 的两段并排看:起点、跨度、行数
import pandas as pd
for tag in ("pre", "med"):
d = pd.read_csv(f"data/chi/C1.{tag}", sep=r"\s+", header=None,
names=["t", "hr"])
print(tag, len(d), round(d.t.iloc[0], 1),
round((d.t.iloc[-1] - d.t.iloc[0]) / 60, 1))
如果只记一件事,记这个:C1.med 的第一行是一万九千一百四十九秒。所有把首列当相对时间直接画图的代码,都会得到一条挤在右侧、左边空出五个多小时的曲线。
4.4 三组对照为什么值钱
单看冥想组,任何幅度上的异常都可以被解释成「这个人本来就波动大」「他刚才爬了楼」「他紧张」。
三组对照各自堵住一条解释,也各自带着局限。睡眠组排除「夜间心率天然就慢」,但睡眠的体位与自主神经状态与静坐冥想不同;节律呼吸组排除「呼吸一慢心率就摆」,但固定频率不等于冥想时的自然慢呼吸;运动员组排除「体能好所以摆得大」,但赛前焦虑可能压低也可能抬高变异性。第四条路是冥想前同人配对,它排除「这个人本来就如此」,代价是前一段可能已含期待效应。
§4.3 的案例正好说明配对的用处:C1 的两段是同一副电极、同一天、同一个人的连续记录,唯一的差别是有没有在冥想。这个设计比任何跨人比较都干净,代价是每人只能贡献一对样本。
4.5 缺失的三样东西
| 缺项 | 后果 | 能否从现有文件恢复 |
|---|---|---|
| 心电波形 | 形态学、滤波、检测算法类研究全部做不了 | 不能 |
| 呼吸通道 | 无法分离呼吸驱动与心率敏感性 | 不能,只能用心率反推 |
| 冥想起止事件 | 无法定位冥想内的分钟级变化 | 部分,可按文件边界近似 |
第三项常被忽略:没有分钟级的起止标记,意味着「冥想第十分钟心率如何」这个问题在库内无解。只能把整段当成一个状态,或用滑动窗自行探索。§4.3 的案例把这一点摆得很清楚:pre 与 med 之间隔着一百零六秒,那段空档里发生的事,库里没有记录。这是从「有事件标记的原始记录」到「公开发布的两段文件」之间丢掉的信息。
§5 取数路径
5.1 三条下载路径
| 路径 | 入口 | 体积 | 适合谁 |
|---|---|---|---|
| 整包 ZIP | 项目页的下载按钮 | 8.8 兆字节 | 一次拿全,离线分析 |
| 逐文件 | files 目录,按目录浏览 | 8.7 兆字节未压缩 | 只要某一组 |
| 代码内取数 | wfdb 的数据库下载函数 | 按需 | 脚本化、可复现 |
三条路径拿到的内容一致。平台上另有一份校验和清单,生成于二〇一九年,覆盖库内主要文件,可用于确认下载完整。
#-- 用 wfdb 自带的下载器取整库,落到本地目录
python3.11 -c "import wfdb; wfdb.dl_database('meditation', dl_dir='meditation')"
#-- 确认记录清单与目录都在
ls meditation/meditation/1.0.0/data
wc -l meditation/meditation/1.0.0/data/RECORDS
5.2 按记录遍历注释
注释文件是取数最稳的入口:它是二进制、带时间基准、与文本一一对应,不会因为分隔符问题读错列。
#-- 遍历 RECORDS 里的全部记录,只读注释长度与末搏时刻
import wfdb
names = open("data/RECORDS").read().split()
for name in names:
ann = wfdb.rdann("data/" + name, "qrs")
minutes = ann.sample[-1] / ann.fs / 60
print(name, len(ann.sample), round(minutes, 1))
注释文件小到可以整段读进内存:最大的一份约五十千字节,五十八份加起来不到两兆。这意味着不必设计流式读取,一次遍历全部记录在普通笔记本上不到一秒。真正的成本在后面的信号处理,不在取数。
注意路径拼接:RECORDS 里的名字是 C1med 这种不带点号的写法,与 data/ 根下的文件名一致;文本文件才带点号并放在组子目录里。想同时读两套表示,得做一次名字映射。
| 你想读的 | 正确路径 | 常见错误路径 |
|---|---|---|
| C1 冥想段注释 | data/C1med.qrs | data/chi/C1.med.qrs |
| C1 冥想段文本 | data/chi/C1.med | data/C1med.txt |
| N1 注释 | data/N1.qrs | data/normal/N1.qrs |
| N1 文本 | data/normal/N1 | data/N1 |
5.3 直接读文本:分隔符与小数
文本文件是给人看的,格式上并不严格统一,读之前先确认分隔符。
#-- 文本两列,分隔符按任意空白处理;metron 组实际用制表符
import pandas as pd
df = pd.read_csv("data/metron/M1", sep=r"\s+", header=None,
names=["t", "hr"])
print(df.head())
print(df.shape, df.t.min(), df.t.max())
两列数据的宽度并不统一:多数文件用单个空格对齐,节律呼吸组用制表符,按固定列宽解析会错位,写死单空格又会让节律呼吸组读出多列空值。按任意空白切分是唯一稳妥的读法,读进来之后再核对行数是否与注释条数相等。
5.4 重零与切窗
使用前必须做一步换算:把首列减掉首行的值。之后才谈得上按分钟切窗、按事件对齐。§4.3 的案例里,两段的起点相差三千五百九十七秒,不减首行就无法对齐。
#-- 把绝对秒换成相对秒,并按分钟聚合
import pandas as pd
def load(path):
d = pd.read_csv(path, sep=r"\s+", header=None, names=["t", "hr"])
d["t"] = d["t"] - d["t"].iloc[0]
return d
d = load("data/chi/C1.med")
d["minute"] = (d["t"] // 60).astype(int)
print(d.groupby("minute")["hr"].agg(["count", "median"]).head())
窗长没有官方建议,取决于要看的周期。观察振荡形态,三十至六十秒够覆盖一个以上的慢呼吸周期;算频段功率,整段或五分钟以上才有足够样本支撑低频段;与睡眠分期对齐,用三十秒的常用 epoch;与呼吸事件对齐,这个库做不到,因为没有呼吸通道与呼吸事件。窗长一旦选定,全库应保持一致,否则不同组之间的幅度不可比。
5.5 复现论文的两条分析线
论文用了两种独立的量化方法:Lomb 周期图与 Hilbert 变换。前者处理不等间隔采样,后者给逐时刻的振荡幅度。两条线都可以用现成库复现。
#-- Lomb 谱与 Hilbert 包络:与论文同一条路线
import numpy as np
import pandas as pd
from scipy.signal import butter, filtfilt, hilbert, lombscargle
d = pd.read_csv("data/chi/C1.med", sep=r"\s+", header=None,
names=["t", "hr"])
t = d["t"].to_numpy() - d["t"].iloc[0]
x = d["hr"].to_numpy() - d["hr"].mean()
freq = np.linspace(0.025, 0.35, 400)
p = lombscargle(t, x, 2 * np.pi * freq)
print("主峰频率", round(float(freq[p.argmax()]), 3))
grid = np.arange(0, t[-1], 0.25)
y = np.interp(grid, t, d["hr"].to_numpy())
b, a = butter(2, [0.025, 0.35], btype="band", fs=4)
amp = np.abs(hilbert(filtfilt(b, a, y)))
print("幅度中位数", round(float(np.median(amp)), 2))
复现论文的分析链有五个环节:把不等间隔的心率序列重采样到统一网格,用 Lomb 周期图估计频谱,对带通后的信号做 Hilbert 变换取幅度中位数,用心电派生呼吸与心率做相干,最后按受试者聚合做检验。前三个环节只依赖心率,能在本库内完整复现;第四个环节缺呼吸一侧,做不了;第五个环节需要把每段压成一个数,再配对。
5.6 固定版本与完整性核对
库的版本号只有一个,1.0.0,发布至今未修订。这不意味着内容不会再变——平台上二〇一九年补充过校验和清单,说明文件层面有过维护。做可复现研究时,把版本号、下载日期与校验和一起记下来,是成本最低的保险。
#-- 记下版本与文件指纹,写进方法学附录
cd meditation/meditation/1.0.0
head -3 SHA256SUMS.txt
sha256sum data/RECORDS data/chi/C1.med
完整性核对有四个便宜的检查点:清单应有五十八行;每个头文件应只有一行;每段的注释条数应与文本行数相等;版本号应写 1.0.0。前三项说明副本自洽,第四项说明别人能复现——同一个库的不同版本,哪怕只改了一个文件,结论也可能不同。
§6 与库内条目的关系
6.1 关系图谱
这个库在站内不是一个孤立的词条。它和脑电类、睡眠类、心电类词条分别构成三种不同的邻接关系:同题材不同模态、同模态不同场景、同平台不同处理深度。
| 库内词条 | 关系 | 关键差异 |
|---|---|---|
| eegmat | 同属生理信号、同属任务态与静息态配对 | 脑电对心率,任务为心算而非冥想 |
| fantasia | 同属睡眠期逐搏心率,同出 PhysioNet | 按青年与老年分组,本库按冥想与否 |
| apnea-ecg | 同属心电派生序列 | 有呼吸事件标注,本库无呼吸通道 |
| isruc-sleep | 睡眠多导,可作呼吸与脑电的补充 | 有完整多导,本库只有心率 |
| ecg-arrhythmia | 心电波形库 | 有波形与节律标签,本库没有 |
| nsrr | 睡眠研究资源集合 | 可作夜间基线的外部验证来源 |
与 eegmat 的对照最能说明定位。两者都是「同一个人、前后两种状态、同一副电极」的配对设计,都把行为压缩成很少的几个数。差别在测量对象:一个记录头皮电位,一个记录心搏间隔。若课题问的是「大脑在任务中如何变化」,选前者;若问的是「自主神经在状态切换时如何变化」,选后者。两个都选也不会得到多模态数据,因为它们不是同一批人。
6.2 检索路径
| 你要找的东西 | 建议检索词 | 大概率命中 |
|---|---|---|
| 冥想状态下的心率振荡 | meditation heart rate oscillation | 本库 |
| 冥想前后的同人配对生理数据 | pre post meditation HRV | 本库,或更小的实验室数据集 |
| 慢呼吸对心率的影响 | slow paced breathing HRV | 本库 metron 组,或呼吸训练类库 |
| 夜间心率变异性基线 | nocturnal HRV normal sinus | fantasia、nsrr 系 |
| 带波形的静息心电 | resting ECG waveform | ecg-arrhythmia 等 |
| 冥想脑电 | meditation EEG | eegmat 类任务库不含冥想,需另找 |
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
一个常见的误判是把「质量评估」读成「这份数据好不好」。对这个库而言,好坏完全取决于用途:作为心率振荡的对照样本,它设计精巧;作为机器学习训练集,它几乎不可用。同一个二分的规模分,在前一种用途下是「够用」,在后一种用途下是「严重不足」。
第二个前置校正是不要把「论文结论强」当成「数据质量高」。论文的结论之所以站得住,是因为设计干净、对照到位,而不是因为样本多或标注细。数据本身很薄:两列数字,一个注释文件,一行头文件。薄不等于差,薄意味着容错空间小——任何一步口径搞错,结论就会反向。
7.1 五维评分
按 DAIMS 的常用维度打分,每项一至五分,评分针对「作为冥想与慢呼吸的心率振荡对照数据」这个用途。
| 维度 | 分数 | 理由 |
|---|---|---|
| 数据规模 | 2 | 四十六人、五十八段,两个处理组仅八人与四人 |
| 标注质量 | 3 | 组别与前后段由文件名确定,不会错;但注释来源两说 |
| 任务适配 | 4 | 五组对照直指研究问题,是它最强的一项 |
| 文档完整 | 3 | 论文正文随库提供,但字段说明、命名规则、事件标记均缺 |
| 可获取性 | 5 | 免注册、八点七兆、两列文本,几乎没有门槛 |
合计十七分,满分二十五。这个分布与同类的任务态生理库不同:它的高分集中在设计与获取,低分集中在规模。换句话说,它适合回答「有没有这个现象」,不适合回答「这个现象有多普遍」。
7.2 标注质量的两层
第一层是标签是否正确。这一层几乎不会出错:组别由目录名给出,冥想前后由文件名后缀给出,不需要解析任何内容。全库五十八段,没有一段的标签需要推断。
| 标签层 | 载体与粒度 | 可靠性 |
|---|---|---|
| 组别 | 目录名,段级 | 高,目录即标签 |
| 冥想前后 | 文件名后缀 pre 与 med,段级 | 高,后缀即标签 |
| 心搏位置 | .qrs 注释,搏动级 | 中,自动检测未审核 |
| 异常搏动 | 无 | 低,仅提示可能存在 |
| 冥想起止时刻 | 无 | 缺失 |
第二层是标签能承载多少信息。这一层很薄。除了组别与前后,没有任何段内的时间标注:没有「这一分钟在念诵」,没有「这一刻呼吸停了」。论文里瑜伽组有子阶段标记,公开发布后不可见。
7.3 已知的、可枚举的偏差
| 偏差 | 表现 | 影响面 |
|---|---|---|
| 选择偏差 | 禅修者为研究生与博士后,瑜伽者为进阶练习者 | 不能代表冥想人群 |
| 年龄偏差 | 全部在二十至五十五岁之间 | 不能外推到老年 |
| 性别不均衡 | 各组女男比例从五比三到三比六不等 | 性别分层分析功效不足 |
| 体位混杂 | 睡眠组卧位,禅修组坐位,节律呼吸组仰卧 | 体位对心率的影响未分离 |
| 时间混杂 | 睡眠组在夜间,冥想组在白天 | 昼夜节律与状态效应混在一起 |
| 基线长度不一 | 禅修前一小时,瑜伽前十五分钟 | 两组的「前」不是同一件事 |
| 记录工具不同 | 冥想组为 Holter,对照组来自回顾性心电库 | 设备与扫描流程可能不同 |
这些偏差里,体位与时间两项最难处理,因为它们在设计阶段就固定了,无法在分析阶段校正。任何把冥想组与睡眠组直接相减的做法,减掉的都不只是冥想。
偏差之间还会互相放大。年龄偏年轻、体能偏好、体位偏坐位,三项叠在一起,会让冥想组的静息心率整体低于睡眠组;而睡眠组的夜间副交感优势又会压低其变异性幅度。两个方向的偏移同时存在时,组间差值既可能被高估,也可能被抵消。单看一个方向的偏差,容易得出过于干净的结论。
7.4 外部验证矩阵
| 验证方向 | 可用的外部资源 | 能验证什么 | 不能验证什么 |
|---|---|---|---|
| 夜间心率变异性基线 | fantasia、nsrr 系睡眠库 | 对照组的幅度是否处于常见范围 | 冥想组的特殊性 |
| 慢呼吸的心率响应 | 呼吸训练类心电数据 | 0.25 赫兹呼吸的响应是否可重复 | 自然慢呼吸与固定节拍的差别 |
| 运动员静息心率 | 运动员心电库 | 高体能人群的变异性水平 | 赛前状态的特异效应 |
| 心搏检测质量 | 带波形的心电库 | 自动检测的漏检与误检率量级 | 本库注释的实际错误数 |
| 冥想的主观维度 | 量表类研究 | 练习资历与体验的关联 | 与心率的因果链 |
这张矩阵的作用是划清可验证与不可验证的界线。前三行可以用别的库交叉核对量级,后两行在本库内无解,只能标注为限制。
7.5 它为何能持续:一个反直觉结论的锚点
二十六年过去,这个库仍在被引用,原因不是数据多,而是它托住了一个反直觉的结论:冥想不总是「更安静」。教科书里的放松反应意味着交感撤退、心率平稳;这批数据给出的却是几秒内三十次每分的摆动与高度复杂的波形。
除了结论本身,还有一层原因:替代品没有。冥想被默认为副交感静息,而这里给出的是一小时内的剧烈摆动;想反驳或确认这个观察,就需要一组同时含冥想、慢呼吸、睡眠与运动训练的记录。八点七兆的体积让任何实验室都能拷进硬盘,平台的长期托管让链接二十年不失效。这些条件叠加,使它成了一个默认引用的锚点。
只要「冥想是否等于副交感静息」这个问题还在被讨论,就需要一组能同时看到冥想、慢呼吸、睡眠与运动训练的数据。它填的正是这个位置,而且填了二十六年没有第二个库来接。
§8 生态位与历史
8.1 从一篇心脏病学论文说起
这个库的前身是一九九九年发表在国际心脏病学杂志上的一篇论文,作者七人,分别来自贝斯以色列女执事医疗中心的非线性动力学实验室、心血管科、身心医学研究所,以及哈佛医学院与波士顿大学的聚合物研究中心。
| 时间 | 事件 | 依据 |
|---|---|---|
| 一九九九年 | 论文发表于 International Journal of Cardiology 第 70 卷 | 论文首页 |
| 二〇〇〇年一月 | 数据文件生成 | 文件时间戳 |
| 二〇〇〇年十月十三日 | 作为 PhysioNet 数据库发布 1.0.0 版 | 平台页面 |
| 二〇一六年十月 | 旧版说明页重新整理 | 文件时间戳 |
| 二〇一九年二月 | 补充校验和清单 | 文件时间戳 |
资助来源包括 Fetzer 研究所、美国国家航空航天局、美国国家精神卫生研究所与 Mathers 慈善基金会。研究方案经贝斯以色列女执事医疗中心伦理审查委员会批准,全部受试者签署知情同意。
| 项 | 内容 |
|---|---|
| 论文标题 | Exaggerated heart rate oscillations during two meditation techniques |
| 期刊 | International Journal of Cardiology |
| 卷期页 | 第 70 卷第 2 期,101 至 107 页 |
| 数字对象标识 | 10.1016/S0167-5273(99)00066-2 |
| 作者 | Peng、Mietus、Liu、Khalsa、Douglas、Benson、Goldberger |
| 平台 DOI | 10.13026/C2B880 |
8.2 为什么是 PhysioNet 收下了它
PhysioNet 的收录偏好一直很清楚:能复用、有标准格式、能长期维护。这批数据三项都占。逐搏序列天然适合 WFDB 的注释格式,八兆的体积不会给镜像带来负担,而作者的实验室本身就是这套格式的主要建设者之一。
收录也带来一个副作用:作者不再介入意味着不会再修订。库内命名的两套写法、缺失的事件标记、未说明的注释来源,都不会有官方补丁。使用者的应对方式是把这些当作既定事实写进方法学,而不是等一份迟到的勘误。
8.3 它在非线性动力学谱系里的位置
作者所在的实验室以心率变异的非线性分析闻名,一法度缩放、去趋势波动分析、Hilbert 变换这类工具都出自这一脉络。这个库是那条路线的一次应用:先用新方法看到现象,再把数据放出来让别人复算。Hilbert 变换给逐时刻的幅度,Lomb 周期图处理不等间隔采样,心电派生呼吸解决没有呼吸带时如何得到呼吸相位。四件工具合起来,构成一套不依赖额外传感器的分析链。
这条谱系也解释了为什么库内没有呼吸通道:方法上不需要。只要能从心电推算出呼吸,就不必额外戴一条胸腹带。代价是二十多年后,想复查这一步的人拿不到原始呼吸信号。
8.4 二十六年后的使用面孔
今天用它的人大致分四类。做算法验证的,拿五十八段当轻量测试集,因为格式最简、跑得最快;写综述的,引它的幅度结论,但要注明样本只有十二人;做慢呼吸方案设计的,把节律呼吸组当参照,但固定频率与训练出来的慢呼吸不是一回事;做教学的,用一段十分钟记录演示 RR 到瞬时心率的换算。四类里只有第一类与第四类真正吃透了它的结构,另外两类容易把它的边界当成普适。
还有一个不那么显眼的使用者:写代码库文档的人。两列文本、一个注释文件、一行头文件,是讲解「什么是最小可用的生理数据格式」的好例子——它把「波形」与「事件」两件事拆得很干净,正好说明为什么逐搏序列可以脱离波形独立存在。
§9 使用指引
9.1 三种角色的路径
| 角色 | 第一步 | 第二步 | 要避开的坑 |
|---|---|---|---|
| 刚接触心率变异性的学生 | 读 metron 组十分钟记录 | 复现一次瞬时心率换算 | 别一上来就啃十小时的禅修段 |
| 做自主神经研究的学者 | 先核论文方法,再核数据口径 | 按受试者聚合后做配对检验 | 别把合并十二人当成十二个独立组 |
| 做算法评测的工程师 | 用注释重建序列,检验一致性 | 把本库当轻量外部测试集 | 别期待波形,别做形态学指标 |
三种角色的分界线是「要不要解释幅度」。学生要的是把流程跑通,学者要的是把数字解释清楚,工程师要的是把接口接稳。三者的共同误区是跳过重零这一步:它是唯一一个不做就一定错、做了也不会错的步骤。
9.2 一条最短的可用流程
取数、重零、算幅度、比两段,四步能在一屏代码内跑完。这条流程只回答一个问题:同一人的冥想段幅度是否高于其冥想前段。
#-- 最短可用流程:取数、重零、算幅度、比两组
import numpy as np
import pandas as pd
from scipy.signal import butter, filtfilt, hilbert
def amp(path):
d = pd.read_csv(path, sep=r"\s+", header=None, names=["t", "hr"])
t = d["t"].to_numpy() - d["t"].iloc[0]
grid = np.arange(0, t[-1], 0.25)
y = np.interp(grid, t, d["hr"].to_numpy())
b, a = butter(2, [0.025, 0.35], btype="band", fs=4)
return float(np.median(np.abs(hilbert(filtfilt(b, a, y)))))
print("pre", round(amp("data/chi/C1.pre"), 2))
print("med", round(amp("data/chi/C1.med"), 2))
单例结果不能当结论用。要得到可报告的数字,得把八对禅修者与四对瑜伽练习者全部跑一遍,再按人对做配对检验。§4.3 的案例说明的正是这件事:一对样本能告诉你方法是否跑通,不能告诉你现象是否成立。
这条流程有五个环节,每一环都有一个典型的错法。取数时按单空格切分,节律呼吸组会错位;重零时忘了减去首行,横轴会多出几小时;重采样时直接对原序列滤波,等于假设它等间隔;取包络时用均值而不是中位数,少数尖峰会拉高整体;比较时跨人直接比,会把个体差异当成状态差异。
9.3 引用方式
学术引用应同时覆盖数据与论文两层。平台页面给出的标准引用指向一九九九年那篇论文,另有一个平台 DOI 用于标识数据版本。
Peng C-K, Mietus JE, Liu Y, Khalsa G, Douglas PS, Benson H, Goldberger AL.
Exaggerated heart rate oscillations during two meditation techniques.
International Journal of Cardiology. 1999;70(2):101-107.
doi:10.1016/S0167-5273(99)00066-2
Heart Rate Oscillations during Meditation (version 1.0.0).
PhysioNet. 2000. doi:10.13026/C2B880
引用分四层:数据本身要写库名、版本号、平台与 DOI;论文要写七位作者、标题、期刊、卷期页与 DOI;平台方另有自己的引用要求,部分期刊会查;最后还要写清自己的处理,是否重零、是否重采样、是否剔除离群段。前三层是规范,第四层是可复现性。缺了第四层,别人拿同一份数据算不出同一个数。
§10 AI 使用声明
| 维度 | 说明 |
|---|---|
| 用途 | 用于方法学讲解、字段解释与代码示例,不用于生成新的生理结论 |
| 数据来源 | 全部数字取自平台页面、库内文件与论文正文,未引入外部推测 |
| 未核实项 | 论文表一的组均值未在网页出现,故未转述具体数值 |
| 生成内容 | 代码示例为通用写法,未在作者环境中逐条执行 |
| 局限 | 未对全部五十八段做统计,未复算论文的显著性检验 |
| 责任 | 使用者应自行核对许可条款与引用要求 |
| 更新 | 平台侧若有版本变化,以官方页面为准 |
| 免责 | 本页不构成医学建议,不用于诊断或治疗决策 |
常见误读(避坑清单)
| 常见说法 | 实际 | 证据 |
|---|---|---|
| 这是冥想脑电数据集 | 没有任何脑电通道,只有逐搏心率 | 头文件声明零路信号 |
| 里面有原始心电波形 | 波形在源头被折算掉,只留注释 | .hea 一行,信号数为零 |
| 四十六人都是冥想练习者 | 只有十二人冥想,其余三十四人为三种对照 | 禅修八人加瑜伽四人 |
| 记录从第零秒开始 | 首列是 Holter 开机起的累计秒 | C1.med 首行一万九千余秒 |
| 对照组是普通健康人 | 睡眠、节律呼吸、赛前运动员三种状态 | 平台分组说明 |
| 有冥想起止的时间戳 | 只有文件名后缀 pre 与 med | 注释文件无事件标记 |
| 注释全部人工核验 | 平台文件写自动检测未审核 | ANNOTATORS 一行 |
| 冥想组人数足够做组间检验 | 八人与四人,论文合并成十二人 | 论文统计节 |
| 可以直接随机切分训练 | 每人两段,随机切会泄漏身份 | 配对结构 |
| 时长就是官方写的六小时 | 文本跨度是有注释的区间 | N1 首末跨度约四小时十四分 |
FAQ
Q1:这个库到底是心率数据还是心电数据?
是心率数据。它以心电为源头,但发布时只保留每次心搏的位置与由间隔换算的瞬时心率。需要波形的人应另找心电库。
Q2:五十八段是怎么算出来的?
禅修八人每人两段共十六,瑜伽四人每人两段共八,睡眠十一人十一段,节律呼吸十四人十四段,铁人三项九人九段,相加得五十八。平台清单逐行列出,可直接数。
Q3:为什么两个冥想组的人数差这么多?
论文没有解释。可以确认的是禅修组被描述为初学一至三个月的学生,瑜伽组被描述为进阶练习者,两组招募渠道可能不同。
Q4:两列文本里的第二列能不能直接当心率变异性指标?
不能。它是逐搏的瞬时心率,不是变异性指标。变异性要从 RR 间期序列再算,且必须先处理异位搏动与趋势。
Q5:为什么论文说人工核验,平台说自动检测?
两处文字都在,平台没有解释差异。稳妥做法是按「可能含少量未纠正错误」设计分析,并在方法学里写明这一不确定性。
Q6:能把冥想组和睡眠组直接相减吗?
可以算,但解释要谨慎。两组在体位、时间、设备上都不同,差值里混着体位效应与昼夜节律,不只是冥想效应。
Q7:文本文件和注释文件不一致怎么办?
官方说两者等价,文本可由注释重建。若出现不一致,优先信注释,因为它是原始记录,文本是派生表示。
Q8:节律呼吸组为什么只有十分钟?
官方只写了时长,没有写理由。十分钟足以覆盖数十个呼吸周期,对频段分析够用,对长时趋势不够。
Q9:能用于商业产品吗?
可以。ODC-BY 1.0 允许商用与再分发,条件是署名,署名需覆盖数据与平台两层。
Q10:这个库有更新版本吗?
平台只有一个版本 1.0.0,二〇〇〇年发布后未修订。二〇一九年补充过校验和清单,属于文件层面维护,不构成版本变更。
Q11:为什么瑜伽组的记录比禅修组短这么多?
禅修组佩戴约十小时以覆盖日常活动,瑜伽组只戴约一个半小时,含十五分钟基线与一小时冥想。设计不同,不是数据缺失。
Q12:想研究呼吸与心率的耦合,这个库够吗?
不够。只有心率一侧,呼吸信号未发布。可以做单侧推断,但无法分离呼吸驱动与心脏对呼吸的敏感度。
术语表
| 术语 | 英文 | 在本库中的含义 |
|---|---|---|
| 逐搏间期 | interbeat interval | 相邻两次心搏之间的时间,本库的原始测量 |
| RR 间期 | RR interval | 相邻两个 R 波之间的时间,与逐搏间期同义 |
| 瞬时心率 | instantaneous heart rate | RR 间期倒数乘六十,即文本第二列 |
| 心率变异性 | heart rate variability | 逐搏间期的波动程度,需另行计算 |
| 呼吸性窦性心律不齐 | respiratory sinus arrhythmia | 随呼吸周期出现的心率波动 |
| 低频段 | low frequency | 约 0.04 至 0.15 赫兹,混有压力反射成分 |
| 高频段 | high frequency | 约 0.15 至 0.4 赫兹,主要反映呼吸 |
| 极低频 | very low frequency | 低于 0.04 赫兹,机制尚有争议 |
| Lomb 周期图 | Lomb periodogram | 适用于不等间隔采样的频谱估计 |
| Hilbert 变换 | Hilbert transform | 由窄带信号求逐时刻幅度与相位 |
| 包络 | envelope | 振荡幅度随时间的变化曲线 |
| 相干 | coherence | 两个信号在频率上的线性相关程度 |
| 心电派生呼吸 | ECG-derived respiration | 由心电导联轴偏移推算呼吸 |
| Holter | Holter monitor | 便携式连续心电记录仪 |
| 注释 | annotation | 标出心搏位置的二进制记录 |
| 头文件 | header file | 描述记录结构的文本文件 |
| 事件标记 | event mark | 标出某事件时刻的注释 |
| 禅修 | Chi / Qigong | 本库第一处理组,Xin Yan 所传 |
| 昆达里尼瑜伽 | Kundalini Yoga | 本库第二处理组,Yogi Bhajan 所传 |
| 节律呼吸 | metronomic breathing | 按固定频率呼吸,本库为 0.25 赫兹 |
| 配对设计 | paired design | 同一人前后两段互为对照 |
| 留一受试者 | leave-one-subject-out | 按人划分训练与测试的验证方式 |
| 身份泄漏 | identity leakage | 同一人的样本分落两侧导致的虚高 |
| 基线 | baseline | 干预前的对照状态 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 受试者总数 | 46 | 五组人数相加 | 推导 |
| 记录总数 | 58 | RECORDS 清单 | 文件自身 |
| 禅修组 | 8 人 16 段 | 平台页面 | 官方页面 |
| 瑜伽组 | 4 人 8 段 | 平台页面 | 官方页面 |
| 睡眠组 | 11 人 11 段 | 平台页面 | 官方页面 |
| 节律呼吸组 | 14 人 14 段 | 平台页面 | 官方页面 |
| 铁人三项组 | 9 人 9 段 | 平台页面 | 官方页面 |
| 体积 | 8.7 兆字节 | 平台页面 | 官方页面 |
| 注释时间基准 | 128 赫兹 | 头文件 | 文件自身 |
| 关注频段 | 0.025 至 0.35 赫兹 | 论文正文 | 论文 |
| 五秒内摆幅 | 30 至 35 次每分 | 论文讨论 | 论文 |
| 节律呼吸频率 | 0.25 赫兹 | 平台页面 | 官方页面 |
| 合并检验样本 | 12 人 | 论文统计节 | 论文 |
| 显著性水平 | 0.01(双侧) | 论文统计节 | 论文 |
| 离群值剔除比例 | 不足百分之一 | 论文方法 | 论文 |
附录 B:数字的来源分层
| 层级 | 含义 | 本页中的例子 |
|---|---|---|
| 官方页面 | 平台项目页直接写出的数字 | 五组人数、时长、体积、许可 |
| 论文正文 | 随库提供的论文里写出的数字 | 频段、摆幅、检验方法与显著性 |
| 文件自身 | 从头文件、注释或文本读出的数字 | 128 赫兹、时间戳、行数 |
| 推导 | 由上述数字相加或换算得到 | 四十六人、首末跨度 |
四层的可信度依次递减,但用途不同。写方法学时应优先引用官方页面与论文,引用文件自身时要说明读取方式,引用推导值时应写出算式。
附录 C:完整参考文献
| 序号 | 文献 |
|---|---|
| 1 | Peng C-K, Mietus JE, Liu Y, Khalsa G, Douglas PS, Benson H, Goldberger AL. Exaggerated heart rate oscillations during two meditation techniques. International Journal of Cardiology. 1999;70(2):101-107. |
| 2 | Heart Rate Oscillations during Meditation, version 1.0.0. PhysioNet. 2000. doi:10.13026/C2B880 |
| 3 | Moody GB, Mark RG, Zoccola A, Vergani L. Derivation of respiratory signals from multilead ECGs. Computers in Cardiology. 1985;12:113-116. |
| 4 | Ivanov PCh, Rosenblum MG, Peng C-K, Mietus J, Havlin S, Stanley HE, Goldberger AL. Scaling behaviour of heartbeat intervals obtained by wavelet-based time-series analysis. Nature. 1996;383:323-327. |
| 5 | Press WH, Teukolsky SA, Vetterling WT, Flannery BP. Numerical Recipes in C. 2nd ed. Cambridge University Press; 1992. |
| 6 | Cohen L. Time-Frequency Analysis. Prentice Hall; 1995. |
附录 D:最小复现脚本
#-- 第一步:取数并确认清单
python3.11 -c "import wfdb; wfdb.dl_database('meditation', dl_dir='meditation')"
wc -l meditation/meditation/1.0.0/data/RECORDS
#-- 第二步:对全部配对记录算幅度,输出一对一行
import glob
import numpy as np
import pandas as pd
from scipy.signal import butter, filtfilt, hilbert
def amp(path):
d = pd.read_csv(path, sep=r"\s+", header=None, names=["t", "hr"])
t = d["t"].to_numpy() - d["t"].iloc[0]
grid = np.arange(0, t[-1], 0.25)
y = np.interp(grid, t, d["hr"].to_numpy())
b, a = butter(2, [0.025, 0.35], btype="band", fs=4)
return float(np.median(np.abs(hilbert(filtfilt(b, a, y)))))
rows = []
for pre in sorted(glob.glob("data/chi/*.pre")) + sorted(glob.glob("data/yoga/*.pre")):
med = pre[:-4] + ".med"
rows.append((pre, round(amp(pre), 2), round(amp(med), 2)))
for r in rows:
print(r)
两段代码之间有一个检查点:清单必须是五十八行,配对应是十二对。若清单行数不对,说明下载不完整;若配对数不对,说明命名映射写错了——冥想组的文本带点号,C1.pre 去掉点号才是 C1pre,直接替换扩展名会得到 C1pre.med 这种不存在的路径。
附录 E:如果只记五件事
| 序号 | 要点 |
|---|---|
| 1 | 它是逐搏心率库,不是心电波形库,头文件信号数为零 |
| 2 | 四十六人、五十八段、五组,两个冥想组分别八人与四人 |
| 3 | 时间轴从 Holter 开机起算,用前必须减去首行 |
| 4 | 三组对照是睡眠、节律呼吸与赛前运动员,不是普通人群 |
| 5 | 最容易被误用的是随机切分:同一人的两段分落两侧会泄漏身份 |
编辑说明
本页依据 PhysioNet 项目页(1.0.0 版)、库内 RECORDS、ANNOTATORS、头文件与样本记录,以及随库发布的论文正文整理。核验时间为二〇二六年十月二十八日,核验方式为逐个访问官方页面与库内文件,未下载整包做全量统计。未覆盖的内容包括:论文表一的组均值(仅见于 PDF 图版)、全部五十八段的分布特征、平台侧的历史修订记录。正文中的推导值均已注明算式。本页不代替原始许可条款,商用前请自行核对 ODC-BY 1.0 全文。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- slpdb — 共享标签:生理信号 / 睡眠信号
- hmc-sleep-staging — 共享标签:生理信号 / 心电信号 / 睡眠信号
- apnea-ecg — 共享标签:生理信号 / 心电信号 / 睡眠信号
- argo — 共享标签:生理信号 / 心电信号
- icehg-ds — 共享标签:生理信号 / 心电信号
- mmash — 共享标签:生理信号 / 心电信号 / 睡眠信号
- bidsleep-dataset — 共享标签:生理信号 / 心电信号 / 睡眠信号
- wctecgdb — 共享标签:生理信号 / 心电信号
- aami-ec13 — 共享标签:生理信号 / 心电信号
- adfecgdb — 共享标签:生理信号 / 心电信号
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

