信息速览
多模态生理数据的稀缺之处,往往不在信号本身,而在「同一时刻」。单独一份心电图满地都是,单独一份超声也不难得,难的是让四台设备在同一秒内对齐到同一个心脏周期,并且把对齐的结果连同原始波形一起放出来。
HeartCycle 做的就是这件事。它把阻抗心动图、超声心动图、心音图、心电与指端脉搏波在同一批健康志愿者身上同步采集,目的很具体:阻抗心动图的 B 点与 X 点历来被当作主动脉瓣开放与关闭的替代标记,但这个替代并不精确,而超声可以直接看到瓣膜开闭。把两者放在同一条时间轴上,就能量化这个误差。
这份数据完全开放,不需要申请、不需要培训,下载即可用。这一点在同类数据里少见,也意味着它经得起逐文件核对。下面除了介绍结构,还会把核对中发现的几处文件与文档不一致之处列清楚,因为这些不一致直接决定加载代码该怎么写。
§1 它是什么:四条证据对齐在同一条时间轴上
1.1 一句话定义与三条边界
HeartCycle 是一份同步多模态心脏血流动力学记录集:十七名健康志愿者,四台设备并行采集,记录存为 HDF5,按三次实验分组,另附同步质量评分与受试者人口学信息。
三条边界要划清。
第一,受试者是健康志愿者,不是患者。这意味着数据里没有病理性的波形变异,没有射血分数降低,没有瓣膜病变。用它训练出来的算法,在患者身上表现如何完全未知。作者自己也强调,不要从这份数据推出无法外推到其他人群的生理结论。
第二,超声是以图像形式存下来的,不是标注好的结构测量。数据里有主动脉瓣开闭的时刻标注,但没有左室容积、射血分数的逐帧测量。想用超声做金标准比对,必须自己从图像里读。
第三,采集是实验室条件,静息为主。没有运动负荷、没有药物干预、没有长时间连续监测。真实可穿戴场景里的运动伪影、体位变化、电极松动,在这份数据里几乎见不到。
1.2 四台设备与四种采样率
四台设备各有分工,采样率互不相同。
阻抗与心电来自 Niccomo 设备,采样率两百赫兹。超声来自 GE 的 Vivid,采样率一百三十六赫兹,同步心电也是这个速率。脉搏波与同步心电来自 Philips V26 监护仪,心电五百赫兹,脉搏波一百二十五赫兹。心音用 Meditron 听诊器,采样率四万四千一百赫兹,同步心电也是这个速率。
四个采样率跨度很大,从一百二十五到四万四千一百,相差三百多倍。这个差异不是设计缺陷,是各模态的物理需求决定的——心音的主要能量在几十到几百赫兹,采样率低于八千就会失真;阻抗信号的主要成分在几赫兹以内,两百赫兹足够。
但采样率差异带来一个实际后果:任何跨模态的对齐都必须在时间域做重采样或插值,而这个操作本身会引入误差。数据提供方给出的对齐结果是在 MATLAB 里做的,具体插值方式文档未详述。若研究者要用自己的对齐方法,两套结果不会完全一致。
1.3 为什么阻抗心动图需要超声来校验
阻抗心动图通过胸壁电极注入高频小电流,测量胸部阻抗随血容量变化的波形。心室射血时主动脉内血量增加,阻抗下降,波形上出现一个陡降,其最低点被记为 C 波(也称 dz/dt 最小值),通常被当作主动脉瓣开放的近似时刻。射血结束后阻抗回升,出现一个切迹,被记为 X 点,通常被当作主动脉瓣关闭的近似。
这套替代标记的问题在于它是间接的。C 波反映的是主动脉内血流加速度的峰值,而不是瓣膜真正打开的那一刻;X 点反映的是 impedance 变化率的反转,而不是瓣膜真正关闭的那一刻。两者的时间差在不同个体、不同心率、不同心功能状态下都会变。
这个误差直接影响两个最有用的衍生指标:射血前期与左室射血时间。射血前期是从心电 R 峰到主动脉瓣开放的时间,左室射血时间是从开放到关闭的时间。若开放时刻被估早了二十毫秒,射血前期就短了二十毫秒,左室射血时间就长了二十毫秒,两个误差方向相反、幅度相同,合起来总收缩时间不变——这恰好是最难被察觉的一种系统性偏差。
用超声直接读瓣膜开闭,就能给出一个独立的参照。这就是这份数据的核心设计。
阻抗心动图的技术路线值得单独交代,因为它决定了这份数据里各种记录形态的由来。最早进入临床的版本是 Kubicek 的四电极带状电极法:两对电极环绕颈部与胸廓下缘,外侧一对注入恒定高频小电流,内侧一对测量由此产生的电压降。这套配置的优点是电路简单、成本低,缺点是对电极位置极其敏感——带状电极一旦上下挪动几厘米,测到的就是另一段胸腔的阻抗变化,绝对幅值随之漂移。更麻烦的是它测的是整个胸廓的阻抗变化,肺通气、体位改变、甚至手臂姿势都会叠加进波形,而心源成分只占其中一小部分。因此四电极法的绝对幅值很难跨个体比较,多数临床研究只敢用它的时间间期,不敢用它的每搏输出量。
后来出现的改良方案把注入电极与测量电极分开,减少电极与皮肤之间的接触阻抗影响;再往后是分段阻抗法与八点电极阵列,试图用多个通道反解出心腔内血容量的空间分布。这些改良提高了幅值的可重复性,但没有改变一个根本问题:阻抗变化与主动脉血流之间的传递关系是一个需要标定的比例常数,而这个常数与个体的胸腔几何、血细胞比容、组织含水量都有关。没有独立的血流测量,这个常数就只能靠群体回归的经验公式估计,误差落在百分之十到二十这个量级。
超声心动图之所以被选作参照,正是因为它能直接看到瓣膜运动,不依赖任何经验常数。多普勒可以测主动脉血流的流速时间积分,二维图像可以测左室腔径与容积,两者合起来能算出每搏输出量。把这一路测量与同步记录的阻抗波形放在一起,就有了一个可以逐拍比对的标准答案:阻抗波形上的哪些特征点与瓣膜真实开闭时刻对齐、偏了多少、偏差随什么变化。
有趣的是,阻抗心动图后来在可穿戴场景里重新变得重要。原因不是它变准了,而是它变便宜了:胸阻抗可以用体脂秤上那种四片金属电极实现,不需要超声探头,也不需要专业人员操作。智能手表与智能体脂秤上的心率、呼吸率、体成分估计,很多都建立在阻抗测量的基础上。这让超声校验的价值反而更明确——当同一套物理原理被搬到手腕和胸带上时,误差结构会变,但偏差的方向与量级需要有个参照才能说清楚。这份数据提供的正是这个参照。
1.4 五个模态各自能提供什么
每个模态在这套设计里都有一个不可替代的作用。
心电提供时间基准。所有其他模态都以 R 峰为锚点对齐,R 峰时刻在四个设备组里各存一份。这看起来冗余,实际是必需的——四台设备的时钟不同步,各存一份 R 峰才能把各自的内部时间轴映射到同一个绝对时间轴。
阻抗提供 C 波与 X 点,也提供原始阻抗 Z0 与它的导数。数据里存的是原始阻抗,不是导数,这一点后面会细说。
超声提供瓣膜开闭的直接观察,也提供心室壁运动的图像。
心音提供瓣膜开闭的声学证据。二尖瓣关闭产生第一心音的初成分,主动脉瓣开放紧随其后,主动脉瓣关闭产生第二心音的主动脉成分。心音的时间分辨率很高,四万四千一百赫兹的采样率意味着每毫秒四十四点一个采样点,足以分辨几毫秒的差异。
脉搏波提供外周循环的到达时间,可用于估算脉搏波传导速度,也可作为射血时间的粗参照。
1.5 三次实验的分组与它的含义
数据按三次实验分在三个目录里,目录名是随机化的日期编号,不是受试者编号。
三个目录分别是 59146237、59146238、59146239。日志里的记录分布是三十余条、八十余条、九十余条(具体数字与文档不符,见 §4.2)。
分组的实际含义需要说清:受试者不是随机分到三个实验里的,而是按采集的时间批次分的。前十名受试者在第二批,后七名在第三批,第一批没有受试者对应的记录——第一批的三十余条记录全部来自后期某个补采环节。
这个结构带来一个重要后果:脉搏波只在第一批里有。原因是脉搏波传感器是研究后期才加入采集协议的,而第一批是唯一在加入后重新采的批次。因此任何涉及脉搏波的分析,样本量都大幅缩水到三十余条记录,且这三十余条对应的受试者与另外两批不同。
1.6 与同类多模态数据的区别
同类的多模态生理数据有几份,路数不同。
一份是单纯的阻抗数据(如 ReBeatICG),只含阻抗与心电,没有独立参照,无法校验 B 点与 X 点的偏倚。一份是单纯的多导睡眠数据,含心电与呼吸但不含阻抗。还有一类是超声数据库,含大量图像但不同步采集其他生理信号。
HeartCycle 的独特之处在「同步」二字。四类信号加超声图像在同一秒内,这是它唯一无法被替代的地方。规模小是代价,也是必然——同步采集的协调成本随设备数量指数上升。
§2 数据构成:HDF5 的组结构与它的读法
2.1 目录与文件清单
顶层结构如下。
59146237/ measure/ 下为 h5 文件
59146238/ measure/ 下为 h5 文件
59146239/ measure/ 下为 h5 文件
LICENSE.txt 开放数据许可
ObjectMapping.csv 组 ID 到信号名的映射
README.md 完整说明
SHA256SUMS.txt 所有文件的校验和
pan_tompkins.py R 峰检测实现
tutorial.py 读取示例
每个实验目录内除 measure 子目录外,还有三份元数据:文件级元数据、受试者级元数据,以及受试者元数据的另一格式副本。
文件命名规则是受试者编号、日期令牌、记录编号三者用下划线连接,扩展名为 h5。日期令牌是随机化的四位数字,不对应真实日期。
2.2 组 ID 的分段与含义
HDF5 里的数据按组 ID 组织,ID 是下划线加三位数字。
ID 分成五段,各段对应一台设备。前三十个(000 到 029)是 Niccomo 设备算出的生理参数,三十到三十六是 Niccomo 的波形与事件,六十到六十六是心音设备,九十到九十六是超声设备,一百二十到一百二十六是脉搏波设备。
这个分段不是随便排的,段首的数字暗示了设备顺序:零段是主设备,六段、九段、十二段是三个辅助设备。留出的空档(三十七到五十九、六十七到八十九等)是为将来扩展预留的,目前为空。
2.3 每个设备组内部的七件套
每台设备组内部结构与七件套高度一致:心电、本设备主信号、R 峰时刻、主动脉瓣开放时刻、射血前期、主动脉瓣关闭时刻、左室射血时间。
这个一致性是设计上的用心之处。研究者写一套解析函数,改一下组 ID 前缀就能读四台设备的数据,不必为每台设备写一套逻辑。
但一致性有一处例外:Niccomo 组的七个量都是二维,而其余三组的后四个量(开放时刻、射血前期、关闭时刻、射血时间)是一维。原因是 Niccomo 把这些量算在完整波形上,与波形同长度;其余设备只在每个心动周期给一个值,所以是一维。
写解析代码时,一维与二维的区别必须处理。若统一按二维取第一行,一维数组会报错;若统一按一维取,二维数组只能拿到第一个通道。
2.4 超声组的三维数组
超声组的主信号是三维的,形状是三乘时间乘深度或速度。
三个通道对应三路超声信号,末维的含义取决于超声模式——M 型超声的末维是深度,多普勒的末维是速度。数据里没有逐帧标注说明某一段是哪种模式,需要使用者自己从波形形态判断:M 型呈现为随深度变化的带状结构,多普勒呈现为随时间变化的频谱。
这个设计对后续处理不友好。多数分析工具期望二维输入,三维数组需要先拆成三个二维矩阵并转置,让时间落在横轴上。文档的示例代码提示了这一点,但没有给出完整的拆分函数。
2.5 阻抗存的是原始信号
这是最容易踩的一个坑。
Niccomo 组的阻抗通道存的是原始阻抗,单位欧姆,不是它的导数。而所有阻抗心动图的文献指标——C 波幅度、B 点位置、X 点位置——都定义在导数曲线上。
所以拿到数据后第一步必须求导。求导方式影响结果:中心差分与后向差分给出的峰值位置可能差一个采样点,而两百赫兹采样率下一个采样点是五毫秒,五毫秒的偏差足以改变射血前期的估计。
文档建议用数值梯度函数,步长取采样间隔的倒数。这个建议是对的,但没提醒一件更重要的事:求导放大了高频噪声,而原始阻抗信号里的高频噪声主要来自呼吸与运动。求导前应当先低通滤波,截止频率取在二十赫兹上下,既保留 C 波的陡降,又压掉呼吸带来的基线漂移。
2.6 采样率存在哪
采样率不是写在文件属性里的统一字段,而是存在每个组的速率组里。
这意味着读一个文件要多次查速率,不能假定全文件一个采样率。若写代码时把速率硬编码成两百,读超声数据时就会错——超声是一百三十六。
更稳妥的做法是写一个查表函数,按组 ID 前缀返回对应速率,并在读到速率组时覆盖默认值。这样既快又稳。
§3 怎么拿到:完全开放与它的真实门槛
3.1 获取方式
三种方式,都不需要申请。
网页下载压缩包,约一点三吉字节。命令行用递归镜像抓取整个目录。或用云存储的同步命令免密拉取公开桶。
打开即用,不需要注册,不需要签署协议,不需要培训证书。许可为开放数据共享署名 1.0,唯一实质要求是署名——使用、修改、再分发都允许,只要标明来源。
这个开放程度在生理信号数据里属于宽松的一端。同一平台上的其他数据集多为受限或凭证式,这份是明确的开放访问。
3.2 体积与存储的实际考虑
解压后约二点三吉字节,两百余个文件,平均每个文件十来兆。
这个体量对单机分析是舒适的。全部载入内存不现实,但按需读取很快——HDF5 支持部分读取,只取某个组某个通道的数据,不必加载整个文件。
实际做分析时,建议先建一个索引表,记录每个文件有哪些组、各组长度与采样率。这一步可以用脚本遍历一遍,几十秒完成,之后所有查询都查索引而不必重复打开文件。
3.3 校验和的用法
顶层有一份校验和文件,列出了所有文件的 SHA256。
这份文件的价值不只是校验完整性,还可以当清单用——它列出了全部两百余个 h5 文件的路径,比翻目录快。做统计时直接解析这份文件,就能拿到文件总数与各目录的分布。
前面核对记录数时用的就是这个办法,结果与文档记载不一致,详见 §4.2。
3.4 编码与分隔符的坑
映射文件用的是分号分隔,不是逗号。
这个细节不注意会出错——按逗号读会得到一整列,所有字段挤在一起。更麻烦的是编码:文件里有希腊字母与上标符号,用 UTF-8 读会抛异常,必须指定 Latin-1。
文件的表头重复出现四次设备名,因为它是四组映射横向拼在一起的一张表,而不是长表。读进来要么按固定列位置切,要么把四段分别取出来再纵向拼接。
3.5 示例代码能省多少事
包内带两份脚本:一份是读取示例,一份是 R 峰检测实现。
读取示例很短,主要示范了如何按路径索引到某个组的数据。它的价值在提示路径结构——HDF5 的嵌套层级比一般文件深,路径写法容易错。示例给了一条可跑通的路,照着改就行。
R 峰检测实现是经典的 Pan-Tompkins 算法。它的用途不是提供最优检测,而是提供一套可复现的基线。研究者若用自己的检测器,与这套基线比较就能看出差异来自算法还是来自数据。
要注意的是,这份实现是为高采样率心电写的。用在两百赫兹的 Niccomo 心电上,滤波器的参数需要调整,否则检测率会下降。文档没有提示这一点,是一个容易踩的坑。
3.6 三条最小可用路径
想最快看到东西,有三条路径。
第一条,读一条记录的阻抗与心电,画在一张图上,看 C 波与 R 峰的相对位置。这能建立对信号形态的直觉。
第二条,读同一记录的超声组,取主动脉瓣开放时刻,与阻抗的 C 波位置对比,量出时间差。这一步就是这份数据的核心用途。
第三条,读元数据表,统计受试者的年龄、体重指数分布,判断自己的分析能不能外推。
三条路径依次深入,每条十几分钟,加起来一小时内能完成对数据的整体把握。
§4 质量:三处文档与文件的不一致
4.1 先说清楚核对方法
这一节的所有结论都来自实际下载核对,不是读文档推测。
核对方式是解析顶层校验和文件,取出全部 h5 文件路径,按目录统计数量,再与文档记载的数字比对。另外解析受试者编号前缀,与文档表格比对。所有数字都可复现,读者按同样步骤能自己得到结论。
之所以要这样做,是因为开放数据的一个好处就是可以核。文档写错了,文件不会骗人。
4.2 记录数:文档写两百零八,文件有两百一十二
文档正文明确写:共两百零八条记录,分三个实验,第一个目录三十二条、第二个八十四条、第三个九十二条。
按实际文件统计,三个目录的 h5 数量分别是三十七、八十三、九十二,合计两百一十二。
三个数字里只有一个对得上。第一个目录多了五条,第二个少了一条,第三个正好。
这个差异不是笔误级别的问题。多用五条、少用一条,意味着任何按文档写的加载循环都会漏掉或多读文件。更实际的影响是:若研究者按「每目录三十二、八十四、九十二」建索引数组,会越界或错位。
可能的解释是文档写于某个中间时点,之后又补采、剔除或重命名了若干文件。校验和文件的生成时间晚于说明文件的修改时间,支持这个解释。但文档没有版本变更记录,无法确认。
使用建议:不要硬编码目录内文件数,始终从校验和文件或目录遍历得到真实清单。这一条适用于所有开放数据,不只是这一份。
4.3 受试者编号:文件名是 CH01,表格写 CHC01
第二个不一致在受试者编号的写法。
文档的受试者分布表用的是 CHC 加两位数字,从 CHC01 到 CHC17。而实际文件名里的前缀是 CH 加两位数字,从 CH01 到 CH17,没有那个 C。
这个差异看起来无伤大雅,实际会让按编号匹配的代码全部失效。若从元数据表读出 CHC07,再去文件清单里找以它开头的文件,一个也找不到。
处理办法是读取时统一去重前缀——要么把元数据里的 C 去掉,要么在匹配时用宽松规则。前者干净,但要小心别把编号里的其他字母也去掉。
4.4 记录数表内部也不自洽
第三个不一致更隐蔽:受试者分布表里每位受试者都有一列「记录数」,把这一列加起来,得到两百一十九。
这个数与正文的两百零八不符,也与文件实际的两百一十二不符。
三个数两两不同,说明这张表和正文不是同一次统计的产物。进一步看,差异集中在一位受试者身上——表中该受试者记为三十条,而按文件名统计实际只有二十三条,差七条。
七条之差加上另外几处小差,正好凑成三张表之间的全部偏差。这说明最可能的情形是:表是按较早的文件命名统计的,后来一部分记录被重命名或移除,但表没更新。
4.5 采样率的两处表述需要合起来读
文档里出现两种说法:一说脉搏波设备的心电与脉搏波都是五百赫兹;另一处的表格说心电五百赫兹、脉搏波一百二十五赫兹。
这两处不矛盾,说的是不同通道。同一台设备有心电与脉搏波两个通道,心电采五百、脉搏波采一百二十五,两个数都对。
但只看正文那一句会误以为脉搏波也是五百。若按五百去解析脉搏波数据,时间轴会压缩到实际值的四分之一,所有基于脉搏波的间期计算全错。
正确的做法是查数据里的速率组,不依赖文档。这也是 §2.6 强调的一点。
4.6 同步质量的定义与它的局限
数据为每条记录给出一个同步质量分,公式是百分之一百减去误差乘以一万。
这个定义需要拆开看。误差是被定义为时间错位或无效数据占总时长的比例,乘一万之后,百分之一的误差对应分数为零。也就是说,只有误差小于万分之一,分数才是正数。
这个量纲设计非常严格。实际上多数记录的分数应该接近一百,因为误差通常在千分之几量级,乘一万后仍有九十多分。若某条记录分数明显偏低,说明同步出了问题,应当排除。
局限在于这个分数只衡量时间对齐,不衡量信号质量。一条对齐完美但电极接触不良的记录,分数可能很高而数据不可用。使用时应当同时看波形本身,不能只信这个分。
4.7 缺失模态的分布
脉搏波只在三十余条记录里有,且全部集中在第一个实验目录。
这个分布对分析的限制很硬。想做三联对比(阻抗、超声、脉搏波)的研究,样本只有三十余条,且这三十余条对应的受试者与其余两批不同,不能假定人群一致。
更麻烦的是,这三十余条里的受试者编号与另外两批重叠——同一名受试者可能既有含脉搏波的记录,也有不含的。这意味着做配对分析时要小心,不能把同一人的两次记录当作独立样本。
4.8 健康人群带来的范围限制
十七名志愿者,年龄十九到四十岁,其中十四人年龄在十九到二十九之间。体重指数从十九点八一到三十一点八三,跨度不小,但整体偏瘦。
这个构成意味着数据里几乎没有肥胖相关的波形变异,也没有老年人才有的动脉硬化改变。阻抗心动图在这些情形下的表现与年轻人差别很大——主动脉顺应性下降会改变 C 波的形态与 X 点的位置。
因此任何在这份数据上训练的模型,直接用到老年患者身上都有风险。要外推,必须有额外的验证数据。
§5 能做什么:五类用法与实现要点
5.1 用法一:量化 B 点与 X 点的偏倚
这是设计初衷,也是最有价值的一条。
做法是:对每条记录,从阻抗导数曲线上检测 C 波与切迹位置,从超声组读取主动脉瓣开放与关闭时刻,两者相减得到偏倚。再把偏倚对心率、射血前期等变量回归,看偏倚是否系统性依赖某些状态。
实现上有三处细节决定结论的可靠性。
第一,C 波检测的规则必须固定。常见做法是取一个心动周期内导数的最小值,但若波形里有伪影,最小值可能落在错误位置。稳妥做法是先用 R 峰切分周期,再在周期内找最小值,并加一个幅度阈值过滤。
第二,超声时刻的精度受帧率限制。一百三十六赫兹意味着一帧约七点四毫秒,瓣膜开闭的判定精度不会优于这个数。因此偏倚的估计本身带有七毫秒量级的不确定度,任何小于这个量级的差异都不应被解读。
第三,比较必须在同一时间基准上做。超声组的时刻是相对该组自己的 R 峰,阻抗组的时刻是相对它的 R 峰,两组 R 峰之间可能有偏移。正确做法是先把所有时刻映射到绝对时间轴,再相减。
5.2 用法二:给射血时间类指标提供参考值
射血前期与左室射血时间是心功能评估的常用指标,但它们的参考值在不同研究中差异很大,部分原因就是测量方法不同。
这份数据同时给出超声参照与阻抗估算,等于给出一对可比的值。研究者可以用它建立「阻抗估算相对超声参照偏差多少」的经验分布,再用这个分布去校正自己手上的单模态数据。
这个用法的关键是不要把超声参照当成真值。瓣膜开闭的判定本身依赖操作者对图像的主观判断,且二维图像的时间分辨率有限。超声给出的是「更接近真值」而不是「真值」。
用这些指标时还要清楚它们的生理含义,否则容易把统计差异当成临床意义。射血前期延长,反映的是心室开始电激动到真正开始射血这一段耗时增加,常见于心肌收缩力下降或后负荷升高。左室射血时间缩短,反映每搏射出的时间变短,常见于每搏量下降或心率增快。两个指标合起来看,比单看一个更有信息量——射血前期与左室射血时间的比值被认为是心肌收缩性的一个粗略指标,这个比值的好处是部分抵消了心率的影响。
这也解释了为什么 B 点与 X 点的偏倚值得认真对待。若 B 点估计偏早,射血前期被低估、左室射血时间被高估,比值就偏小,读出的收缩性比实际差。若 X 点估计偏晚,左室射血时间被高估,比值同样偏小。两类偏倚的方向不同,但对比值的影响同向,这是一种容易累积而非相互抵消的误差结构。
5.3 用法三:多模态融合的验证平台
四个模态加一个图像模态,天然是融合算法的测试床。
可以做的实验很多:只用心电加阻抗的基线,加上心音后精度提升多少,加上超声后还剩多少提升空间。这类消融在单模态数据上做不了,在拼接的多源数据上也做不了——拼接的数据没有逐拍对齐。
实现时要注意模态间的采样率差异。心音四万四千一百赫兹,超声一百三十六赫兹,直接拼接会得到一个极不平衡的特征矩阵。合理做法是各自提取逐拍特征后对齐到心拍层级,再融合。
5.4 用法四:可穿戴算法的离线验证
可穿戴设备通常只能测心电与脉搏波,测不到阻抗,更测不到超声。
这份数据可以用来验证一个思路:能否用脉搏波与心电的组合替代阻抗,估算射血时间。做法是用同时含三种模态的那三十余条记录,训练一个从心电加脉搏波到阻抗衍生的映射,再看它相对超声参照的误差。
样本量是硬约束。三十余条记录,每条若干心拍,若按心拍算样本量够用,但要防止同一记录的心拍之间高度相关导致的过拟合。必须按记录划分训练测试,不能按心拍随机划分。
5.5 用法五:信号处理方法的对照基准
阻抗信号的处理有一堆可选方法:求导前滤波与否、C 波检测用极值还是过零点、基线漂移用高通还是多项式拟合。
这些选择对结果的影响,在单模态数据上无法评价,因为没有参照。有超声参照之后,就能给出定量评价——哪种处理组合得到的偏倚最小。
这类方法学研究不需要大样本,因为比较的是同一批数据上的不同处理,样本量固定。十七名受试者、两百余条记录,足够做五六种方法的对照。
5.6 DAIMS 24 项检查
| 维度 | 项 | 判定 |
|---|---|---|
| 文档 | 数据字典 | 是(组 ID 映射表 + 说明文件,逐 ID 给信号名、单位、维度) |
| 文档 | 采集协议 | 是(设备型号、采样率、同步流程、标注方式均写明) |
| 文档 | 设备规格 | 是(四台设备型号齐全) |
| 文档 | 标注规范 | 部分(说明需人工标注脉搏波,未给标注细则) |
| 文档 | 版本历史 | 否(仅一版,无变更记录) |
| 文档 | 许可说明 | 是(开放数据共享署名 1.0) |
| 文档 | 引用格式 | 是(含 DOI 与 RRID) |
| 文档 | 局限披露 | 是(两条,写得具体) |
| 质量 | 缺失披露 | 部分(脉搏波缺失范围说明了,未给逐文件清单) |
| 质量 | 信号质量说明 | 是(同步质量百分比公式给出) |
| 质量 | 一致性检验 | 否(未报告多标注者一致性) |
| 质量 | 记录数一致性 | 否(文件数与文档记载不符,见 §4.2) |
| 质量 | 编号一致性 | 否(文件名与表格写法不同,见 §4.3) |
| 质量 | 采集环境说明 | 是(受控实验室条件,已声明) |
| 公平 | 人群构成 | 是(逐人年龄性别身高体重齐全) |
| 公平 | 机构来源 | 是(单一医院,伦理批号给出) |
| 公平 | 亚组表现 | 否(样本太小,未做亚组分析) |
| 公平 | 偏倚讨论 | 部分(提到不可外推,未系统讨论) |
| 可复现 | 代码可用 | 是(读取示例 + R 峰检测) |
| 可复现 | 环境说明 | 是(MATLAB 版本写出) |
| 可复现 | 随机种子 | 不适用(无随机过程) |
| 可复现 | 结果可重算 | 是(原始信号全给,处理流程可复现) |
| 治理 | 伦理审批 | 是(医院伦理委员会,批号 CES-238) |
| 治理 | 再分发约束 | 是(署名即可再分发) |
统计:是 14 项,部分 5 项,否 5 项,不适用 1 项。
五项「否」里,三项是文档维护问题(版本历史、记录数一致性、编号一致性),两项是标注质量问题(一致性检验、亚组表现)。前一类只要有人更新一次文档就能解决,后一类受样本量限制,短期无解。
§6 常见误读与引用陷阱
6.1 误读一:把阻抗当导数直接找峰
最常见的操作失误。
数据里的阻抗通道是原始信号,单位欧姆,形态是随呼吸起伏的缓慢曲线,上面叠加着每个心拍的微小波动。直接在这条曲线上找极值,找到的是呼吸周期的峰谷,不是 C 波。
必须先求导。求导后再找最小值,才是 C 波。这一步在文档里写了,但写在靠后的位置,容易被跳过。
6.2 误读二:把同步质量分当数据质量分
同步质量衡量的是时间对齐,不是信号可用性。
一条记录可以对齐得完美,同时电极接触不良导致阻抗波形严重失真。这种情况下同步分很高,数据却不能用。反过来,一条记录信号干净但时间戳有几十毫秒偏移,同步分会低,波形却很有价值。
两个维度要分开看。判断可用性应当看波形信噪比与伪影比例,判断对齐质量才看那个分。
6.3 误读三:把健康志愿者数据当患者数据
受试者全是健康志愿者,年龄集中,无基础病。
在这份数据上训练的血流动力学预测模型,用到心衰患者、高血压患者、老年人身上,表现未知。作者本人在局限里明确提醒不要做无法外推的生理结论。
引用时应写「在健康年轻人群上的表现」,不要写「在人群中的表现」。
6.4 误读四:以为超声是逐帧分割的标注
超声数据是图像,不是标注。
数据里只有主动脉瓣开放与关闭的时刻标注,没有左室边界、没有容积曲线、没有射血分数。想用超声做更多维度的参照,必须自己从图像里读,或跑分割算法。
把「有超声数据」理解成「有超声测量结果」,是一个常见误解。这两件事差着一整条分析流水线。
6.5 误读五:按文档的记录数写代码
前面详细说过,文档的两百零八与文件的两百一十二不一致,表格内部还有第三个数。
按文档写循环,会漏文件或越界。正确做法是从校验和文件或目录遍历取真实清单。
这一条对所有开放数据都适用:文档是给人看的,文件才是事实。
6.6 误读六:以为所有记录都有五个模态
脉搏波只在三十余条记录里有,其余记录只有四个模态。
任何假设「每条记录都有脉搏波」的代码,会在多数文件上失败。写解析函数时应当把每个模态都当作可能缺失,用条件判断包裹。
6.7 引用时必须写清的五件事
人群:十七名健康志愿者,不是患者。
模态覆盖:脉搏波仅部分记录有,不可假定全量。
采样率:四种速率,跨模态对齐须显式重采样。
记录数:以文件为准,文档记载有误。
参照性质:超声是更接近真值的参照,不是真值。
§7 在生态中的位置
7.1 与纯阻抗数据库的分工
纯阻抗数据库(如 ReBeatICG 一类)提供大量阻抗与心电记录,样本量大,但没有独立参照。
HeartCycle 的样本量小得多,但多了超声、心音、脉搏波三条参照。两者的关系是互补:前者适合训练,后者适合校验。
理想流程是:在前者上训练算法,在后者上验证偏倚。这个分工让两份数据各自发挥长处。
7.2 与超声数据库的分工
超声数据库通常提供大量图像与测量结果,但不同步采集阻抗。
HeartCycle 的超声只有一百余条记录,图像也不如专业超声库完整,但它是同步的。同步这件事无法事后补,只能采集时做对。
因此它的定位不是超声研究的主力数据,而是「带超声参照的阻抗数据」。
7.3 在可穿戴研究中的位置
可穿戴设备厂商需要验证自己的算法,但拿不到医院级的参照。
这份数据的开放许可意味着厂商可以直接用它做离线验证,不必走数据申请流程。这在工业界是实实在在的便利。
限制是人群不匹配。可穿戴设备的用户年龄跨度大,而这份数据只有年轻人。厂商用它验证后,还要在真实用户数据上再验一次。
7.4 规模上的定位
十七人、两百余条记录,这个规模不适合训练深度模型。
适合的是:方法学对照、偏倚量化、算法校准、教学演示。这几类工作对样本量的要求不高,对参照质量的要求高,正好匹配这份数据的强项。
反过来,想用它训练一个端到端的血流动力学预测网络,样本量差两三个数量级。少量数据训深网,结果不可信。
7.5 适合谁用
适合四类人。研究阻抗心动图信号处理的方法学者。做多模态融合、需要逐拍对齐数据的工程师。做可穿戴算法、需要医院级参照的开发者。教生理信号处理、需要真实多模态案例的教师。
不适合两类人。想训大模型的人——样本不够。想做临床研究的人——没有患者。
§8 同步是怎么做到的:流程与它的薄弱环节
8.1 四步流程
采集分四步:采集、组织、导入、标注。
采集阶段各设备用自己的软件独立记录,文件按日期与志愿者编号归档。组织阶段把原始文件转成若干中间表。导入阶段在数值计算环境里按志愿者建立结构体,含采集信息、志愿者信息、测量矩阵三类。标注阶段对脉搏波做人工标注。
四步里最关键的是导入阶段的「测量矩阵」。它的每个单元格存一个完整的数据段,含时间向量、信号、标签、采样率、单位、运行标识、活动描述。这个设计把元数据与信号绑在一起,避免了元数据与数据脱节的问题。
8.2 同步靠什么保证
文档没有明说同步的物理机制,但从流程可以推断:四台设备没有硬件同步线,靠的是各自记录的时间戳加事后对齐。
事后对齐的锚点是心电 R 峰。四台设备都记了心电,因此可以各自算出 R 峰序列,再通过序列匹配找出时间偏移。
这个方法在原理上可行,但有前提:四台设备的心电必须是同一颗心脏的同一段记录,且 R 峰检测本身不能出错。若某台设备的电极脱落导致心电段缺失,就无法对齐。
这也是同步质量分的来源——分数低意味着对齐时的残差大,或有效重叠段少。
8.3 事后对齐的固有误差
事后对齐的精度受两个因素限制。
第一个是采样率。Niccomo 心电两百赫兹,一个采样间隔五毫秒,因此 R 峰定位的精度上限是五毫秒。超声组一百三十六赫兹,精度约七点四毫秒。
第二个是 R 峰检测算法的一致性。不同设备的心电波形形态不同(导联位置不同、滤波不同),同一算法在两组数据上的检测偏差不同。这个偏差会直接转成对齐误差。
两项加起来,跨模态的时间对齐精度大概在十毫秒量级。这个数对心率变异性分析可能不够,对射血时间这类百毫秒量级的间期够用。
理解这个精度上限很重要。若研究者在数据上测出五毫秒的组间差异并宣称显著,很可能只是对齐误差的波动。
8.4 缺少硬件同步的后果
如果重新设计这个实验,最值得加的是硬件同步——用同一个时钟触发四台设备,或至少在每台设备上打同一个同步脉冲。
有硬件同步,对齐精度能到微秒级;没有,只能到毫秒级。这个差距在心音这类高频信号上尤其明显——心音的成分在几十毫秒内完成,十毫秒的对齐误差足以让第一心音与第二心音的归属判断出错。
这个限制不是这份数据独有的,是绝大多数多设备生理采集的通病。指出它不是为了挑刺,而是提醒使用者:跨模态的精细时间关系不要过度解读。
还有一层误差来源值得单独提,就是设备的内部延迟。四台设备从传感器到文件写入之间各有自己的处理链条——滤波、降采样、打包、落盘。这些环节引入的延迟通常只有几毫秒,但各设备不一致。Niccomo 作为专用阻抗设备,其内部滤波器的群延迟可能达到数十毫秒;超声设备为了显示流畅会做帧缓冲,也可能引入固定延迟。
这些延迟不会体现在时间戳里,因为它们发生在时间戳生成之后。因此即使 R 峰对齐做得完美,信号本身仍可能有系统性的相对偏移。要发现这个偏移,只能用一个共同的物理事件去校准——比如在四台设备上同时记录一次人为的脉冲。
文档没有提到这类校准。这意味着数据里的跨模态时间关系可能带有一个未知的固定偏移,量级在几十毫秒以内。对于做射血时间这类分析,这个偏移会直接进入结果;对于做形态学分析,影响不大。
这不是否定数据的价值,而是给它定一个可信的精度边界。任何声称在毫秒级发现跨模态差异的结论,都应当先排除这个偏移的可能。
8.5 脉搏波的人工标注
脉搏波需要人工标注,理由是它的形态变异大,自动检测不可靠。
标注的依据是视觉检查加协议定义的间期。协议具体定义了哪些间期,文档没有详列。这意味着标注的一致性无法从文档判断,只能从数据里看。
人工标注的量不小——三十余条记录,每条若干心拍。这个工作量解释了为什么脉搏波只在后期加入,也解释了为什么没有补采前面的记录。
§9 术语与口径速查
| 术语 | 英文 | 含义 |
|---|---|---|
| 阻抗心动图 | impedance cardiography, ICG | 通过胸部阻抗变化推断心搏量的方法 |
| C 波 | C wave | 阻抗导数曲线的最小值,近似主动脉瓣开放 |
| X 点 | X point | 阻抗导数曲线的切迹,近似主动脉瓣关闭 |
| B 点 | B point | C 波之前的起点,近似主动脉瓣开放起始 |
| 射血前期 | pre-ejection period, PEP | 心电 R 峰到主动脉瓣开放的时间 |
| 左室射血时间 | left ventricular ejection time, LVET | 主动脉瓣开放到关闭的时间 |
| 主动脉瓣开放时刻 | AVO | 超声或多模态给出的直接观测 |
| 主动脉瓣关闭时刻 | AVC | 同上 |
| 同步质量 | synchronization status | 百分之一百减去误差乘一万 |
| Pan-Tompkins | — | 经典的 QRS 检测算法 |
三个口径要分清。
「记录」指一个 h5 文件,是一条完整采集。
「段」指测量矩阵里的一个单元格,是一条记录里某个模态的一段数据。
「拍」指一个心动周期,是最小的分析单位。一条记录通常含数十到数百拍。
§10 事实清单与附录
10.1 核心事实
| 项 | 值 |
|---|---|
| 全名 | HeartCycle: A comprehensive dataset of synchronized impedance cardiography and echocardiography for accurate hemodynamic predictions |
| 版本 | 1.0.0 |
| 发布日期 | 2025-11-02 |
| DOI(本版) | 10.13026/z865-eb23 |
| DOI(最新) | 10.13026/1cma-6q61 |
| RRID | SCR_007345 |
| 访问 | 完全开放 |
| 许可 | Open Data Commons Attribution License v1.0 |
| 伦理批号 | CES-238 |
| 项目 | EU FP7 HeartCycle(FP7-216695) |
| 受试者 | 17 名健康志愿者 |
| 记录数(文档) | 208(32 / 84 / 92) |
| 记录数(按文件核对) | 212(37 / 83 / 92) |
| 压缩包 | 约 1.3 GB |
| 解压后 | 约 2.3 GB |
| 格式 | HDF5 |
| 设备数 | 4 |
| 采样率 | 200 / 136 / 500 / 44100 Hz |
10.2 四台设备与通道
| 设备 | 心电 | 主信号 | 采样率 |
|---|---|---|---|
| Niccomo | 是 | 阻抗(原始,欧姆) | 200 Hz |
| Vivid 超声 | 是 | 超声(三维,M 型或多普勒) | 136 Hz |
| V26 监护仪 | 是 | 脉搏波 | 心电 500 / 脉搏 125 Hz |
| Meditron 听诊器 | 是 | 心音 | 44100 Hz |
10.3 组 ID 分段
| 段 | 设备 | 内容 |
|---|---|---|
| 000–029 | Niccomo | 生理参数(血压、心输出量、外周阻力等) |
| 030–036 | Niccomo | 心电、阻抗、R 峰、AVO、PEP、AVC、LVET |
| 060–066 | 听诊器 | 心电、心音、R 峰、AVO、PEP、AVC、LVET |
| 090–096 | 超声 | 心电、超声图像、R 峰、AVO、PEP、AVC、LVET |
| 120–126 | 监护仪 | 心电、脉搏波、R 峰、AVO、PEP、AVC、LVET |
10.4 附录 A:读一条记录的最短代码
import h5py
import numpy as np
path = "59146237/measure/CH01_59146237_s0000029.h5"
with h5py.File(path, "r") as f:
-- 阻抗与心电,均为二维,取第一行
icg = f["measure"]["value"]["_031"]["value"]["data"]["value"][0, :]
ecg = f["measure"]["value"]["_030"]["value"]["data"]["value"][0, :]
-- 采样率存在速率组里,不能假定
fs = float(f["measure"]["value"]["_031"]["value"]["_Rate_"][...][0])
-- 阻抗是原始信号,必须求导
-- 求导前先低通,压掉呼吸与运动噪声
def lowpass(x, fs, fc=20.0, order=3):
from scipy.signal import butter, filtfilt
b, a = butter(order, fc / (fs / 2), btype="low")
return filtfilt(b, a, x)
dt = 1.0 / fs
dz = np.gradient(lowpass(icg, fs), dt)
-- C 波:以 R 峰为锚,在周期内找导数最小值
rpeaks = f_rpeaks -- 从 _032 读
for i in range(len(rpeaks) - 1):
a, b = int(rpeaks[i] * fs), int(rpeaks[i + 1] * fs)
seg = dz[a:b]
if seg.size == 0:
continue
c_index = a + int(np.argmin(seg))
c_time = c_index * dt
四处容易出错。
第一处,路径层级深,键名是 measure/value/组ID/value/data/value,少一层就报错。
第二处,[0, :] 里的第一维是通道维,不是时间维。取错会得到一条极短的数组。
第三处,采样率不能硬编码。两百是阻抗的,一百三十六是超声的,混用会让时间轴错位。
第四处,求导前必须滤波。不滤波直接对原始阻抗求梯度,得到的曲线被呼吸漂移主导,找不到 C 波。
10.5 附录 B:六个可立即验证的疑问
一、按校验和文件统计,三个目录的 h5 文件数各是多少。与文档的 32/84/92 比。
二、文件名前缀是 CH 还是 CHC。直接列目录看。
三、受试者分布表的记录数列求和是多少。与正文总数比。
四、含脉搏波的记录有多少条,是否全在第一个目录。
五、把阻抗求导前后各画一张图,看 C 波在哪个版本里明显。
六、超声组的 AVO 与阻抗 C 波的时间差,分布范围是多少。
10.6 附录 C:证据链
| 事实 | 来源 | 核对方式 |
|---|---|---|
| 受试者 17 名、健康 | 说明文件 | 直接读取 |
| 记录数 208 / 32 / 84 / 92 | 说明文件正文 | 直接读取 |
| 记录数 212 / 37 / 83 / 92 | 校验和文件 | 本页解析统计 |
| 受试者编号 CHC01–CHC17 | 说明文件表 1 | 直接读取 |
| 受试者编号 CH01–CH17 | 文件名校验和 | 本页解析统计 |
| 表 1 记录数列合计 219 | 说明文件表 1 | 本页求和 |
| 四种采样率 | 说明文件 + 表 2 | 两处交叉 |
| 组 ID 映射 | 映射表(分号分隔,Latin-1) | 直接读取 |
| 许可、DOI、伦理批号 | 条目页 | 直接读取 |
编辑说明
本页基于 PhysioNet 条目页(2026-10-19 取)与随包发布的说明文件、映射表、校验和文件写成。§4 中的三处文档与文件不一致均为本页按文件核对所得:解析校验和文件统计 h5 文件数与受试者编号前缀,对表 1 的记录数列求和。这些数字可用同样方法复现。
未覆盖部分:未下载 h5 数据文件本体(体量约 1.3 吉字节),因此 §2 与 §10.4 中关于组内维度、速率组位置、超声三维结构的描述依据映射表与说明文件,未逐文件验证。§10.5 的问题需要下载后自行核对。
凡属分析性判断的段落(§5.1 对偏倚估计精度的推算、§8.2 与 §8.3 对同步机制的推断、§8.4 对硬件同步缺失后果的讨论、§7.4 规模定位)均为基于公开材料的分析,非官方结论。同步机制部分说明文件未明写,本页是从流程描述推断,引用时请注明是推断。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- cardiowave-portable — 共享标签:生理信号 / 心血管疾病 / 多模态 / 心电信号
- echonext — 共享标签:生理信号 / 心血管疾病 / 多模态 / 心电信号
- wctecgdb — 共享标签:生理信号 / 心血管疾病 / 心电信号
- mimic-iv-ecg — 共享标签:生理信号 / 心血管疾病 / 多模态 / 心电信号
- cves — 共享标签:生理信号 / 心血管疾病 / 多模态
- bigideaslab-step-hr-smartwatch — 共享标签:生理信号 / 心血管疾病 / 多模态
- ephnogram — 共享标签:生理信号 / 多模态 / 心电信号
- qol-stress — 共享标签:生理信号 / 多模态 / 心电信号
- cerebral-vasoreg-diabetes — 共享标签:生理信号 / 心血管疾病 / 多模态
- dreamer — 共享标签:生理信号 / 多模态 / 心电信号
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

