心跳摆得比睡着还大 — PhysioNet 冥想心率库

四十六人 / 五组对照 / 只留心搏注释

来源 https://physionet.org/content/meditation/1.0.0/发布时间: 2026-10-28最后更新: 2026-10-28 阅读 13
心跳摆得比睡着还大 — PhysioNet 冥想心率库

信息速览

数据集名称心跳摆得比睡着还大 — PhysioNet 冥想心率库
数据类型时序信号,元数据
规模46 名受试者 / 58 段记录(五组)
接入方式https://physionet.org/content/meditation/1.0.0/
AI 就绪度

一九九九年,波士顿的一间实验室里,一位禅修者静坐了约一小时。事后把那一小时的心跳画成曲线,胸口的位置在五秒之内上下摆过三十多次。同一批研究者手上还有另外四组人的心跳:睡着的、按节拍器呼吸的、赛前休息的铁人三项选手,以及这些禅修者冥想之前的那一段。

这个库就是那篇论文背后的原始逐搏序列。它不提供心电波形,只提供每一次心搏发生的时刻,和由相邻两次心搏间隔换算出的瞬时心率。五组人被放进同一个出版单元,构成了一个少见的、把「冥想」与三种非冥想状态并列比较的公开样本。

以下按官方页面、平台文件与论文正文三处口径,把这个库的边界讲清楚:它记录了什么、结构如何、在什么条件下会给出错误结论。一屏速览见下表。

维度 内容
全名 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 — 共享标签:生理信号 / 心电信号

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

返回 AI-Ready 数据集