导管尖端的房颤 — IAFDB 心内房颤数据库

8 位患者 / 32 条记录 / 1 kHz 八通道

来源 https://physionet.org/content/iafdb/1.0.0/发布时间: 2026-10-28最后更新: 2026-10-28 阅读 12
导管尖端的房颤 — IAFDB 心内房颤数据库

信息速览

数据集名称导管尖端的房颤 — IAFDB 心内房颤数据库
数据类型时序信号,波形,元数据,补充材料
规模8 位患者 / 32 条记录(每位四个导管位置各一条)
接入方式https://physionet.org/content/iafdb/1.0.0/
AI 就绪度

心内房颤数据库(Intracardiac Atrial Fibrillation Database,iafdb)是 PhysioNet 上一个体量很小、取材位置很偏的数据集:八位房颤或房扑患者,在一次电生理检查中把一根十极导管依次放到右心房的四个位置,同时录下五路心内双极信号与三路体表心电,全部按 1 kHz、14 位量化,共三十二条记录。

它偏在两点。一是通道取自心腔内部,测的是电极贴壁处的局部心房电活动,而不是体表投影;二是它没有节律标注,也没有校准过的毫伏刻度,附带的一套 QRS 注释由自动检测器一次生成、从未人工校对。这两点决定了它更像一小份可用于验证机制假设的原始素材,而不是一块能直接喂给模型的训练集。

全库未压缩 102.8 MB,按 ODC-BY 1.0 授权,下载不需要注册。下文先说清它能回答什么、不能回答什么,再逐层拆开文件结构、采集场景与取数路径。一屏速览见下表。

维度 内容
全名 Intracardiac Atrial Fibrillation Database
常用缩写 iafdb
托管平台 PhysioNet(MIT 主导的生理信号数据平台)
版本与日期 1.0.0,2003 年 3 月 4 日发布,此后未再修订
贡献方 Creare, Inc.;致谢列出 Jon Peterson 与 Dave Kynor
受试者 8 位,心房颤动或心房扑动,年龄 58–81 岁,五男三女
记录数 32 条,每位患者四个导管位置各一条
通道 每条 8 路:5 路心内双极 + 3 路体表心电
采样与量化 1000 Hz,14 位,幅度未校准
单条时长 48.0 秒至 1369.3 秒,全库合计约 1.86 小时
标注 仅 QRS 位置,sqrs 自动生成,未校正
体积 未压缩 102.8 MB
许可 ODC-BY 1.0,署名即可商用
DOI 10.13026/C23S33
官方入口 https://physionet.org/content/iafdb/1.0.0/

§1 它要解决的具体麻烦

1.1 体表心电看不见心房正在做什么

心房颤动在体表心电图上的样子,是一串细而不规则的 f 波,幅度常在 0.1 毫伏量级,还要和 QRS 波群、T 波抢同一段时间轴。想把 f 波单独拿出来,得先做模板减除,减除的残差里又混着残余 QRS 与基线漂移。也就是说,体表信号里关于心房的信息一直都在,只是被压在别的东西下面。

心内电图绕开了这个问题。电极贴在心房壁上,测的是几个毫米范围内的心肌除极,幅度比体表大一到两个数量级,不受心室远场主导,也不需要减除。代价是必须做有创检查:导管要进心腔,患者要在导管室里躺上一段时间,记录只能在这段时间里完成。这就是为什么公开的心内电图库远比体表库稀少——它天然是临床操作的副产品,不是可以随手收集的数据。

iafdb 就是这样一个副产品。它记录的不是「一个患者的一次房颤」,而是「一根导管在四个位置各停一会儿时,附近心肌在做什么」。前者是诊断问题,后者是机制问题。

1.2 三条常见的错误期待

期待一:把它当成房颤检测的训练集。 库里有三十二条记录,八位患者,没有一条写明「第几秒到第几秒是房颤」。房颤与房扑的分界、发作与终止的时刻,全靠使用者自己从波形上判断。拿它训练分类器,标签是二次构造的,构造规则一旦不写清楚,结果就无法复现。

期待二:把它当成 afdb 或 ltafdb 的补充训练数据。 那两者是体表长时程记录,采样率 250 Hz 与 128 Hz,通道数是 2;这里是心内八通道、1 kHz。通道语义、幅度量纲、噪声结构全部不同,混在一起训练不会增加样本量,只会增加一个需要解释的域差异。

期待三:以为 1 kHz 加 14 位就等于高保真。 采样率确实够高,1 毫秒的时间分辨率足以看清局部激动的时间差;但幅度没有校准,增益字段写的 3277 只是个名义值。频率成分可信,绝对幅度不可信,这个区分决定了能做频谱分析而不能做幅度比较。

1.3 它能给到的与给不到的

你的需求 它给的 够不够
看清心房局部激动的时序 5 个极对沿导管排列,同一时刻的局部电图 够,但只沿一条线
计算心房激动的主导频率 1 kHz 采样,频率分辨率足够 够,需自己选窗与去趋势
观察药物对房颤的影响 游离壁记录含给药与洗脱全过程 够,但只有两种药、八个案例
训练房颤检测或分类模型 无节律标签,无独立测试集 不够
做多导联体表心电算法 只有 3 路体表,且导联组合不统一 不够
做心房解剖或影像配准 只有四张示意照片,无坐标 不够
比较不同患者的信号幅度 幅度未校准 不够

1.4 你的处境与它能帮到的事

你的处境 它能帮你什么 下一步该做什么
在验证一个从心内电图估计主导频率的算法 提供 1 kHz、多极对、真实房颤与房扑波形 固定窗长与去趋势方法,逐记录报告,不要跨患者汇总
在做一个导管标测系统的回放或可视化 八通道同步、时间对齐、体表与心内可对照 用 §2.3 的读取流程按记录拼出多轨视图
想研究腺苷或异丙肾上腺素对房颤频率的作用 游离壁记录含给药前后与洗脱段 以头文件给出的近似秒数为锚点,前后各取固定窗
在教心内电图与体表心电的关系 同一时刻两路都在,可逐拍对照 取一条短记录,先看体表再看心内
需要一份体量极小、能反复重跑的压力测试素材 全库百兆,一次下载可完整放进内存 把它当作管线冒烟测试,不当评测集
在给一篇机制论文找公开可引用的原始数据 有 DOI 与固定版本号 引用时写清版本与记录名,见 §9.3

1.5 一句话判断

它不是用来教会模型认出房颤的,而是用来让一条从心腔内取数的管线跑通、并且让「局部激动到底长什么样」这个问题有一个可复现的答案。

1.6 不适合谁:四条边界

不适合拿它做任何患者级统计。 八个人,五男三女,年龄集中在五十八到八十一岁,全部是接受电生理检查的房颤或房扑患者。这既不是人群样本,也不是连续入组,任何「房颤患者的平均某指标」都不会成立。

不适合拿它做节律检测的评测。 没有节律段标注,就没有可对齐的真值区间。哪怕自己标一遍,也只有一个人标过,没有一致性检验,评出来的数字无法与别人的结果比较。

不适合拿它做左心房相关的工作。 导管只进右心房,四个位置全在右心系统。肺静脉口、左房后壁、左心耳这些消融靶点区域,一条记录都没有。

不适合拿它做绝对幅度的比较。 心内双极的幅度取决于电极与心肌的接触压力、极间距、组织阻抗,同一患者不同时刻都能差出几倍。官方在每个头文件里都写了未校准,这不是可以绕过的技术细节。

§2 数据构成与规格

2.1 一条记录由三个文件组成

数据库沿用 WFDB 格式。这是 PhysioNet 从 1980 年代沿用至今的生理信号存储规范,一条记录由同名三个文件构成:.hea 是纯文本头文件,第一行写记录名、信号路数、采样率与每条信号的采样点数,随后每路信号一行,声明存储格式、增益、位宽、基线、初始值与校验和;.dat 是二进制信号本体,八路信号按采样点交错存放;.qrs 是二进制注释文件,只存 QRS 波的位置。

三者缺一不可。只拿 .dat 无法还原物理量,因为增益与位宽写在头文件里;只拿 .qrs 不知道这些时刻对应什么波形;只拿 .hea 更是什么都拿不到。目录里另有两份清单:RECORDS 是三十二行纯文本,逐行列出记录名;ANNOTATORS 只有一行,原文是「qrs unaudited beat annotations」,一句话交代了注释的性质——心搏注释,且未经审核。figures 子目录放六张示意图:五张是导管在心脏模型中的摆位,一张是整体位置图。

附属文件各司其职:RECORDS 是三十二行纯文本,逐行一个记录名,批量循环时直接读;ANNOTATORS 只有一行,声明注释的性质;SHA256SUMS.txt 是逐文件校验和,2019 年补入;figures 目录放六张示意图,五张是导管在各位置的摆位,一张是右心房与右心室的剖面总图。没有任何一个文件是可删的冗余——RECORDS 省掉了手工拼记录名,ANNOTATORS 提前说清了标注的成色,校验和则让「下载是否完整」有了客观判断。

2.2 字段与记录的完整字典

位置 字段 含义 取值示例
.hea 第 1 行 记录名 患者编号加导管位置 iaf1_afw
.hea 第 1 行 信号路数 固定为 8 8
.hea 第 1 行 采样率 每秒采样点数,全库一致 1000
.hea 第 1 行 采样点数 每路信号的样本数 154500
.hea 信号行 存储格式 16 表示每样本两字节整数 16
.hea 信号行 增益 名义增益,单位为每毫伏的整数单位数 3277
.hea 信号行 位宽 量化位数 14
.hea 信号行 基线 零电平对应的整数值 0
.hea 信号行 初始值 第一个样本的整数值 -578
.hea 信号行 校验和 全段样本累加和 -3020
.hea 信号行 信号名 体表导联名或心内极对名 V1 / CS34
.hea 注释行 年龄 整数,岁 81
.hea 注释行 性别 M 或 F F
.hea 注释行 诊断 自由文本,三种写法并存 Atrial Flutter
.hea 注释行 用药 药名清单,逗号分隔 Atenolol, Monopril
.hea 注释行 注射时刻 药名加秒数,可多次 Adenosine injected at 120, 261 sec
.qrs 注释位置 采样点序号,除以 1000 得秒 1104
.qrs 注释类型 全库只有一种 N

2.3 一条记录的完整解剖

以 iaf1_afw 为例,头文件只有十三行,信息密度很高:

 iaf1_afw 8 1000 154500
 iaf1_afw.dat 16 3277 14 0 -578 -3020 0 II
 iaf1_afw.dat 16 3277 14 0 150 28612 0 V1
 iaf1_afw.dat 16 3277 14 0 -355 -27642 0 aVF
 iaf1_afw.dat 16 3277 14 0 -101 -12342 0 CS12
 iaf1_afw.dat 16 3277 14 0 213 -15468 0 CS34
 iaf1_afw.dat 16 3277 14 0 189 -27328 0 CS56
 iaf1_afw.dat 16 3277 14 0 -207 29875 0 CS78
 iaf1_afw.dat 16 3277 14 0 -274 3520 0 CS90
 # <age>: 81 <sex>: F <diagnosis>: Atrial Fibrillation
 # <medications>: Atenolol, Monopril
 # Adenosine injected at 70 sec
 # Note: signals are uncalibrated

第一行四个数依次是记录名、八路信号、1000 Hz、每路 154500 个采样点。用采样点数除以采样率,得到 154.5 秒。后八行是逐路声明,格式码 16 表示每样本两个字节,增益 3277、位宽 14、基线 0,随后是初始值、校验和、块大小与信号名。

注意最后四行。年龄性别诊断写在一行,用药写在一行,注射时刻单独一行,最后一行是「信号未校准」。这四行是目前全部临床上下文——没有体重、没有左房内径、没有房颤病程、没有既往消融史,也没有随访。

把这条记录读进内存只要三行:

import wfdb

rec = wfdb.rdrecord('iaf1_afw', pn_dir='iafdb')
print(rec.fs, rec.sig_len, rec.n_sig, rec.sig_name, rec.units)
#-- 1000 154500 8 ['II','V1','aVF','CS12','CS34','CS56','CS78','CS90']
print(rec.comments)

units 会显示 mV,但这个 mV 只是名义单位:增益字段 3277 换算出的数值没有经过校准验证。凡是需要幅度的分析,都应当先把每路信号按记录内部分位数做归一化,再比较。

2.4 三十二条记录的逐项参数

记录 时长(秒) 采样点 首路体表导联 QRS 注释数 信号体积(MB)
iaf1_afw 154.5 154500 II 189 2.5
iaf1_ivc 51.5 51500 II 64 0.8
iaf1_svc 57.5 57499 II 74 0.9
iaf1_tva 59.5 59500 II 75 1.0
iaf2_afw 230.5 230500 I 343 3.7
iaf2_ivc 67.5 67500 I 104 1.1
iaf2_svc 54.5 54500 I 81 0.9
iaf2_tva 64.0 64000 I 93 1.0
iaf3_afw 814.0 814000 I 998 13.0
iaf3_ivc 66.5 66500 I 78 1.1
iaf3_svc 99.5 99500 I 117 1.6
iaf3_tva 48.0 48000 I 56 0.8
iaf4_afw 1369.3 1369253 I 1169 21.9
iaf4_ivc 60.7 60688 I 32 1.0
iaf4_svc 58.0 57978 I 29 0.9
iaf4_tva 67.5 67513 I 31 1.1
iaf5_afw 811.5 811500 I 810 13.0
iaf5_ivc 63.0 63000 I 52 1.0
iaf5_svc 183.0 183000 I 160 2.9
iaf5_tva 52.5 52500 I 38 0.8
iaf6_afw 361.5 361500 I 355 5.8
iaf6_ivc 58.0 58000 I 55 0.9
iaf6_svc 49.0 49000 I 47 0.8
iaf6_tva 54.5 54500 I 51 0.9
iaf7_afw 661.5 661500 II 1460 10.6
iaf7_ivc 111.5 111500 II 272 1.8
iaf7_svc 146.5 146500 II 356 2.3
iaf7_tva 117.5 117500 II 323 1.9
iaf8_afw 537.0 537000 I 790 8.6
iaf8_ivc 59.0 59000 I 96 0.9
iaf8_svc 51.5 51500 I 88 0.8
iaf8_tva 56.0 56000 I 85 0.9

表里的时长与信号体积是由头文件的采样点数换算的,QRS 注释数是逐个读取 .qrs 文件得到的,官方页面没有给出这两个口径。三十二条相加,全库合计六千六百九十六点四秒,约一点八六小时;其中游离壁八条合计四千九百三十九点八秒,占去四分之三以上的时长,其余二十四条多数在一分钟上下。

这个不均衡不是设计失误,而是采集流程的副产品:四个位置各停一次是标准动作,只有游离壁多做了一段药物观察。使用时如果按记录平均,等于给了游离壁记录八倍以上的权重;按秒加权才接近真实的时间分布。

2.5 信号命名:CS 是极对编号,不是解剖坐标

心内五路的名称是 CS12、CS34、CS56、CS78、CS90,从导管远端到近端排列。CS 是冠状窦导管的惯用前缀,但在这个库里,导管并没有停在冠状窦,而是在右心房的四个位置之间移动。也就是说,名字沿用的是导管型号的默认编号,与当时导管尖端在心脏里的实际位置无关。

信号名 官方解释 实际解剖含义 使用时要注意
CS12 远端双极 取决于本记录的位置后缀 记为「位置 + 远端」才安全
CS34 第二双极 同上 与 CS12 相距 7 毫米
CS56 第三双极 同上 中间位置,方向感最弱
CS78 第四双极 同上 靠近近端
CS90 近端双极 同上 名称里的 90 是缩写,不是 9-10 的误写

十个电极按 2-5-2 毫米的间距排布:一对电极内相距 2 毫米,相邻两对之间隔 5 毫米,于是双极中心距为 7 毫米。这个几何关系是理解「五个通道其实是沿一条直线的时间采样」的关键——同一波前依次经过五个极对,通道之间的时间差乘以 7 毫米,就是这一小段上的传导速度估计。

官方页面给出的极对写法是「CS12, CS34, … , CS90」,中间用省略号跳过。头文件里能确认的实际名称是五个:CS12、CS34、CS56、CS78、CS90。最后一个不是 CS910,也不是 CS9-10,就是 CS90 三个字符。写脚本时按头文件里的字符串匹配,不要按「数字递增」的规则去拼名字。

2.6 与同类资源的字段差异

维度 iafdb afdb ltafdb incartdb
信号来源 右心房心内 + 体表 体表 体表 体表
记录数 32 25 84 75
每记录通道 8 2 2 12
单条时长 48 秒至 22.8 分钟 10 小时 24 小时 30 分钟
采样率 1000 Hz 250 Hz 128 Hz 257 Hz
幅度校准 无 有 有 有
节律标注 无 有 有 无
心搏标注 自动,未校正 自动 + 人工修订版 自动 + 人工 有
整库体积 102.8 MB 数百 MB 数 GB 数百 MB

这张表回答的是「同一类任务该挑哪一个」。要做房颤检测,iafdb 在第一行就出局:没有节律标注。要做心内电图的信号处理,另外三个库在「信号来源」一栏就出局:它们根本没有心内通道。两个方向的淘汰都很干脆,中间地带很窄。

§3 它是谁的八个心房:一间工程公司的副产品

3.1 贡献者与机构

官方页面的致谢只有一句话:感谢 Creare, Inc. 的 Jon Peterson 与 Dave Kynor 慷慨提供这批记录,以及上文的位置说明与示意图。页面上没有医院署名,没有通讯作者(需要登录才能查看),也没有列出任何一篇配套论文。

这一点与多数 PhysioNet 心电库不同。afdb 的源头是 1983 年波士顿贝斯以色列医院的动态心电磁带,ltafdb 的源头是西北大学的长期监护记录,两者都能追到具体的临床科室与采集协议。iafdb 追到的是一家工程公司,记录随附的是导管摆位示意与心脏模型照片,形态上更像一次技术演示的留存,而不是一次临床研究的归档。

这不影响数据本身的价值,但影响引用方式。没有方法学论文,就没有一段文字可以引用来说明「采样怎么做的、患者怎么选的、标注谁做的」。所有背景只能回到 PhysioNet 的项目页,而项目页只有六百余字。做研究时这意味着一件事:方法段落里关于数据来源的描述,必须自己写,不能靠引一篇论文带过。

3.2 时间线

时间 事件 依据
官方未标注 记录采集于某次电生理检查 页面无采集年份
2003-03-04 1.0.0 版上线 PhysioNet 项目页版本信息
2003-03-01 目录内文件时间戳 逐文件修改时间
2019-02-20 补入 SHA256SUMS.txt 校验和文件时间戳
此后 无新版本,仍为 1.0.0 项目页版本列表仅一项

二十多年只有一个版本,这在 PhysioNet 上并不罕见,但也说明它没有被持续维护。没有勘误、没有追加记录、没有注释修订。使用者拿到的就是 2003 年那一份,未来大概率也不会变——对可复现性是好消息,对数据质量不是。

3.3 采集场景:一次电生理检查里的四个停靠点

十极导管从静脉进入右心,在四个位置各停一次。官方给出的位置定义很具体:

位置后缀 全称 官方定义 记录时长范围
svc 上腔静脉口 导管远端(CS12)靠近上腔静脉环 49.0–183.0 秒
ivc 下腔静脉口 导管近端(CS90)靠近下腔静脉环 51.5–111.5 秒
tva 三尖瓣环 导管远端(CS12)靠近三尖瓣环 48.0–117.5 秒
afw 心房游离壁 整根导管贴在心房游离壁上 154.5–1369.3 秒

四个位置覆盖了右心房的一圈:上口、下口、三尖瓣环一侧与游离壁一侧。这不是标测,而是「沿着腔壁取几个样本」。导管在腔内的朝向随位置而变,所以五个极对指向的空间方向也随记录而变——svc 记录里的 CS12 与 afw 记录里的 CS12,可能看向几乎相反的方向。

figures 子目录里的五张图说明了这一点:上腔静脉口位置,导管贴在后壁;三尖瓣环位置,电极贴着间隔;下腔静脉口位置,近端在上、电极贴后壁;游离壁位置,心房被「掀开」以显示贴壁。另有 1 张总图给出右心房与右心室的剖面。这些图是唯一的位置证据,没有坐标,也没有与影像的配准。

3.4 八位患者与他们的用药

头文件把临床信息压成了四行。下表按记录前缀汇总,年龄、性别、诊断、用药均照抄头文件原文:

前缀 年龄 性别 诊断 用药(原文) 激发药与时刻
iaf1 81 F Atrial Fibrillation Atenolol, Monopril 腺苷 70 秒
iaf2 79 M Atrial Fibrillation Coreg, Digitalis, Diovan 腺苷 123 秒
iaf3 67 F Atrial Fibrillation Norvasc, Metroprolol, Altace 异丙肾上腺素 69 秒
iaf4 58 M Atrial Fibrillation Diltiazem, Metoprolol, Digitalis 异丙肾上腺素 343、547 秒
iaf5 76 M Atrial Flutter Lopressor 异丙肾上腺素 94、214 秒
iaf6 78 M Atrial Fibrillation Metoprolol, Digitalis, Prinivil 腺苷 146 秒
iaf7 79 F Atrial Fib/Flutter Propafenone 异丙肾上腺素 341 秒
iaf8 68 M Atrial Flutter Atenolol 腺苷 120、261 秒

几点值得记下。诊断有三种写法:五条写心房颤动,两条写心房扑动,一条写「房颤/房扑」,官方页面则统称「atrial fibrillation or flutter」,两种口径并存。用药一栏混着通用名与商品名——Metoprolol 与 Lopressor 是同一种药,Norvasc 是氨氯地平,Prinivil 与 Monopril 都是 ACE 抑制剂。年龄五十八到八十一岁,没有一位年轻患者。

药物激发按患者分组,不是随机分配:腺苷给了 iaf1、iaf2、iaf6、iaf8,异丙肾上腺素给了 iaf3、iaf4、iaf5、iaf7。两种药的作用机制相反——腺苷短暂抑制房室结传导并缩短心房动作电位时程,异丙肾上腺素提高交感张力、加快心房率。把它们放在一起看,等于有了两个方向的扰动样本,每组各四人。

3.5 为什么这批记录只能出自导管室

心内电图无法在门诊、病房或家中获得。它要求导管已经在心腔里,而导管进心腔意味着一次有创操作:穿刺、肝素化、X 线透视、可能的并发症风险。因此这类数据的三个特征全都由场景决定。

第一是短。患者不会在导管室里躺十几个小时,每次停靠能录几十秒到几分钟已经够用。全库合计不到两小时,与 afdb 的二百五十小时不在一个量级。

第二是贵。三十二条记录背后是八次电生理检查,每次都有团队、耗材与设备成本。这解释了为什么公开的心内电图库极少:不是因为没人想要,而是因为产不出来。

第三是附带信息天然贫乏。导管室的注意力在操作本身,临床背景、既往史、影像测量都不在记录流程里。头文件只有四行,不是贡献方偷懒,而是能顺手记下的就这些。

3.6 与「体表长时程」的根本差别

把 iafdb 和 afdb 并列,最容易犯的错是只看到「都是房颤数据」。真正的差别在于测量对象:一个测的是心腔壁上一个点的跨膜电活动,一个测的是整个心脏电活动在体表的远场投影。前者给出时间与位置,后者给出时间与形态。

这个差别会传导到每一个下游环节。心内信号不需要 QRS 减除,因为心室远场本来就弱;体表信号必须减除,否则 f 波看不见。心内信号的幅度与电极接触有关,体表信号的幅度与体型、电极位置有关。心内信号能做传导速度估计,体表信号只能做整体节律判断。

所以两者不是大小样本的关系,也不是新旧版本的关系,而是两种不同的观测。选错观测,后面的算法再精细也补不回来。

§4 它最独特的东西:一根导管上的五个听诊点

4.1 心内与体表:六个维度的对照

维度 心内电图(本库) 体表心电图(afdb、ltafdb)
测量对象 电极附近数毫米心肌的局部除极 全心电活动在体表的投影
幅度量级 毫伏到十几毫伏 0.05–2 毫伏
心室干扰 弱,多数记录中 QRS 只是小尖峰 强,常需模板减除
空间信息 5 个已知间距的采样点 2 至 12 个固定导联
时间分辨率 1 毫秒 4 至 8 毫秒
可做的分析 传导速度、激动顺序、碎裂、主导频率 节律分类、心率变异性、形态学

这张表解释了一个常见困惑:为什么用体表数据做房颤机制研究总是差一口气。不是方法不够好,是观测本身丢掉了空间维度——体表十二导联再多,也是远场投影的线性组合,无法反解出心房壁上某一点的激动时刻。

4.2 五个极对等于一条线上的五个时间戳

导管上五个双极沿直线排开,间距 7 毫米。同一个波前扫过这五个极对时,会在五个通道上依次留下一个陡峭的局部偏转。把五个偏转的时刻按通道顺序排好,就得到一条「激动沿导管传播」的时间序列。

这条序列能支撑三类分析。第一类是传导速度:相邻通道的时间差除以 7 毫米,得到这一小段上的表观速度;房颤时这个值常在每秒几十厘米量级波动。第二类是激动顺序:时间差的正负号告诉你波前是从远端走向近端,还是反过来,这在研究功能性阻滞时是关键证据。第三类是方向一致性:五个通道的时间差如果接近线性,说明是单一波前通过;如果次序颠倒、出现双峰,说明有多个波前或局部折返。

三类分析都有同一个前提:极对真的贴在一条直线上,且间距如官方所述。导管是柔性的,贴壁时会弯曲,7 毫米只是名义值。凡是报告绝对速度的论文,都应当把这个不确定性写进限制。

4.3 案例:iaf4_afw 的二十二分钟

iaf4_afw 是全库最长的一条记录,1369.3 秒,二十二分四十九秒,也是唯一一条长到能看清「给药—起效—洗脱」完整过程的记录之一。它来自一位五十八岁男性,诊断心房颤动,平时服用硫氮卓酮、美托洛尔与地高辛,术中在 343 秒与 547 秒两次注射异丙肾上腺素。

这条记录的结构可以分成四段:注射前的基线段,第一次给药后的起效段,第二次给药前后的叠加段,以及最后约八百秒的洗脱段。头文件只给了两个时刻,没有给剂量,也没有给「起效」的定义,所以分段边界要靠波形自己判断。

iaf4_afw 的另一处特殊在于它的 QRS 注释密度。整条记录 1169 个 QRS 注释,平均每分钟五十一次,是八位患者里最慢的;而同一位患者另外三条记录(iaf4_svc、iaf4_ivc、iaf4_tva)分别只有 29、32、31 个注释,折算每分钟三十次上下。这个差异提示心室率在长时间记录中并不恒定,也提示自动检测器在长记录上的行为与其他记录不同。

§2.4 的表里可以看到,iaf4_afw 的信号体积 21.9 MB,占全库五分之一。单条记录就能把整库的体量感拉高一个档,这也是为什么下载时按记录挑选比整包下载更实用。

4.4 标注只有一层:QRS,且未经校正

ANNOTATORS 文件把这个库的标注状况说得很清楚:qrs unaudited beat annotations。翻译过来是「心搏注释,未审核」。

生产方式是 sqrs,WFDB 软件包里附带的一个经典单导联 QRS 检测器。官方原话是这些注释「可能对开始研究这些记录有用」,措辞相当保守。全库注释只有一种符号 N,不区分正常搏、室早或差异传导;也没有节律段标注,房颤、房扑、窦性心律的区间一概没有。

标注层级 本库 afdb ltafdb
心搏位置 有,自动未校正 有,另有校正版 有
心搏类型 全部标 N 全部标 N 按类型标注
节律段 无 有,四类 有,含终止标记
信号质量 无 部分 部分
起搏或伪差标记 无 部分 有伪差标记

这张表最右一列不是用来比较优劣,而是说明一个事实:在本库上做任何需要「真值区间」的评测,真值都得自己造,而自造的真值无法与别人的结果对齐。

4.5 边界条件:什么情况下它不再适用

当你要判断「这段是不是房颤」时。 没有任何一段被标为房颤或非房颤。哪怕整条记录都是房颤,也没有一个字节告诉你从第几秒开始。

当你要做频率分析并且需要绝对幅度时。 频谱形状可用,峰值频率可用,但功率的绝对值不可跨记录比较。

当你要做电极位置相关的建模时。 只有四张示意图,没有坐标,没有与 CT 或透视的配准。任何「CS34 位于某解剖坐标」的假设都没有依据。

当你的样本量需求超过八个人时。 这不是边界条件,这是硬墙。

§5 怎么拿到:一百兆之内的完整闭环

5.1 目录结构与下载面

整库未压缩 102.8 MB,三十二组文件加两个清单与一个图片目录。PhysioNet 提供三种取法:网页逐个下载、wget 递归抓取、AWS 开放数据桶同步。三种取法的内容完全一致,区别只在速度与是否需要断点续传。

三种取法各有适用面。网页 ZIP 最省事,点一下拿到 102.8 MB 的压缩包,适合一次拿全;逐文件下载适合只要某几条记录的场景,比如只想看某位患者的四个位置;wget 递归与 aws s3 sync 适合脚本化,前者保留原目录结构、支持断点续传,后者在云端环境里更快,且同样不需要任何凭证。

按记录挑选很实用:全库三十二条记录里,八条游离壁记录占了约 79 MB,其余二十四条合计约 28 MB。只想看基线段的话,跳过 afw 能省下七成流量。

5.2 批量下载

#-- 全库递归下载,保留目录结构,支持断点续传
wget -r -N -c -np https://physionet.org/files/iafdb/1.0.0/

#-- 或者走 AWS 开放数据桶,无需任何凭证
aws s3 sync --no-sign-request s3://physionet-open/iafdb/1.0.0/ ./iafdb

#-- 只取非游离壁记录:先拿清单,再按后缀过滤
curl -s https://physionet.org/files/iafdb/1.0.0/RECORDS \
  | grep -v afw > short.txt
while read r; do
  for ext in hea dat qrs; do
    curl -sO "https://physionet.org/files/iafdb/1.0.0/${r}.${ext}"
  done
done < short.txt

wget -r 会把 figures 目录一起抓下来,五张摆位图对理解导管朝向有用,值得保留。-c 是断点续传,-np 禁止上溯到父目录,两个参数一起用才不会把整个 PhysioNet 拖下来。

5.3 用 wfdb 直接流式读取

不下载也能读。wfdb 的 pn_dir 参数支持直接从 PhysioNet 拉取,按需读取片段:

import wfdb
import numpy as np

#-- 读头文件,不拉信号本体
hdr = wfdb.rdheader('iaf4_afw', pn_dir='iafdb')
print(hdr.fs, hdr.n_sig, hdr.sig_len, hdr.sig_name)

#-- 只取第 300 到 320 秒,避免整条载入
rec = wfdb.rdrecord('iaf4_afw', pn_dir='iafdb',
                    sampfrom=300 * 1000, sampto=320 * 1000)
x = rec.p_signal
print(x.shape)          #-- (20000, 8)
print([float(np.ptp(x[:, i])) for i in range(8)])

p_signal 已经按增益换算过,d_signal 才是原始整数。两者相差 3277 倍,混用不会报错,只会让所有幅度结论失效。

5.4 转成通用的表结构

八通道、1 kHz、几十秒到二十几分钟,最省事的落地格式是宽表:一行一个采样点,一列一个通道,另存记录名与时间戳。

import wfdb
import pandas as pd

def to_frame(record, pn_dir='iafdb'):
    rec = wfdb.rdrecord(record, pn_dir=pn_dir)
    df = pd.DataFrame(rec.p_signal, columns=rec.sig_name)
    df.insert(0, 't_sec', df.index / rec.fs)
    df.insert(0, 'record', record)
    return df

df = to_frame('iaf1_afw')
df.to_parquet('iaf1_afw.parquet', index=False)
print(df.shape, df.columns.tolist())

Parquet 比 CSV 小一个量级,且保留列类型。全库三十二条记录转完约二百多万行、八列,单机内存完全吃得下。

5.5 注释读取与心率换算

import wfdb
import numpy as np

ann = wfdb.rdann('iaf4_afw', 'qrs', pn_dir='iafdb')
t = ann.sample / 1000.0
rr = np.diff(t)
print(len(t), 'beats, median RR %.3f s' % np.median(rr))
print('rate %.1f bpm' % (60.0 / np.median(rr)))

ann.symbol 全库只有一个值 N,ann.aux_note 全是空串。这两行输出就是判定「有没有节律标注」的最快方式,动手前先跑一次,能省掉后面所有基于错误假设的分析。

QRS 注释在长记录上的可靠性要单独看。§4.3 的案例里,同一位患者的长记录折算心率五十一次每分钟,短记录只有三十次上下,差值接近七成。这既可能是真实的心率变化,也可能是检测器在长记录上的漏检或重复触发。由于注释未经校正,两种解释都无法排除,凡是把心率当作协变量的分析,都应当先自己复核一遍注释。

5.6 五个最容易出错的地方

坑 表现 处理
把 CS 当成冠状窦位置 跨记录对齐电极坐标 只用记录内的相对次序,不做绝对定位
把 mV 当校准值 跨记录比较幅度,得到几倍差异 每路按记录内分位数归一化
以为 8 路里有 4 路体表 索引 x[:, 3] 得到 CS12 而非 aVF 按 sig_name 取列,不按位置
把 QRS 注释当金标准 用未校正注释算准确率 先人工抽检若干段,报告漏检率
用 1 kHz 直接做高频分析 把肌电噪声当成碎裂电位 先看 100 Hz 以上的功率占比

第一条最隐蔽。CS 前缀在心脏病学里几乎总指冠状窦,而本库的导管在右心房四个位置移动。名字与解剖的错位不会在数据里报错,只会在论文的图注里出错。

5.7 体积与缓存:小到可以整库放进内存

全库 102.8 MB,解码成双精度浮点后约 6.7 百万采样点乘 8 通道乘 8 字节,四百余兆。这个量级意味着两件事:一是任何实验都可以在笔记本上跑完,不需要分布式;二是反复重跑的成本极低,适合当作管线冒烟测试的标准件。

但「小」也带来一个反直觉的风险:太容易过拟合。八位患者、三十二条记录,随机划分训练测试后,同一位患者的其他记录几乎必然出现在训练集里。正确做法是按患者划分,而按患者划分只有八个折,每折留一人的话测试集只有四条记录——统计效力低到无法支撑任何比较。这是体量决定的,不是方法能补救的。

§6 与库内条目的关系

6.1 关系图谱

库里与房颤相关的词条不少,但绝大多数是体表心电。iafdb 的位置可以由一张表定住:

词条 观测面 规模 是否有节律标注 与 iafdb 的关系
iafdb 右心房心内 8 人 / 32 条 无 本篇
mit-bih-afdb 体表双导联 25 条 / 10 小时 有,四类 同病种、异观测面
ltafdb 体表双导联 84 条 / 24 小时 有,含终止 同病种、异观测面
afpdb 体表双导联 50 组 / 30 分钟 以「临近发作」定义 预测任务,非机制
aftdb 体表 80 段 / 1 分钟 终止时刻 终止预测任务
physionet-cinc-2017 体表单导联 八千余条 / 9–60 秒 四分类 分类挑战赛
kingston-icu-af 体表四导联 ICU 床旁 10 秒 有 场景差异极大
lascarqs 心脏 MRI 百例级 分割标注 解剖侧,非电生理

表中「同病种、异观测面」这五个字是理解本库的关键。afdb 与 ltafdb 记录的是同一类疾病在体表的样子,iafdb 记录的是它在心房壁上的样子。两者不能互为替代,也不构成训练集与测试集的关系。

6.2 检索路径

在站内找同类资源,可以按观测面与标注类型两个维度筛:

-- 按病种找房颤相关词条,并区分观测面
SELECT record_id, url_name, title
FROM ai_ready_dataset
WHERE del_sign = 0
  AND (title ILIKE '%房颤%' OR title ILIKE '%心房%' OR url_name ILIKE '%af%')
ORDER BY record_id;

-- 找所有生理信号类、且带节律标注的库
SELECT url_name, title
FROM ai_ready_dataset
WHERE del_sign = 0
  AND category_tags::text ILIKE '%生理信号%'
  AND title ILIKE '%心电%';
你想找的东西 检索词 预期命中
心内电图 心内、intracardiac、电生理 本篇,可能另有标测类数据
房颤检测基准 房颤、AFDB、CinC 2017 afdb、ltafdb、cinc-2017
房颤终止或预测 终止、预测、PAF aftdb、afpdb
心房结构 左心房、分割、MRI lascarqs

6.3 与 afdb、ltafdb 的本质区隔

这一节最需要说清。三个库都叫「房颤数据库」,都挂在 PhysioNet,都以 WFDB 存储,都用同一套注释符号体系,因此极易被当成同一族资源的不同规模版本。实际不是。

对照项 iafdb afdb ltafdb
电极位置 右心房腔内,四个停靠点 体表,双导联 体表,双导联
观测对象 局部心肌除极 全心电活动的远场投影 同上
记录时长 秒到分钟 10 小时 24 小时
采样率 1000 Hz 250 Hz 128 Hz
通道数 8(5 心内 + 3 体表) 2 2
幅度校准 未校准 已校准,±10 毫伏 已校准
节律标注 无 有,AFIB/AFL/J/N 有,含 T 标记
典型用途 机制、传导、频谱 检测、节律分类 长时程监测、终止研究

第一行就决定了其余所有行。电极在腔内,所以时长只能是分钟级——没人会在导管室里躺十小时;所以采样率必须高——局部电图的陡峭偏转在 128 Hz 下只剩两三个点;所以幅度无法校准——贴壁压力每次不同;所以没有节律标注——整条记录本来就是房颤,标注「这一段是房颤」没有信息量。

反过来看 afdb,它的价值恰恰在于「这一段是不是房颤」这个问题有答案,因为十小时里房颤会来会走。iafdb 里房颤一直在,问题变成了「它此刻在心房壁上怎么走」。两个问题都重要,但需要的数据完全不同。

还有一层容易忽略的差别:afdb 与 ltafdb 的记录可以按患者分组做交叉验证,iafdb 只有八位患者,做不了。前者能支撑「方法在人群上有效」的结论,后者只能支撑「方法在这条记录上跑得通」。

6.4 任务与选型

你的任务 首选 理由
房颤片段检测 afdb 有逐段节律真值,时长足够
长时程房颤负荷统计 ltafdb 24 小时连续,含终止标记
单导联可穿戴房颤筛查 physionet-cinc-2017 单导联、短片段、四分类标签
心房激动频率与传导 iafdb 唯一提供心内多极对公开数据的库
药物对心房率的影响 iafdb 含给药与洗脱段
导管标测算法验证 iafdb 八通道同步、几何已知
左房结构分割 lascarqs MRI 与分割标注

6.5 什么时候该放弃它

如果任务需要「房颤与非房颤的二分类」,放弃。如果任务需要「患者级统计」,放弃。如果任务需要「左心房或肺静脉」,放弃。如果任务需要「校准过的幅度」,放弃。

留下来的场景其实很集中:凡是问题里出现「局部」「传导」「频率」「激动顺序」这几个词,且不需要人群结论的,它几乎就是公开数据里唯一的选择。这个唯一性来自心内数据的稀缺,而不是来自它做得有多好。

§7 质量评估与局限性

7.0 阅读本节前的一个前置校正

讨论质量之前要先摆正一件事:本库的很多「缺陷」其实是观测方式自带的属性,不是制作方的疏忽。幅度未校准、没有节律标注、只有八个人、时长只有几分钟——这四条如果当成质量问题去追责,结论必然是「这个库不合格」;如果当成心内记录的定义性特征去理解,结论就变成「它能做的事很窄,但在那个窄范围里没有替代品」。

第二个容易发生的误判是把「心内」等同于「更接近真相」。心内电极测的是一个点附近的电位差,它离源更近,但也更受接触状态、电极极化、导管位置的影响。把它当作体表算法的金标准,等于用一个有系统偏差的尺子去校准另一把尺子,误差不会消失,只会转移。

第三个误判是把「公开」当成「可用」。挂在 PhysioNet 上、有 DOI、有许可,说明拿得到;不说明拿到的这批数据足以支撑你想做的推断。这两件事之间隔着一整节的方法学。

7.1 五维评分

按 DAIMS 的常用维度打分,每项 1 至 5 分,针对「作为心内电图机制研究素材」这个用途,而不是针对「作为机器学习数据集」:

维度 分数 判断依据
完整性 3 通道齐全、文件成组、清单与校验和都有;缺节律标注与校准信息
准确性 3 时间轴可靠,位置靠示意图,幅度只有名义值
一致性 4 八通道、1 kHz、文件命名规则在全库内完全一致
可追溯性 3 有 DOI、固定版本、贡献方署名;无配套论文、无采集年份
可获得性 5 无需注册、无需申请、百兆级、三种下载方式

五项里可获得性满分,这是它作为教学与冒烟测试素材的最大优势;完整性只有三分,扣分全在标注与校准;一致性四分,是三个体表大库都不一定具备的整齐度——afdb 里有两条记录只剩注释文件,信号缺失,本库没有这种情况。

如果换成「作为房颤分类训练集」这个用途打分,五项会变成二、二、四、三、五,总分明显下滑。同一批数据,用途一变,分数就变,这也是为什么评分必须绑定用途。

7.2 信号的三层可信度

同一条记录里,不同属性的可信度差别很大,应该分层看待:

层次 可信度 依据 使用建议
时间轴 高 采样率固定 1 kHz,样本数与时长自洽 可直接用于毫秒级时序分析
通道身份 高 头文件逐路声明,全库一致 按 sig_name 取列即可
通道位置 中 四个位置有官方定义与示意图 只做相对次序,不做绝对坐标
波形形态 中 真实采集,但含药物与接触状态影响 形态学结论需限定在该条记录内
绝对幅度 低 官方明示未校准 只做记录内归一化后比较

分层的好处是能把「可用」与「不可用」拆开。时间轴与通道身份可以直接信,位置与形态要加限定,幅度基本不能用。很多误用不是因为数据错,而是因为把低可信层当成了高可信层。

想快速估一下某条记录的信噪状态,可以看高频段能量占比,这是判断电极接触好坏的廉价代理:

import wfdb
import numpy as np

rec = wfdb.rdrecord('iaf1_afw', pn_dir='iafdb')
x = rec.p_signal[:, 3]                  #-- CS12,第一个心内通道
x = (x - x.mean()) / (x.std() + 1e-9)
f, p = np.fft.rfftfreq(len(x), 1 / rec.fs), np.abs(np.fft.rfft(x)) ** 2
hi = p[f > 100].sum() / p.sum()
print('high-band share %.3f' % hi)

占比高说明肌电或接触噪声重,占比低说明信号干净。这个指标只能横向提示,不能当作质量门槛,因为房颤本身的碎裂电位也会抬高高频能量。

7.3 已知的、可枚举的偏差

偏差 具体表现 会污染什么结论
样本量 8 位患者,32 条记录 任何患者级推广
人群构成 58–81 岁,全部接受电生理检查 年轻患者、非转诊人群
病种混合 房颤 5 人、房扑 2 人、房扑房颤兼有 1 人 把三者当同一类处理
观测范围 只有右心房,无左房与肺静脉 左房机制、消融靶点
药物 全部患者在用抗心律失常或控制心率药物 「自然状态下的房颤」
药物激发 腺苷与异丙肾上腺素各四人,非随机 药物效应的因果推断
幅度 未校准 跨记录幅度比较
记录时长 24 条不足两分钟 需要长窗的频谱估计

第六条值得单说。药物是按患者分组的,不是随机分配的,所以「腺苷组与异丙肾上腺素组的差异」里混着患者本身的差异。八个人的分组,任何组间比较都不可能排除个体效应。§4.3 的案例里同一位患者四条记录的心率就差了三成,可见个体内部的波动已经很大。

第七条影响最广。心内双极的幅度与电极贴壁压力直接相关,压力大时幅度可翻倍。官方在每个头文件都写了未校准,这不是可以忽略的脚注,而是禁止跨记录比较幅度的明确声明。

7.4 外部验证矩阵

验证维度 本库能否支撑 说明
内部复现(同记录不同时段) 能 长记录可切前后段互测
跨记录复现(同患者不同位置) 能 每人四条,位置不同
跨患者复现 勉强 只有八人,留一法测试集仅四条
跨库复现(对体表库) 不能 观测面不同,无共同任务
与影像或解剖对照 不能 无配准、无坐标
与临床结局对照 不能 无随访、无消融结果

这张表说明它的验证能力集中在「同一批记录内部的稳定性」,出了这个圈就没有支点。写论文时如果把跨患者结果说成「泛化能力」,审稿人只要数一下患者数就会打回。

7.5 它为何能持续:唯一性比质量更耐用

一个二十多年没更新、只有八位患者、没有标注的小库,按常规标准早该被淘汰。它没有,原因很朴素:公开的右心房心内电图几乎没有第二个来源。

体表心电库可以有很多,因为采集便宜、可以回顾性整理、可以众包。心内电图不行,它只能来自导管室,只能来自愿意公开的团队。于是这个库处在一个奇怪的位置:质量不高,需求不小,替代品为零。只要还有人做导管标测、还有人要验证心内信号处理,它就会被下载。这是稀缺性带来的生存逻辑,与制作水准无关。

§8 生态位与历史

8.1 历史沿革

阶段 时间 状态
采集 官方未标注 某次电生理检查,八位患者,四个位置
整理 2003 年前 Creare 整理为 WFDB,附位置图与说明
上线 2003-03-04 PhysioNet 1.0.0,ODC-BY 授权
静置 2003–2019 无修订,仅补校验和
现状 2019 至今 仍为 1.0.0,页面浏览量两百余次

这条时间线与 afdb(1983 年磁带、2000 年补齐信号、2014 年修注释)形成对照。afdb 有明确的维护史,每一次修订都有记录、有致谢、有勘误说明;iafdb 上线即封存。封存本身不是问题,问题在于使用者无法从版本差异里获得任何关于数据质量的线索。

8.2 与 MIT-BIH 体系的关系

PhysioNet 的心电库大体分成两条脉络。一条是 MIT 与波士顿贝斯以色列医院合作产出的 MIT-BIH 系列:心律失常库、afdb、ltdb、ltstdb,注释体系同源,符号表统一,文档风格一致。另一条是外部贡献:各家医院、公司、挑战赛组织方把数据交上来,格式统一到 WFDB,文档各写各的。

iafdb 属于第二条。它的注释符号借用了 MIT-BIH 的 N,但没有沿用那套节律符号;它的文件结构是标准 WFDB,但头文件注释行的写法(<age>:、<medications>)与 MIT-BIH 的 # 69 M 1085 1629 x1 完全不同。这种「格式统一、约定不统一」的状态,是外部贡献数据的典型样貌。

实际影响是:写通用加载器时不能假设所有 PhysioNet 心电库的注释行格式一致。iafdb 的年龄要按 <age>: 前缀解析,afdb 的要按位置解析。这类差异不会报错,只会静默地给出空值。

8.3 生态位:心内数据的一座孤岛

生态位 代表库 与本库的关系
体表长时程节律 afdb、ltafdb 同病种,不同观测面,不可互换
体表短片段分类 cinc-2017、kingston-icu-af 任务不同,无交集
心内电生理 本库 孤岛,无同量级替代
心房影像与分割 lascarqs 解剖侧,可作背景知识
心内其他模态 官方未见 缺口明显

「孤岛」这个判断有实际后果。做心内算法的人往往没有第二份数据可以做外部验证,只能在同一批记录上做留一法;做体表算法的人则不太需要它,因为体表库足够多。于是它的使用者群体很小、很稳定,论文里出现它的次数不多,但每次出现都是因为它不可替代。

8.4 谁在用它,用来做什么

从数据类型倒推,使用者大致分四类。做心房颤动机制研究的,关心主导频率、碎裂电位、激动顺序,需要 1 kHz 与多极对;做导管标测系统或消融导航的,需要一个可回放的多通道真值来做算法回归;做生物医学信号处理教学的,需要一个体量小、结构清晰、能一次讲完的例子;做数据工程的,需要一个能反复重跑而不心疼的冒烟测试件。

四类使用者的共同点是:都不需要人群结论。这个共同点划定了它的使用边界,也解释了为什么它长期停留在「小众但被引用」的位置。

教学场景对这条边界最不敏感,也因此最舍得用。§4.3 的案例——一条二十二分钟、含两次给药与完整洗脱的记录——放进一节课刚好讲完,从体表波形讲到心内局部电图,再讲到药物前后频率的变化,全程只用一条记录、一个时间轴。换成任何体表长时程库,这个叙事都拼不起来:十小时里房颤会来会走,讲「给药前后」反而得先解释为什么没有给药。

§9 使用指引

9.1 三种角色的路径

角色 第一步 关键动作 常见失败
机制研究者 读 iaf4_afw 的给药段 以头文件秒数为锚,取前后等长窗 把未校准幅度当功率绝对量
算法工程师 用 iaf1_afw 跑通读取 固定通道顺序与归一化方式 按列号取通道,取到 CS12
教学者 取一条短记录做体表与心内对照 同一时间轴叠画两类信号 直接讲「这是房颤」,无法证明

9.2 一条最短的可用流程

从零到能画出第一条图,四步足够:

#-- 1) 只取一条记录,约 2.5 MB
mkdir -p iafdb && cd iafdb
for ext in hea dat qrs; do
  curl -sO "https://physionet.org/files/iafdb/1.0.0/iaf1_afw.${ext}"
done
import wfdb
import matplotlib.pyplot as plt

rec = wfdb.rdrecord('iaf1_afw')          #-- 本地目录内读取
t = rec.p_signal[:, 0]
seg = slice(30 * 1000, 36 * 1000)        #-- 第 30 到 36 秒

fig, ax = plt.subplots(2, 1, figsize=(10, 6), sharex=True)
ax[0].plot(rec.p_signal[seg, 0], lw=0.8)  #-- 体表 II
ax[1].plot(rec.p_signal[seg, 3], lw=0.8)  #-- 心内 CS12
ax[0].set_ylabel('surface'); ax[1].set_ylabel('intracardiac')
plt.tight_layout(); plt.savefig('iaf1_afw_30_36s.png', dpi=150)

上下两栏共用时间轴,这一张图就能讲清本库的价值:上面是熟悉的体表波形,下面是同一次心搏在心房壁上的局部样子。§4.3 的案例用的是更长的 iaf4_afw,如果想看药物段,把记录名与时间窗换掉即可。

9.3 引用方式

官方页面没有给出专属引用格式,只提供 PhysioNet 平台的标准引用。实操中推荐同时写清数据集与平台两层:

Creare, Inc. Intracardiac Atrial Fibrillation Database (version 1.0.0).
PhysioNet, 2003. DOI: 10.13026/C23S33.
https://physionet.org/content/iafdb/1.0.0/

五个要素不能省。作者写 Creare, Inc.,致谢里的两位个人可以并列;版本写到 1.0.0 与 2003 年 3 月 4 日,只写年份会让使用者以为后续有修订;标识写 DOI,网址只是补充;记录写到具体名称,用了四条就写四条,笼统写「全库」会让别人无法核对;平台写 PhysioNet 加访问日期,因为这个页面本身没有「最后更新」字段。

§10 AI 使用声明

项目 说明
本页性质 数据集说明文档,不是原始数据的再分发
数据来源 全部事实取自 PhysioNet 官方项目页与库内文件
数字口径 规模、结构、边界三类;分布类统计不在范围内
推导数字 时长、体积、注释条数由头文件与注释文件换算,已标注
未核实项 采集年份、采集地点、剂量、患者临床背景
医学建议 本页不含诊断或治疗建议,不构成临床指导
许可提示 转载或再分发数据须遵守 ODC-BY 1.0 的署名要求
更新策略 官方版本不变则本页事实部分不变,勘误另记

常见误读(避坑清单)

常见说法 实际 证据
这是 AHA 发布的心内房颤库 贡献方是工程公司 Creare, Inc. 官方致谢段只提该公司两人
库里有 4 路体表心电 每条固定 3 路,I 与 II 二选一 32 个头文件逐行只有 3 个 ECG 名
有节律标注,可直接训练 只有 QRS 位置,且未校正 ANNOTATORS 原文 unaudited
信号可换算成毫伏做幅度比较 名义增益 3277,幅度未校准 每个头文件末行 signals are uncalibrated
CS12 至 CS90 对应冠状窦十极 导管在右心房四个位置移动 官方四段位置定义与摆位图
记录长达十几小时 最长 22.8 分钟,全库合计 1.86 小时 头文件采样点数除以 1 kHz
覆盖全部房颤患者类型 8 人,58–81 岁,全部接受电生理检查 头文件年龄性别诊断行
有配套方法学论文可引 页面无参考文献,仅平台标准引用 项目页无 References 段
采样率 250 Hz,与 afdb 相同 本库为 1 kHz 头文件第一行第三个数
信号通道数随位置变化 每条都是 8 路 32 个头文件第一行均为 8

FAQ

Q1:iafdb 和 afdb 是同一个库的不同版本吗?
不是。afdb 是体表双导联的 10 小时长时程记录,有逐段节律标注;iafdb 是右心房心内的分钟级记录,没有节律标注。两者唯一的共同点是都以房颤为主题、都存放在 PhysioNet。

Q2:八个患者够做什么?
够做方法可行性的验证,不够做任何人群层面的结论。合理用法是把结论限定在「在这八位患者的记录上」,或者把本库当作更大研究里的一个补充实验,而不是主证据。

Q3:为什么游离壁记录特别长?
因为药物激发实验只在这一个位置做。给药后需要观察起效与洗脱,所以记录从两分半延伸到近二十三分钟。其余三个位置是标准停靠,几十秒到三分钟即可。

Q4:能不能自己标节律,然后当检测数据集用?
技术上可以,学术上要谨慎。自标只有一个人、没有一致性检验、样本只有八人,得到的评测数字无法与公开结果比较。如果一定要做,必须公开标注规则与标注文件,并说明无法做患者级划分。

Q5:心内信号需要做 QRS 减除吗?
多数情况下不需要。电极在心房壁上,心室远场本来就弱,QRS 往往只表现为一个小尖峰。但在三尖瓣环位置(tva)记录里,导管离心室近,QRS 残留会明显一些,做频谱分析前应当先看一眼。

Q6:为什么增益写 3277 这么奇怪的数?
3277 接近 32768 除以 10,在 14 位量化下相当于把满量程折成约十毫伏。这个数字只出现在头文件里,官方没有说明它的来历,也没有给出任何标定流程。可以确定的是:每条记录都注明幅度未校准,所以它只能用于把整数还原成「名义毫伏」,不能当成真实刻度。

Q7:记录名的后缀 afw、svc、ivc、tva 分别指什么?
afw 是心房游离壁,svc 是上腔静脉口,ivc 是下腔静脉口,tva 是三尖瓣环。四个位置覆盖右心房的一圈,具体摆位见 figures 目录的五张示意图。

Q8:可以用它验证导管标测算法的定位精度吗?
只能验证时序与通道一致性,不能验证空间定位。库里有位置定义与示意图,但没有电极坐标,也没有与影像的配准。要做定位精度,需要自带标测系统的坐标真值。

Q9:数据里为什么没有左心房?
因为导管只进了右心房。左心房需要房间隔穿刺,操作风险与流程复杂度都更高,这批记录没有做。左房相关的公开数据多是影像与分割标注,例如 lascarqs。

Q10:全库 102.8 MB,需要多大内存?
解码成双精度浮点约四百余兆,单机完全够。若只做逐条分析,一条记录最多二十余兆,普通笔记本即可。

Q11:许可允许商用吗?
允许。ODC-BY 1.0 只要求署名,不限制商业使用,也不要求衍生作品以相同许可发布。署名时建议同时给出数据集名称、版本与 DOI。

Q12:没有配套论文,方法段落怎么写?
按官方页面描述写,并引用数据集本身。采样方式、导管规格、四个位置的定义、药物与时刻、注释生成工具,这些在页面上都有;采集年份、地点、患者临床背景页面上没有,只能写「官方未提供」。

术语表

术语 英文 含义
心内电图 intracardiac electrogram 电极位于心腔内部记录到的局部心肌电活动
双极导联 bipolar 两个相邻电极之间的电位差,抗远场干扰
十极导管 decapolar catheter 一根导管上排列十个电极,可组成五个双极
极间距 electrode spacing 电极中心之间的距离,本库为 2-5-2 毫米
上腔静脉口 SVC 上腔静脉与右心房交界处
下腔静脉口 IVC 下腔静脉与右心房交界处
三尖瓣环 TVA 右心房与右心室之间的瓣环
心房游离壁 AFW 右心房外侧壁,远离间隔
房颤 atrial fibrillation 心房快速无序的电活动,无有效收缩
房扑 atrial flutter 心房内大折返,激动频率规则且快
主导频率 dominant frequency 频谱中能量最高的频率,反映激动周期
碎裂电位 fractionated potential 局部电图出现多个低幅偏转,提示传导缓慢
激动顺序 activation sequence 波前依次经过各电极的先后关系
表观传导速度 apparent conduction velocity 极间距除以激动时间差得到的近似速度
腺苷 adenosine 短暂抑制房室结传导的药物,用于激发试验
异丙肾上腺素 isoproterenol(Isuprel) 提高交感张力、加快心房率的药物
洗脱 washout 药物作用逐渐消退的过程
WFDB Waveform Database PhysioNet 的生理信号存储规范
头文件 header file 记录参数的纯文本声明,扩展名 .hea
注释文件 annotation file 事件位置与类型的二进制文件
采样率 sampling rate 每秒采样点数,本库为 1000 Hz
量化位宽 resolution 每个样本的二进制位数,本库为 14
校准 calibration 把整数样本映射到物理单位的过程
远场 far field 距离电极较远的心电活动在本地造成的投影
导管室 electrophysiology lab 进行电生理检查与消融的操作场所

附录 A:核心数字核对表

项 值 来源 来源层级
受试者数 8 官方页面正文 官方
导管位置数 4 官方页面正文 官方
记录数 32 RECORDS 清单 官方文件
每记录通道数 8 头文件第一行 官方文件
心内通道数 5 官方页面与头文件 官方
体表通道数 3 官方页面与头文件 官方
采样率 1000 Hz 头文件第一行 官方文件
量化位宽 14 头文件信号行 官方文件
全库体积 102.8 MB 官方页面 官方
单条时长范围 48.0–1369.3 秒 采样点数换算 推导
全库总时长 约 1.86 小时 采样点数换算 推导
QRS 注释总数 8571 逐文件读取 推导
许可 ODC-BY 1.0 官方页面 官方
DOI 10.13026/C23S33 官方页面 官方

附录 B:数字的来源分层

层级 含义 本篇中的例子 可信度
官方直述 项目页正文直接写出 8 位患者、4 个位置、1 kHz、102.8 MB、ODC-BY 高
官方文件 头文件与清单里可读出 通道名、采样点数、年龄性别诊断、给药时刻 高
推导 由官方文件换算 单条时长、信号体积、注释条数 中,方法已写明

三层的差别在于是否需要中间计算。官方直述没有计算,官方文件是一次读取,推导要经过换算或统计。凡是推导值,本页都注明了换算方式,方便核对。未列入这三层的数字一律不写,包括剂量、采集年份、患者体重与左房内径。

附录 C:完整参考文献

编号 文献 用途
1 Creare, Inc. Intracardiac Atrial Fibrillation Database, v1.0.0. PhysioNet, 2003. DOI 10.13026/C23S33 数据本体与全部事实
2 PhysioNet 项目页 https://physionet.org/content/iafdb/1.0.0/ 描述、许可、版本
3 WFDB 软件包文档(PhysioNet) 文件格式与读取接口
4 sqrs 检测器说明(WFDB 附录) 注释生成方式
5 afdb 与 ltafdb 项目页 §6 对照数据

附录 D:任务代码

批量把三十二条记录转成统一的宽表,并汇总每条记录的基本指标:

#-- 先取清单,再逐条转换;已有本地副本时跳过下载
mkdir -p iafdb_parquet
python3 - <<'PY'
import wfdb, pandas as pd
recs = [l.strip() for l in open('RECORDS') if l.strip()]
rows = []
for r in recs:
    rec = wfdb.rdrecord(r, pn_dir='iafdb')
    df = pd.DataFrame(rec.p_signal, columns=rec.sig_name)
    df.insert(0, 't_sec', df.index / rec.fs)
    df.to_parquet(f'iafdb_parquet/{r}.parquet', index=False)
    ann = wfdb.rdann(r, 'qrs', pn_dir='iafdb')
    rows.append({'record': r, 'sec': rec.sig_len / rec.fs, 'beats': len(ann.sample)})
pd.DataFrame(rows).to_csv('iafdb_index.csv', index=False)
print(len(rows), 'records done')
PY

跑完之后 iafdb_index.csv 就是一张三列索引:记录名、时长、注释数。后续任何分析都可以先在这张表上筛,再回读对应的 parquet,不必反复访问网络。

附录 E:如果只记五件事

序 记住这一条
1 八位患者、三十二条记录、四个右心房位置,全库不到两小时
2 五路心内双极加三路体表,1 kHz、14 位,幅度未校准
3 唯一的标注是自动生成的 QRS,没有节律段
4 它与 afdb、ltafdb 是不同观测面,不是同族的小样本版
5 值钱的地方是「唯一」:公开的右心房心内电图几乎没有第二份

编辑说明

本页事实部分依据 PhysioNet 项目页与库内 32 个头文件、32 个注释文件核对,核对于 2026 年 10 月。时长、体积、注释条数为换算值,换算方式已在正文与附录中标明。官方未提供的项目(采集年份、地点、剂量、患者临床背景、配套论文)在本页一律标为未提供,不作推测。原始数据版权归 Creare, Inc.,按 ODC-BY 1.0 使用;本页为说明文档,不包含数据本体。


相关数据集导航

以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:

  • wctecgdb — 共享标签:生理信号 / 心电信号 / 心血管疾病
  • ahadb — 共享标签:生理信号 / 心电信号 / 心血管疾病
  • chfdb — 共享标签:生理信号 / 心电信号 / 心血管疾病
  • crisdb — 共享标签:生理信号 / 心电信号 / 心血管疾病
  • cudb — 共享标签:生理信号 / 心电信号 / 心血管疾病
  • ltdb — 共享标签:生理信号 / 心电信号 / 心血管疾病
  • ltstdb — 共享标签:生理信号 / 心电信号 / 心血管疾病
  • mvtdb — 共享标签:生理信号 / 心电信号 / 心血管疾病
  • nsrdb — 共享标签:生理信号 / 心电信号 / 心血管疾病
  • stdb — 共享标签:生理信号 / 心电信号 / 心血管疾病

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

返回 AI-Ready 数据集