腹部151个探头听子宫 — 子宫磁图库 MMG

25 名产妇 / 147–148 路 / 32 Hz

来源 https://physionet.org/content/mmgdb/1.0.0/发布时间: 2026-10-28最后更新: 2026-10-28 阅读 13
腹部151个探头听子宫 — 子宫磁图库 MMG

信息速览

数据集名称腹部151个探头听子宫 — 子宫磁图库 MMG
数据类型时序信号,波形,元数据,原始数据链接
规模25 名受试者
接入方式https://physionet.org/content/mmgdb/1.0.0/
AI 就绪度

MMG Database 是 PhysioNet 上的一份子宫磁图记录集。名中的 MMG 展开为 magnetomyography,指用超导量子干涉器件阵列拾取器官电活动所产生的极弱磁场。这里被拾取的对象是孕晚期产妇的子宫:受试者前倾坐姿,一套 151 通道的 SARA 阵列罩在腹前,单条记录约二十分钟。

它的规模在所有公开妊娠电生理资源里算小的:二十五名受试者,每条记录保留一百四十七到一百四十八路、时长十到二十分钟。但它的空间分辨率是同类里最密的——体表子宫肌电通常只有三到八路,这里是一百多路同时覆盖整个孕腹,足以把一次宫缩看成一张在腹部移动的波。

官方页面对它的定位很朴素:为研究子宫收缩的时空传播而录。它不带宫缩起止标注,不带胎儿标注,也不承诺覆盖任何人群。一屏速览见下表。

维度 内容
官方全名 MMG Database
缩写拆解 MMG = magnetomyography(磁图),不是肌音图
托管平台 PhysioNet,Open Access 栏目
版本 1.0.0,2016 年 3 月 4 日发布
DOI 10.13026/C2ZW95
采集机构 阿肯色大学医学科学中心(UAMS),小石城
设备 151 通道 SARA(SQUID Array for Reproductive Assessment)
受试者 25 名孕晚期产妇
单条时长 原始约 20 分钟;处理后 10 至 20 分钟
通道数 每条保留 147 至 148 路;坐标记录含 149 个通道
采样率 原始 250 Hz,处理后 32 Hz
滤波 带通 0.1–1 Hz;陷波 0.25–0.35 Hz
临床字段 宫颈扩张、消退、胎头位置、距分娩天数、种族、BMI、孕周
标注 无独立标注文件
许可 Open Data Commons Attribution License v1.0
引用论文 Escalona-Vargas 等,PLoS ONE 2015

§1 它要解决的具体麻烦

1.1 要看宫缩「从哪儿起、往哪儿走」,就得有一百多个探头同时按下

临床上判断产程,最常用的工具是体表胎心宫缩监护:一条压力带绑在腹壁上,读出子宫收缩造成的机械形变,得到一条随时间起伏的宫缩曲线。这条曲线回答的是「什么时候在收缩、收缩多强」,不回答「这次收缩从哪里开始、往哪个方向传导」。而后者才是理解产程启动与早产机制的关键。

要在体表回答传导问题,就得在腹部多个位置同时取样。体表子宫肌电(electrohysterogram)能做到这一点,但它受组织导电性、脂肪层厚度、电极与皮肤接触质量的影响很大,三到八路电极已经是常见上限,空间分辨率被电极数量与摆放位置卡死。子宫肌电的另一个麻烦是母体心电与呼吸的串扰,二者在腹部电信号上的幅度往往高于子宫成分本身。

磁图走的是一条不同的路。磁场穿过组织几乎不衰减,也不受电极接触质量影响,因此可以在腹部外面以很小的间距密排探头,把子宫电流产生的磁场分布成图。SARA 就是为此设计的设备:一套覆盖孕妇腹部的超导阵列,探头数量上百。MMG Database 用的正是它。

1.2 三条常见的错误期待

第一条,望文生义把 MMG 当成肌音图。 在运动科学和康复领域,MMG 常指 mechanomyography,用加速度计或麦克风记录肌肉收缩时的低频机械振动。这个库与那条线毫无关系。此处的 G 是 graphy,M 是 magneto,合起来是「磁记录」。把两者混为一谈,会让人带着「单通道加速度计、几十赫兹」的预期打开文件,然后被一百多路磁通道彻底打乱计划。

第二条,期待它像胎心监护那样带宫缩标注。 目录里没有 .atr,也没有逐段的宫缩起止。官方页面只说明头文件含若干临床字段,没有一个字段描述「第几分钟到第几分钟发生了一次宫缩」。想做宫缩检测,得自己从波形里切。

第三条,期待它是一份多中心的人群样本。 二十五人,全部来自小石城同一家医院的产房分诊台,而且是被送来评估分娩的那一部分产妇。这不是对孕晚期人群的抽样,而是对「正在评估是否要生」这一临床情形的抽样。

1.3 它能给到的与给不到的

你的需求 它给的 够不够
看一次宫缩在腹壁上的空间分布 每条 147 至 148 路同步磁信号 够,这是它的主业
估计宫缩传播速度与方向 多路同步信号加 149 点坐标 够,需自行分段与相关分析
研究孕周与子宫活动的关联 文件名带孕周,头文件带临床字段 有条件够,仅 25 人
训练宫缩检测模型 无逐段宫缩标注 不够,结构上做不到
做多受试者泛化评测 25 人、单中心 勉强,划分空间很小
分析高频肌电成分 降采样到 32 Hz、只留 0.1–1 Hz 不够,高频已被滤掉
与体表子宫肌电做对照 无同步采集的电极通道 不够,需另找库
作为磁图方法的入门样本 规格统一、许可宽松、有坐标 够,适合起步

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

你的处境 它能帮你什么 下一步该做什么
你在做宫缩的时空传播研究,只有三路电极的数据 提供一百多路同步覆盖整个孕腹的记录 先用 sensorpositions 把通道排成腹部平面图,再逐段做互相关求延迟
你在评估磁图设备或算法,需要一个公开对照 同一台 SARA、同一套预处理、规格一致的记录 固定预处理参数,先在几条记录上复现传播速度的量级
你在写早产预测的综述,需要说明子宫电活动的空间维度 提供能画成腹部等值线图的真实记录 引用配套论文的传播速度范围,不要从库里重新估计
你要训练一个宫缩分割网络 没有标注 换用带宫缩区间标注的体表子宫肌电库
你想验证心电/呼吸串扰的处理方法 官方已做过带通与陷波,可参考其参数选择 若需对比,找未滤波的原始数据
你刚接手 WFDB 工具链,想试多通道 单条记录一百多路,能充分测试内存与画图 先只读头文件,确认通道数与采样率
你想研究磁场随体位的变化 记录只有一种坐姿 只能作为单条件基线,不能做体位对照

1.5 一句话判断

它把一次宫缩从「一条随时间起伏的曲线」变成「一张在腹部移动的波」,代价是只剩二十五个人、一个坐姿、一段被压到 0.1 至 1 赫兹的频段。

1.6 不适合谁:四条边界

不适合把它当归一化后的通用宫缩数据集。 每条的时长不同(十到二十分钟),每条包含的宫缩次数官方未统计,通道数在一百四十七与一百四十八之间浮动。任何要求等长、等通道的流水线,都得先做裁剪与对齐。

不适合做高频电生理分析。 原始采集是 250 Hz,发布前被降到 32 Hz,并且只保留 0.1–1 Hz 的带通。子宫肌电的爆发片段在体表记录里常常延伸到数赫兹,这份库把它切掉了。想研究爆发形态,应该去找未做如此强滤波的体表子宫肌电库。

不适合做临床决策验证。 头文件里给了宫颈扩张、消退与胎头位置,看似可以预测分娩时间,但这是二十五名已经在分诊台被评估的产妇,结局分布不具代表性。拿它训练一个「多久会生」的模型,等于在一个极窄的入组条件里拟合。

不适合当作磁图质量的基准。 官方没有给出信噪比、没有给出坏道清单、也没有说明一百四十七与一百四十八之间差的那些通道去哪了。要做设备或重建算法的基准,缺一个可比的评价口径(§7.3)。

§2 数据构成与规格

2.1 一套阵列、一个人、一条记录

整个库的组织方式与多数 PhysioNet 小库一致:一个扁平目录,记录名即文件名主干,每条记录由头文件与数据体两件套构成。差别在于通道数:普通心电库一条记录两路或十二路,这里一条记录一百四十七路上下,单条数据体的体量因此大了两个数量级。

记录名的构成官方写得很清楚:前三位是受试者编号,下划线之后是孕周,格式为「周数 + w + 天数 + d」,例如 38w0d 表示孕三十八周零天。这个命名把孕周压进了文件名,所以不读头文件也能按孕周分箱。反过来,同一名受试者若被记录多次,记录名会以相同的编号开头、以不同的孕周结尾。

层级 命名 取值 说明
根目录 无子目录 记录平铺 与 PhysioNet 常见小库一致
记录头文件 <name>.hea 每条一个 文本,含通道标签与临床注释
记录数据体 <name> 或 <name>.dat 每条一个 二进制,多通道交错
坐标记录 sensorpositions 1 条 149 个通道的 x、y、z
阵列示意图 SARAarray.eps / .tif 2 个 设备外观与通道排布
受试者编号 文件名前三位 数字 对应一名产妇
孕周 文件名后半 形如 38w0d 周数加天数

2.2 字段与记录的完整字典

这份库没有结构化的字段表,信息分三处:文件名里的编号与孕周、头文件里的通道描述、头文件注释行里的临床字段。下表把三处合并。

信息项 存放在哪 取值或范围 是否每条都有
记录名 文件名 编号加孕周 是
通道数 头文件首行 147 或 148 是
采样率 头文件首行 32 Hz 是
采样点数 头文件首行 随时长变化 是
信号名 通道行末列 各通道标签 每通道一行
增益与基准 通道行 由 WFDB 头文件给出 每通道一行
宫颈扩张 头文件注释 厘米 官方称有
宫颈消退 头文件注释 百分比 官方称有
胎头位置 头文件注释 station 官方称有
距分娩天数 头文件注释 天 官方称有
种族 头文件注释 分类 官方称有
BMI 头文件注释 数值 官方称有
孕周 头文件注释与文件名 周加天 是
传感器坐标 sensorpositions x、y、z 三列 全库一份
宫缩起止 无 无 否
坏道清单 无 无 否
采集日期 无 官方未提供 否

官方页面在描述临床字段时用的是罗列式表述,没有逐字给出字段名。上表的「字段」一栏是按其描述归纳的,写代码解析时应当先打印 rec.comments 看实际文本,不要照着本表去匹配字符串。这一点在 §5.3 会给一段先看再解析的代码。

2.3 一条记录的完整解剖

取一条孕三十八周零天的记录作解剖对象,记录名形如 ###_38w0d,前三位是受试者编号。之所以选这个形式,是因为它同时展示了命名规则的两个组成部分,且三十八周落在足月范围内,与配套论文讨论的三十七到四十周区间一致。

#-- 只读头文件,不下载数据体
curl -sL https://physionet.org/files/mmgdb/1.0.0/ | head -20

目录页在部分网络环境下会被拦成 403,官方页面本身仍可访问。若目录列表不通,直接按文件名访问头文件即可,例如把上一条命令的地址换成 <记录名>.hea。判断一条记录是否完整,只需要看头文件首行给出的通道数、采样率与采样点数三项是否与预期一致。

import wfdb

base = "https://physionet.org/files/mmgdb/1.0.0"
rec_name = "001_38w0d"          #-- 示例:编号 001、孕 38 周 0 天
h = wfdb.rdheader(f"{base}/{rec_name}")
print("通道数", h.n_sig, "采样率", h.fs, "采样点", h.sig_len)
print("时长(分钟)", round(h.sig_len / h.fs / 60, 1))
print("信号名前五个", h.sig_name[:5])
print("注释行", h.comments)

rdheader 只取头文件,几百字节的事,适合在批量处理前先做一轮规格普查。comments 里就是官方所说的临床字段,不同记录的行数与顺序可能不同,解析前必须先打印。

import wfdb
import numpy as np

rec = wfdb.rdrecord(f"{base}/{rec_name}")
x = rec.p_signal
print("形状", x.shape, x.dtype)
print("每分钟采样点", 32 * 60)
print("全通道中位数", round(float(np.nanmedian(x)), 4))
print("前八个通道同一时刻的值", np.round(x[1000, :8], 3).tolist())

读进内存之后,p_signal 的形状是一百多列宽、按三十二赫兹展开的矩阵。一条二十分钟的记录约有三万八千个采样点,乘以一百四十八列,单精度浮点占用约二十二兆字节——比同族心电库大,但仍在内存里放得下。

解剖项 该记录的值 含义
受试者编号 文件名前三位 对应一名产妇
孕周 38 周 0 天 足月范围
通道数 147 或 148 视该条记录而定
采样率 32 Hz 全库一致
时长 10 至 20 分钟 视该条而定
每分钟采样点 1920 32 乘 60
二十分钟的总点数 三万八千余 32 乘 1200
单条内存占用 约 22 MB 单精度浮点估算
临床字段 宫颈、分娩天数、种族、BMI、孕周 头文件注释
宫缩标注 无 目录中无标注文件

2.4 一百五十一、一百四十九、一百四十七:三个通道口径

同一份数组在官方叙述里出现了三个不同的通道数,这是最容易在写代码时踩空的一处。

口径 数字 出处 含义
设备阵列 151 官方摘要与标题 SARA 系统的探头总数
坐标记录 149 官方数据描述 sensorpositions 中给出坐标的通道数
记录通道 147 至 148 官方数据描述 处理后每条记录实际保留的通道数

三个数字之间不是简单包含关系。设备有一百五十一个探头,坐标记录给出一百四十九个通道的坐标,每条最终记录保留一百四十七或一百四十八路。官方的说明是:原始数据经带通、陷波并剔除母体体动片段后,最终每条记录含一百四十七到一百四十八路。至于从一百五十一到一百四十九、从一百四十九再到一百四十七之间每一步减掉的是哪些通道,官方没有逐条列出。

实际操作时的稳妥做法是:读数据以 p_signal 的实际列数为准,读坐标以 sensorpositions 的实际行数为准,两者不等时按通道标签对齐,而不是按下标硬对。这个对齐问题在 §5.4 会再展开一次。

2.5 与同类资源的字段差异

把这份库放进妊娠电生理资源的谱系里,它的位置很特殊:空间分辨率最高,通道最多,但标注最少、频段最窄。

资源 模态 通道 采样率 受试者 逐段标注 定位
MMG Database 磁场 147 至 148 32 Hz 25 无 收缩的空间传播
子宫肌电类公开库 体表电位 三至八 20 Hz 级 数十至上百 部分有宫缩区间 早产与分娩预测
产时胎心宫缩监护库 机械压力加超声 二 4 Hz 数百 多附临床结局 产时监护基准
胎儿心电腹部记录库 体表电位 数路 数百 Hz 数十 部分有 R 波 胎儿心律分析
本库的独特处 唯一大通道磁图 上百 最低 最少 无 空间分布

与体表子宫肌电库的差别是模态差别:那边测电位,这边测磁场,两者在物理上不可换算。与胎心宫缩监护库的差别是信息量:那边一条曲线,这边一张图。任何跨库比较都只能停在「同样描述子宫活动」这一层,不能把通道或数值直接对照。

§3 它是谁的子宫:一台设备、一家医院、一个入组条件

3.1 设备与机构

SARA 的全称是 SQUID Array for Reproductive Assessment,即用于生殖评估的超导量子干涉阵列。它安装在阿肯色大学医学科学中心,位于小石城。超导器件必须在液氦温度下工作,所以这类设备不是可穿戴的,而是一台固定的、需要专门屏蔽室的装置:受试者坐在其中,腹部前倾贴近阵列。

这个物理条件决定了数据的所有先天属性。记录不可能长时连续,不可能在家庭环境里做,不可能让受试者自由走动。一条约二十分钟的坐姿记录,就是这套设备能给出的自然单位。

属性 内容 来源 对使用的含义
设备名 SARA 官方摘要 单中心单设备
设备类型 超导量子干涉阵列 官方摘要 非可穿戴、需屏蔽室
探头数 151 官方摘要 覆盖面广
安装地点 UAMS,小石城 官方摘要 单中心
受试者姿势 前倾坐姿,腹部贴近阵列 官方摘要 单一体位
单条时长 约 20 分钟 官方摘要 无法观察长时段变化

3.2 作者与论文

官方页面指定的引用是 Escalona-Vargas、Govindan、Furdea、Murphy、Lowery 与 Eswaran 六人合著的论文,题为 Characterizing the Propagation of Uterine Electrophysiological Signals Recorded with a Multi-Sensor Abdominal Array in Term Pregnancies,发表于 PLOS ONE 2015 年第十卷第十期。题目直译是「用多传感器腹部阵列刻画足月妊娠中子宫电生理信号的传播」。

值得注意的是,论文标题说的是「电生理信号」,而数据集标题与摘要说的是「磁图信号」。这并不矛盾:磁图测量的是电流产生的磁场,两者是同一生理过程的不同物理量。但对使用者来说,这个措辞差异提醒了一件事——论文里的传播速度是基于磁场重建推得的,不是电极电位的直接测量。

官方页面另列出两篇更早的 Eswaran 等人论文作为相关文献,一篇 2002 年发表在妇产科杂志上,报告首次用 151 通道阵列记录到带时空信息的子宫活动;另一篇 2004 年同刊,讨论用非侵入磁图预测足月与早产的分娩。这两篇交代了 SARA 这条技术线的来历。

文献 年份 期刊 在库中的角色
Escalona-Vargas 等,传播特性刻画 2015 PLOS ONE 官方指定的配套论文
Eswaran 等,首次时空记录 2002 Am J Obstet Gynecol 技术来源
Eswaran 等,预测足月与早产 2004 Am J Obstet Gynecol 应用背景
PhysioNet 平台引用 2026 Nature Health 平台层面,与数据无关

3.3 受试者是谁

官方摘要给出的人数与配套论文给出的人数不同,这是本库最需要并列两口径的一处。

口径 人数 出处 表述
官方摘要 25 PhysioNet 项目页 从到产房分诊台受检的产妇中记录
配套论文 36 入组、25 成功处理 PLOS ONE 2015 摘要 三十七到四十周的孕妇中,二十五人的记录被成功处理
实际发布 25 官方数据描述 数据库收录的记录

两个口径并不冲突,但读法不同:官方摘要把二十五写成「记录的来源」,论文把二十五写成「三十六人里处理成功的部分」。差额十一人的记录在哪个环节被排除,论文没有在摘要里说明。任何引用人数的地方,都应该写成「官方摘要称二十五名受试者,配套论文称从三十六人中成功处理二十五人」。

论文摘要另给出孕周范围:三十七到四十周。官方摘要只说「孕晚期」,没有给具体范围。两处合起来看,这个库覆盖的是足月前后这一小段,不是整个孕晚期。

属性 值 来源 对使用的含义
人数 25 官方摘要 单中心小样本
入组来源 产房分诊台受检产妇 官方摘要 临床情形抽样
孕周 37 至 40 周 论文摘要 足月前后
姿势 前倾坐姿 官方摘要 单一体位
记录时长 约 20 分钟 官方摘要 短时窗
临床字段 宫颈、分娩天数、种族、BMI、孕周 官方摘要 有限结局信息

这个入组条件的含义值得多说一句。到分诊台接受评估的产妇,本身就是「可能已经临产或需要判断是否临产」的一个子集。她们与门诊常规产检的孕妇不同,与尚未足月的孕妇更不同。所以这个库反映的是「疑似临产者的子宫活动」,而不是「孕晚期子宫活动的一般分布」。

3.4 时间线

时间 事件 来源
2002 年 首次用 151 通道阵列记录子宫活动 官方相关文献
2004 年 讨论磁图预测分娩的论文 官方相关文献
2015 年 10 月 27 日 配套论文在 PLOS ONE 上线 期刊元数据
2016 年 3 月 4 日 PhysioNet 以 1.0.0 版发布 官方页面
至今 版本仍为 1.0.0 官方页面

发布时间比论文晚了约四个月。从论文发表到数据整理上线,这段间隔在 PhysioNet 的资源里很常见:论文先走审稿与排版,数据再按平台规范整理成 WFDB。十年间版本号没有动过,说明这份库没有再修订。

3.5 一个物理上绕不开的限制:磁场随距离衰减

磁图相比体表电位的优势是穿透性,代价是灵敏度随距离迅速下降。子宫电流产生的磁场在腹外只有皮特斯拉量级,这正是必须用超导阵列的原因,也是为什么探头必须紧贴腹壁。

对使用者的直接含义是:这个库里的通道不是「均匀铺在腹部表面」,而是「按一个固定曲面的几何排布」。任何把通道当成二维网格来画等值线的做法,都需要先用 sensorpositions 把坐标投到一个平面上,否则画出来的图会因为曲面弯曲而变形。§5 会给出这段投影代码。

         受试者坐姿与阵列的相对位置(示意)

        [ 屏蔽室 ]
            |
     (  (  (  (  (   <- SARA 阵列,151 个探头沿曲面排布
      \  \  \  \  \
       \  \  \  \  \
        (  孕腹   )      <- 受试者前倾坐姿,腹部贴近阵列
         \       /
          \     /
           [椅]

#-- 示意:阵列覆盖腹部前侧曲面,不环绕全身
#-- 实际几何以 SARAarray.eps 与 sensorpositions 为准

§4 它最独特的东西:同一时刻一百多路,把宫缩看成一张图

4.1 空间分辨率是这份库唯一不可替代的东西

公开的妊娠电生理数据里,体表子宫肌电是主流,通道数通常是个位数。这类数据能回答「什么时候在收缩」,回答不了「收缩从哪里开始」。要把传播这件事变成可测量的量,至少需要把腹部切成若干区域、在每个区域同时取样。

这份库给了一百多路。按配套论文的做法,腹部被切成四个象限,每个象限用电荷重心代表该区域的信号强度,再对两两象限的重心做互相关求延迟,由延迟与象限间距算传播速度。这个流程本身就说明了为什么需要多路:单路无法定义「重心」,也谈不上「象限间延迟」。

维度 体表子宫肌电 本库
物理量 电位 磁场
典型通道数 三到八 147 至 148
采样率 二十赫兹级 32 Hz
空间覆盖 脐周局部 腹部前侧曲面
组织衰减 明显 很弱
可否穿戴 可以 不可以
适合回答 有无收缩、何时收缩 收缩的空间结构与传播

4.2 案例:001_38w0d 的四象限与传播速度

把一条孕三十八周零天的记录作为贯穿案例,理由是它落在论文讨论的孕周区间靠上的一端,也是足月判断最常被问到的位置。下文的回指都用「§4.2 的案例」这一形式。

对这条记录,最小可用的分析流程是:把一百多路通道按 sensorpositions 的坐标分成上下左右四个象限,对每个象限的样本求电荷重心,得到四条重心时间序列,再做两两互相关。

import numpy as np
import wfdb

base = "https://physionet.org/files/mmgdb/1.0.0"
rec = wfdb.rdrecord(f"{base}/001_38w0d")
pos = wfdb.rdrecord(f"{base}/sensorpositions")
x = np.nan_to_num(rec.p_signal)          #-- 形状:采样点 × 通道
xyz = pos.p_signal[:, :3]                #-- 形状:通道 × 3

n = min(x.shape[1], xyz.shape[0])
x, xyz = x[:, :n], xyz[:n]

quad = {
    "up":    xyz[:, 1] > np.median(xyz[:, 1]),
    "left":  xyz[:, 0] < np.median(xyz[:, 0]),
}
for name, mask in quad.items():
    print(name, "通道数", int(mask.sum()))

这段代码只做一件事:确认坐标记录与数据记录的通道能在前 n 列上对齐。真正的四象限要用两个条件交叉,代码在附录 D 里给出完整版。这里先把「对齐」这一步单独拎出来,是因为它是最容易出错的一步。

import numpy as np

def cog(x_block):
    #-- x_block:采样点 × 该象限的通道数,取绝对值后按列归一
    w = np.abs(x_block)
    w = w / (w.sum(axis=1, keepdims=True) + 1e-12)
    return w

def lag_seconds(a, b, fs=32, max_lag=64):
    a = (a - a.mean()) / (a.std() + 1e-12)
    b = (b - b.mean()) / (b.std() + 1e-12)
    c = np.correlate(a, b, mode="full")
    lags = np.arange(-len(a) + 1, len(a))
    keep = np.abs(lags) <= max_lag
    return lags[keep][np.argmax(c[keep])] / fs

lag_seconds 返回的是两段重心序列之间的延迟,单位秒。把它与两个象限重心的几何距离相除,就得到论文意义上的传播速度。论文摘要给出的范围是一点三到九点五厘米每秒,这个数值可以直接用来判断自己的流程有没有跑通——若算出的是几十厘米每秒,多半是分段没对准或是把宫缩段与静息段混在一起算了。

步骤 输入 输出 检查点
对齐通道 数据与坐标 前 n 列一致 n 与头文件通道数相符
分象限 坐标 四组通道下标 每组的通道数不必相等
求重心 每组的波形 四条重心序列 长度与采样点相同
求延迟 两两重心 六个延迟值 落在正负两秒内
求速度 延迟与象限间距 三个方向的初速度 量级应在一到十厘米每秒

4.3 为什么「传播」这个量比「波幅」更值得关注

波幅受太多因素影响:脂肪厚度、探头与皮肤的距离、阵列贴合程度、受试者的体型。它在一名受试者内部可比,跨人几乎不可比。传播速度则不同,它是一个比值——距离除以延迟——分母与分子都来自同一套几何,对整体缩放不敏感。一名体型偏胖的受试者,各个通道的绝对幅值可能整体偏低,但通道之间的相对强弱关系与延迟关系大体保留,速度估计因此比幅度比较稳。

这一点在被压缩到 32 Hz 之后尤其重要。采样率降到三十二赫兹,意味着时间分辨率的极限是三十一点二五毫秒,两个相邻采样点之间发生的事情已经无从分辨。对速度的估计来说,这个极限与典型延迟(零点几秒到几秒)相比并不苛刻——延迟的误差最多是几十毫秒,落在几秒的量级上,相对误差在百分之几。对波形细节的估计来说,情况完全相反:三十二赫兹的奈奎斯特上限是十六赫兹,而官方又只保留了 0.1 至 1 赫兹的带通,等于把大部分可能携带形态信息的中高频全部剪掉。所以这份库的合理用法,是往「延迟、相关、传播方向、区域强度」这类统计量上走,而不是往「波形分类」上走。

可估计的量 32 Hz 下是否可行 说明
两区之间延迟 可行 分辨率约 31 毫秒
传播速度 可行 由延迟与几何距离推
区域强度排序 可行 只看包络与幅度
宫缩有无 可行 低频爆发能量明显
波形形态分类 不可行 高频与细节已丢
爆发起始的锐度 不可行 时间分辨率不足

这张表还有一个用法上的含义。既然只有前四行可持续,那么任何以「把这份库送进卷积网络做端到端分类」为起点的方案,都从第一步就走错了。卷积网络需要形态,而形态在预处理里被当成干扰去掉了。

4.4 它支撑的四类分析

四类分析按结论能够承受到什么程度排开。第一类的量级有论文可对照,所以最容易判断自己有没有做错;第二类与第三类都是在二十五个样本上做关联,任何相关系数都必须配上留一验证;第四类不涉及生理结论,只需复算滤波参数,反而最稳。

分析类型 设计 它能给的 结论强度
传播速度与方向 四象限重心互相关 一百多路加坐标 中,单条件
孕周与活动量的关联 按文件名孕周分箱 孕周字段 弱,二十五人
与临床结局的关联 用宫颈与距分娩天数 头文件临床字段 弱,结局分布偏
预处理流程复现 按官方参数重跑滤波 参数写得清楚 高,可复算

第三行值得多一句提醒。头文件里有距分娩天数,看起来可以做「从子宫活动预测多久会生」,但二十五个入组条件相似的产妇,结局的散布范围很窄,任何相关性都容易在留一交叉验证里掉下来。这类分析可以做,结论必须写成探索性。

4.5 边界条件:什么时候它不再适用

条件 是否适用 判断依据
你要看宫缩的空间分布 适用 一百多路是它的全部意义
你要估传播速度 适用 与配套论文一致
你要做频域特征 部分适用 只剩 0.1 至 1 赫兹
你要做宫缩逐段识别训练 不适用 无标注
你要做跨人群泛化 不适用 单中心二十五人
你要研究体位效应 不适用 只有坐姿
你要与电极数据对齐 不适用 模态不同,无同步采集
你要做长时连续监测 不适用 单条二十分钟

§5 怎么拿到:从一条头文件到一张腹部等值线图

5.1 目录与体量

官方页面没有给出整包大小,文件的逐项字节数在目录列表里可以看到,但部分地区访问目录页会被拦。体量可以从规格推:一条二十分钟的记录有三万八千四百个采样点,一百四十八个通道,若按 WFDB 常见的十六位整数存储,单条约十一兆字节量级;若按浮点存储则更大。二十五条记录加上坐标与示意图,整包在数百兆字节量级。

文件类 数量 单件体量 说明
头文件 每条一个 数百字节到数十字节 文本
数据体 每条一个 十兆字节量级 多通道交错
坐标记录 1 条 极小的文本 149 行
阵列图 2 个 图文件 eps 与 tif
标注文件 0 无 官方未提供

体量本身不是障碍,障碍在下载通道:目录列表在部分网络里返回 403,但单文件路径仍可访问。若批量下载,直接用 wget -r 会撞上同一个限制,稳妥的做法是先拿到记录名清单,再逐个拼地址。批量抓取还有一处细节:头文件与数据体必须成对,只抓 .hea 能完成规格普查但读不出信号,只抓数据体则连通道数都不知道。

5.2 批量获取

#-- 单条记录:先取头文件确认规格
curl -sL -o /tmp/001_38w0d.hea \
  https://physionet.org/files/mmgdb/1.0.0/001_38w0d.hea

#-- 再取数据体
curl -sL -o /tmp/001_38w0d.dat \
  https://physionet.org/files/mmgdb/1.0.0/001_38w0d.dat

#-- 坐标记录单独取一份即可
curl -sL -o /tmp/sensorpositions.hea \
  https://physionet.org/files/mmgdb/1.0.0/sensorpositions.hea

上例中的记录名是示意写法,实际名字请以官方页面文件列表为准。记录名的前三位是受试者编号,下划线之后是孕周,这个规则在批量拼地址时很有用:只要知道编号集合与孕周集合,就能生成候选地址,但应先确认官方列出的是哪一组,不要凭规则猜。

5.3 先看注释,再写解析

临床字段在注释行里,格式由发布时的整理脚本决定,官方页面只做了描述性罗列。稳妥的第一步是打印,而不是匹配。

import wfdb

base = "https://physionet.org/files/mmgdb/1.0.0"
h = wfdb.rdheader(f"{base}/001_38w0d")
for i, line in enumerate(h.comments):
    print(i, "|", line)

打印出来的每一行通常是「字段名 冒号 值」的形式。看到真实文本之后,再决定用正则拆分还是按位置取。若某条记录的注释行数与其它记录不同,说明发布时的整理不是完全统一,这类记录要单独处理。

5.4 通道对齐:坐标与信号谁对谁

坐标记录有一百四十九个通道,信号记录有一百四十七或一百四十八个。两者不等,因此不能按下标硬对。正确做法是按通道标签取交集。

检查点 预期 不符时的常见原因 处理
头文件通道数 147 或 148 读到了坐标记录 按记录名分开读
坐标行数 149 读到了信号记录 单独读 sensorpositions
采样率 32 Hz 文件损坏 重新下载
通道标签形态 数字加前缀 版本差异 先打印再匹配
交集大小 应等于信号通道数 标签拼写不一致 统一大小写与分隔符
import numpy as np

sig_names = [s.strip().upper() for s in rec.sig_name]
pos_names = [s.strip().upper() for s in pos.sig_name]
shared = [n for n in sig_names if n in pos_names]
print("信号通道", len(sig_names), "坐标通道", len(pos_names), "交集", len(shared))

idx_sig = [sig_names.index(n) for n in shared]
idx_pos = [pos_names.index(n) for n in shared]
X = rec.p_signal[:, idx_sig]
P = pos.p_signal[idx_pos, :3]
print(X.shape, P.shape)

交集不等于信号通道数时,说明有通道在坐标记录里没有对应项,这些通道只能在下游分析里丢弃,或者在腹部图上按相邻探头插值补位。丢弃是最稳妥的选择,补位会引入与数据无关的位置假设。

5.5 投影与出图

一百多路数据最直观的用法是画腹部等值线。这一步需要把三维坐标投到二维平面,再在平面上对每一时刻的通道值做插值。

import numpy as np
from scipy.interpolate import griddata

#-- P:通道 × 3 的坐标;v:某时刻各通道的值
def abdomen_map(P, v, grid=120):
    u, s, vt = np.linalg.svd(P - P.mean(axis=0), full_matrices=False)
    p2 = P @ vt[:2].T                     #-- 投到前两个主成分方向
    gx = np.linspace(p2[:, 0].min(), p2[:, 0].max(), grid)
    gy = np.linspace(p2[:, 1].min(), p2[:, 1].max(), grid)
    GX, GY = np.meshgrid(gx, gy)
    return GX, GY, griddata(p2, v, (GX, GY), method="cubic")

GX, GY, Z = abdomen_map(P, X[6000])
print("网格", Z.shape, "有效点", int(np.isfinite(Z).sum()))

主成分投影在这里是合适的选择,因为阵列本身就是一个近似平面的曲面,前两个主成分承载了绝大部分几何方差。剩下的一个主成分应当很小;若它不小,说明阵列在这个受试者身上贴合得不好,或者坐标读取有误。

import numpy as np

#-- 逐时刻取绝对值最大通道,看「最强点」在腹部上的移动
band = X - X.mean(axis=0, keepdims=True)
strong = np.abs(band).argmax(axis=1)
win = 32 * 30                          #-- 三十秒一个窗
for k in range(0, len(strong) - win, win):
    seg = strong[k:k + win]
    vals, cnts = np.unique(seg, return_counts=True)
    print(f"第 {k // win + 1} 窗 主导通道 {vals[cnts.argmax()]} 占 {cnts.max() / win:.2f}")

这段输出回答的是「最强信号点是否在移动」。若某个窗里主导通道一直是同一个编号,说明信号来源稳定;若它在相邻窗之间来回跳,说明主导通道不稳定,多半是宫缩本身不强,或者母体体动被误当成宫缩。这就是 §4.2 的案例里那个检查点存在的原因:先确认流程能给出合理的量级,再去解释数值。

5.6 六个最容易出错的地方

易错点 表现 正确做法
把 MMG 当肌音图 期待几十赫兹的加速度信号 记住它是磁场,只有 0.1 至 1 赫兹
按下标对通道 坐标与信号错位 按标签取交集
用一维数组画图 图上一团乱 先投影再插值
把 25 与 36 混用 引用人数时前后不一 两个口径并列
忘了 32 Hz 的时间分辨率 认为能分析波形锐度 只算延迟与包络统计
用全样本算重心 静息段把宫缩段淹没 先分段再算重心

第二条与第六条最隐蔽。前者不会报错,只会在腹部图上表现为「信号似乎集中在某一侧」,其实是被错位的坐标拉过去了。后者不报错也不异常,只是让重心序列变成一条近乎平线,延迟估不出来。

§6 与库内条目的关系

6.1 关系图谱

在千方医数集的妊娠电生理版图里,这份库站在「空间分辨率」这一端,与站在「时间长度」与「结局标签」两端的条目互为补充。下面这张表按接口给出每一条相邻资源与它的关系,以及迁移时最容易忽略的一点。

关联资源 关系类型 具体接口 迁移注意
ICEHG DS 引产与剖宫产子宫肌电 模态互补 同为子宫电活动,通道与采样率不同 不可把电位与磁场数值对照
TPEHGT 孕期子宫肌电 模态互补 三路差分加一路压力计 那边有宫缩区间标注
CTU-UHB 产时胎心监护 场景相邻 同产时场景,那边是压力与胎心 那边有临床结局
FECGSYNDB 合成胎心电 方法相邻 腹部多路信号的处理链 合成数据可做流程测试
adfecgdb 腹部与直接胎心电 方法相邻 同为腹部多路记录 关注胎儿而非子宫
PICS 早产儿心肺信号 人群相邻 都是围产期人群 一个是胎儿期一个是新生儿
本库在其间的身份 空间维度提供者 只有它有上百通道 只补空间,不补标注

最有价值的组合是与带宫缩标注的体表子宫肌电库联用:从那类库学「宫缩长什么样、怎么切」,再到这份库上做空间分析。这样能绕开本库没有标注的短板,代价是两边的模态不同、不能直接比数值。

6.2 检索路径

在妊娠类目下,按「要回答什么问题」检索比按规模检索更有效。

检索意图 首选入口 次选入口 判断依据
宫缩的空间分布 本库 无同类 是否有上百通道
宫缩传播速度 本库 无同类 是否需要区域划分
早产预测 ICEHG DS TPEHGT 是否有结局与孕周分层
产时监护基准 CTU-UHB 本库 是否有厂家级标注
胎儿心律 腹部胎心电类库 合成类库 是否关注胎儿
多路信号处理流程测试 本库或合成库 合成库优先 是否要求真值
妊娠结局与信号关联 ICEHG DS TPEHGT 是否有分娩结局

判据可以浓缩成三个问题:这个问题是否与「宫缩在腹部怎么分布」有关?它是否不需要逐段标注?它是否能接受二十五人的样本量?三问都肯定,本库就是首选;任何一问否定,就该换库。

§7 质量评估与局限性

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

在对这份库打任何分数之前,要先校正一个常见的错位:把它当成「样本太少、标注太少」的失败样本。这个判断本身是误判,因为它假设了这份库的目标是支撑人群层面的统计推断或监督学习。官方描述写得很直白,它记录的是受试者在产房分诊台接受监测时的子宫磁活动,为的是看收缩在腹部的空间结构。按这个目标衡量,二十五人不是疏漏,而是设备可用时间与入组条件共同决定的现实上限;没有标注也不是疏忽,因为它的任务是摊开空间,而不是标出事件。

校正之后的判断标准应该换成三条:空间采样是否够密、通道是否同步、几何是否可复现。这三条它都站得住:一百多路同时覆盖腹部前侧曲面,通道来自同一台阵列因而天然同步,坐标与阵列示意图一并公开。它站不住的也是三条:能否代表人群、能否支撑逐段识别、能否与电极数据对照。把这两组问题分开,评价才不会错位。下文 §7.1 至 §7.4 分别对着这两组问题给分与列举。

7.1 五维评分

分层 治理关注点 在本库上的落点 使用者该看哪一行
数据本体 采集规格是否可复算 采样率、滤波参数、通道数 第二与第三行
溯源 能否追到原始论文与设备 DOI 与配套论文 第一行
许可 可否商用与再分发 ODC-BY 1.0 第四行
使用条件 有没有人群与场景边界 二十五人、单中心、单坐姿 第五与第六行
质量证据 有没有官方质量指标 无信噪比、无坏道清单 第六行

按这个分法看,这份库在本体与许可两层做得很干净,在溯源上也交代了论文与设备,短板集中在质量证据一层。也就是说,评价它的分数低,主要低在「官方没有给出可比的质量指标」与「人群边界极窄」这两件事上,而不是低在「数据做得不好」。

千方医数集采用的规模、结构、标注、边界、可用性五维框架,与 DAIMS(Data, Analytics and Information Management Standards)的分层思路相近:先看数据本身,再看治理与使用条件,而不是只比体量。两套看法的对应关系是:本体对应结构,溯源与许可对应边界,质量证据同时对应标注与可用性,人群与场景则落在规模一项上。这样对应之后,五维评分里每一个分数都能说清它来自哪一层观察,而不是凭印象给分。

维度 分值(五分制) 依据 说明
规模 2 25 人、单条约 20 分钟 空间够,样本与时间都不够
结构 4 147 至 148 路同步、坐标齐备、WFDB 标准 通道口径有三套,需对齐
标注 1 无逐段标注,仅头文件临床字段 监督学习无从谈起
边界 3 许可宽松,适用面窄但清楚 单设备单姿势
可用性 4 体量中等、格式标准、参数写明 目录访问偶有 403

五项的加权完全取决于用途。做空间传播分析,结构一项权重最高,总分可观;做早产预测,标注与规模权重最高,总分很低。任何单一综合分都不该脱离用途被引用。

7.2 注释的真实覆盖范围

官方所说的「注释」与多数数据集的「注释」不是一回事。这里的注释指头文件里的临床字段,是每条记录一份的静态描述,是这名产妇在接受记录那一刻的状态,不是时间轴上的事件。分清这一点,就不会写出「按注释里的宫缩段做监督学习」这类跑不通的代码。

注释项 是否逐记录不同 覆盖范围 能否支撑监督学习
宫颈扩张 是 官方称有 可作为结局特征
宫颈消退 是 官方称有 可作为结局特征
胎头位置 是 官方称有 可作为结局特征
距分娩天数 是 官方称有 可作为结局
种族 是 官方称有 可作分层变量
BMI 是 官方称有 可作协变量
孕周 是 文件名与头文件 可作分层变量
宫缩起止 无 零 不能
坏道清单 无 零 不能
宫缩次数 无 零 不能

能支撑的只有「以人为单位」的弱监督:给定一段记录,预测该产妇的宫颈状态或距分娩天数。这类任务在二十五人上的可做性很低,更适合作为探索性关联分析,而不是训练集。

另一处需要留意的是临床字段的取值口径。官方页面是罗列式表述,没有写清扩张是以厘米还是以指宽记、消退是以百分比还是以十分位记、胎头位置是在坐骨棘上还是下。这些细节在写解析代码之前,必须先打印一条记录的真实注释行确认(§5.3),不要按临床惯例默认。

7.3 已知的、可枚举的偏差

偏差项 具体表现 影响 可否从数据里校正
人数偏差 25 人 统计推断力极弱 不可校正
单中心偏差 只有 UAMS 人群背景单一 不可校正
入组偏差 均来自产房分诊台 只代表「疑似临产」者 不可校正
孕周偏差 论文称 37 至 40 周 无早产、无早期妊娠 不可校正
体位偏差 只有前倾坐姿 无法研究体位效应 不可校正
设备偏差 只有一台 SARA 无跨设备比较 不可校正
频段偏差 只留 0.1 至 1 Hz 高频成分不可得 不可校正,需原始数据
时长偏差 每条 10 至 20 分钟 无法看长时段趋势 不可校正
通道口径偏差 151、149、147 至 148 三种 需对齐,易错 可按标签对齐部分缓解

这张表九行里只有最后一行可以从数据内部缓解。其余八项都是结构性的:它们不决定「偏多少」,而决定「哪类问题在这份数据上根本不能问」。跨设备、跨体位、跨孕周、长时程这四类问题,无论用什么统计技巧都补不回来。

§4.2 的案例在这里是个具体的提醒。那条记录算出的传播速度即使与论文量级一致,也只代表一名孕三十八周零天的产妇在一次二十分钟坐姿记录里的情况。把它当成「足月子宫的典型传播速度」,就是把一个人当成了所有人。

7.4 外部验证矩阵

外部验证指用本库之外的资源检验从本库得到的结论。对二十五人的小库,这一步几乎是必做:没有外部参照,任何看起来漂亮的结果都可能只是在这二十五人身上成立。

验证方向 可用外部资源 验证方式 预期结果
传播速度量级 配套论文 比较自己算出的范围与论文摘要 应落在 1.3 至 9.5 厘米每秒
宫缩分段方法 带宫缩标注的体表子宫肌电库 把那边的方法搬到这边跑 分段结果需人工抽查
空间模式 无同类磁图公开库 只能与文献图对照 定性一致即可
临床关联 带结局的产时监护库 比较关联方向 方向一致、强度不同
预处理复现 官方描述的参数 按参数重跑滤波 应得到相近的频段能量

第二行最实用。本库缺标注,但标注方法可以从别处借;借来之后在本库上跑一遍,结果是否合理,靠腹部图上肉眼检查。这一步没有标准答案,所以在任何报告里都应当写成「按某某方法分段,经人工抽查」。

7.5 它为何能持续:一台不能随便搬动的设备,只留下这一份公开账

这份库能十年不删、持续被引用,原因不在它的数据量,而在它的稀缺性来源是一种设备。SARA 装在阿肯色,全国范围内同类装置屈指可数,一次记录要占用屏蔽室、液氦与专人操作。想自己采一套等价数据,不是经费问题,而是有没有这台机器的问题。

于是这份公开库成了唯一可用的替代品。任何一个想做腹部磁场空间分析的研究组,只要不在这台机器旁边,就只能从这里取数。它在文献里很少作为主数据集,更多是作为「磁图能做什么」的证据与流程参照。

它的稳定性也来自同一处。设备没变、预处理没变、版本号就不需要变。它不靠持续供给新数据活着,靠的是「别人拿不到」这一点长期成立。

§8 生态位与历史

8.1 从胎心磁图到子宫磁图

磁图在围产领域的应用起于胎儿。胎儿心电的磁场在母腹外可以被超导阵列拾取,用来做胎儿心律分析,避开母体心电的强干扰。九十年代之后,随着多通道超导系统成熟,研究者开始把同一套硬件用于子宫:既然阵列已经罩在腹前,何不顺便看子宫的活动。

这条线在 2002 年出现了标志性的一步——首次用 151 通道阵列记录到带时空信息的子宫活动。此后十年,围绕 SARA 的工作主要集中在两件事:证明子宫磁图确实反映了宫缩,以及用传播特性区分足月与早产。2015 年的 PLOS ONE 论文是这条线上的一个阶段性总结,2016 年的数据发布则把它变成了可复用的公共资源。

阶段 时间 特征 本库的位置
胎儿磁图起步 1990 年代 关注胎儿心律 尚未涉及子宫
子宫磁图验证 2002 至 2010 证明信号可用 技术来源
传播特性研究 2010 至 2015 用象限与延迟刻画传播 配套论文
数据公开 2016 年起 转为公共资源 2016 年加入
当前 至今 版本未变,作为稀缺参照 稳定存续

8.2 与后续研究的关系

这份库在 2016 年之后的文献里,承担的是一种「不可替代的对照」角色。研究者要论证腹部磁场能给出比电极更细的空间信息时,几乎绕不开它;要论证某套新的传播估计方法有效时,也需要一个公开的、有坐标的、通道足够多的数据集。

研究方向 与本库的关系 典型用法
子宫磁场源定位 源头 用坐标与多通道做逆问题
传播速度估计 源头 复现或改进象限法
早产预测 背景 说明磁图分辨率的优势
体表子宫肌电阵列化 参照 论证通道数增加的价值
多通道信号处理 测试床 一百多路同步便于测算法
临床转化 参照 说明设备门槛

第五行在近年值得注意。多通道腹部记录的处理方法(降维、源分离、跨通道相关)可以在本库上先跑通,再迁到可穿戴的电极阵列上。本库在这里的角色不是临床数据的来源,而是算法与几何的试验场。

8.3 生态位:一扇开在设备旁边的窗

用一句话概括它的生态位:它是唯一一扇开在那台机器旁边的窗。窗外的风景不宽,但只有这里有。

这个定位解释了它的全部特征。二十五人是极限而非疏漏,因为每做一次记录都要占用一台稀有设备与一段屏蔽室时间。没有标注是分工的结果,因为它的任务是把空间结构摊开,而不是把事件标出来。频段被压到 0.1 至 1 赫兹,是因为要研究的对象就是那个频段。规格统一是必需的,因为跨记录比较要求输入一致。

定位 需要的属性 本库是否满足 反例
稀缺设备型资源 高通道数、有坐标、规格统一 满足 可穿戴电极阵列做不到这个密度
样本型资源 大、有代表性、有标注 不满足 只有 25 人无逐段标注
基准型资源 官方划分与评分脚本 不满足 无划分无脚本
教学型资源 体量小、结构清楚 部分满足 一百多路对新手偏重

第三行与第四行值得对照看。它不是基准库,因为没有官方划分;也不是理想的教学库,因为一百多路的可视化门槛高于普通心电库。但它可以当作「多通道数据怎么处理」的进阶练习:先把一百多路塞进内存,再学投影与插值,最后才谈信号本身。

这种定位也解释了它为何很少被当成主数据集写进论文标题。主数据集意味着「本文的数据来自这里」,要求数据本身有足够大的人群与标注去撑起一个临床结论;这份库出现在方法描述里的方式则是「在公开数据上验证」,只需数据足够具体,能把方法的输入输出讲清楚。

还有一个容易被忽视的侧面:它是少数把「设备几何」一并公开的记录集。sensorpositions 给出了一百四十九个通道的三维坐标,SARAarray.eps 给出阵列外观。对想复现逆问题或源定位的研究组来说,几何往往比信号本身更难获取。没有坐标,多通道数据只是一堆互不相关的序列,只能做通道层面的相关分析,无法回答「腹部哪个位置的活动最强」;有了坐标,同一批数字才变成可以画在腹部上的场。这一层价值与人数无关,与标注无关,与频段也无关,是这份库最不容易被替代的部分。

8.4 谁在用它,用来做什么

使用者类型 典型用途 从中获得的东西 主要障碍
围产研究者 研究宫缩传播 上百通道加坐标 无标注需自切
信号处理研究者 多通道方法的测试床 同步多路、几何明确 频段被压得很窄
磁图设备开发者 方法学对照 公开的真实记录 与自家阵列几何不同
综述作者 说明磁图分辨率 可引用的公开数据 只能引用不能复算全部
学生 学习 WFDB 多通道 规格统一 体量与画图门槛
数据工程师 流程与校验脚本测试 通道口径不一,能测出对齐 bug 体量偏大,迭代慢

最后一行是常被忽略的用法。这份库的通道数有三个口径、坐标与信号要按标签对齐,这些「不一致」恰好是最好的测试输入:任何对齐逻辑写错,都会在这一步暴露。比起在干净的小库上跑通,在这些口径不一的地方跑通,更能说明流程真的写对了。

§9 使用指引

9.1 三种角色的路径

角色 目标 第一步 第二步 第三步
围产研究者 估一次宫缩的传播 读坐标并投到平面 分象限算重心与延迟 与文献量级对照
信号处理研究者 测多通道方法 读一条记录摸清形状 把方法跑在全部记录上 与简单基线比
学生 学会多通道数据 打印头文件与注释行 画一张腹部等值线图 写一页观察笔记

三条路径的起点都是头文件。跳过这一步直接读数据体,很容易在通道数上踩坑:一百四十七、一百四十八、一百四十九三个数字长得像,写进代码里却指向完全不同的列。

9.2 一条最短的可用流程

import numpy as np
import wfdb

base = "https://physionet.org/files/mmgdb/1.0.0"

#-- 1 读坐标记录
pos = wfdb.rdrecord(f"{base}/sensorpositions")

#-- 2 读一条数据并打印规格
rec = wfdb.rdrecord(f"{base}/001_38w0d")
print("通道", rec.n_sig, "采样率", rec.fs, "点数", rec.sig_len)

#-- 3 按标签对齐坐标与信号
sn = [s.strip().upper() for s in rec.sig_name]
pn = [s.strip().upper() for s in pos.sig_name]
shared = [n for n in sn if n in pn]
X = rec.p_signal[:, [sn.index(n) for n in shared]]
P = pos.p_signal[[pn.index(n) for n in shared], :3]

#-- 4 上下左右四象限
mx, my = np.median(P[:, 0]), np.median(P[:, 1])
quad = {
    "上": (P[:, 1] >= my) & (P[:, 0] >= mx),
    "下": (P[:, 1] < my) & (P[:, 0] < mx),
    "左": (P[:, 1] >= my) & (P[:, 0] < mx),
    "右": (P[:, 1] < my) & (P[:, 0] >= mx),
}
print({k: int(v.sum()) for k, v in quad.items()})

输出四个象限的通道数,四个数相加应等于交集大小。若某象限接近零,说明坐标的投影方向与预期不同,需要看 SARAarray.eps 确认哪个轴对应腹部上下。

import numpy as np

#-- 五分钟窗内的四象限重心,以及两两延迟
win = 32 * 300
seg = X[:win]
cog = {}
for k, m in quad.items():
    w = np.abs(seg[:, m])
    w = w / (w.sum(axis=1, keepdims=True) + 1e-12)
    cog[k] = (seg[:, m] * w).sum(axis=1)

def delay(a, b, max_lag=64):
    a = (a - a.mean()) / (a.std() + 1e-12)
    b = (b - b.mean()) / (b.std() + 1e-12)
    c = np.correlate(a, b, mode="full")
    lag = np.arange(-len(a) + 1, len(a))
    keep = np.abs(lag) <= max_lag
    return int(lag[keep][np.argmax(c[keep])])

ks = list(cog)
for i in range(len(ks)):
    for j in range(i + 1, len(ks)):
        print(ks[i], ks[j], "延迟采样点", delay(cog[ks[i]], cog[ks[j]]))

延迟以采样点为单位,除以三十二得到秒。乘以二得到跨两个象限的往返延迟。用几何距离除以延迟,就是论文意义上的速度估计。这一步的结果一定要与论文摘要给出的量级对照,偏差过大应当回到分段环节重新检查。

9.3 引用方式

官方页面给出的引用分两层:数据集的原始论文,以及平台的标准引用。两层都写,才算把「数据从哪来」与「托管在哪」交代完整。

引用层级 引用内容 格式建议
数据集 Escalona-Vargas 等,PLOS ONE 2015 作者、题名、期刊、卷期、DOI
平台 Pollard 等,Nature Health 2026 作者、题名、期刊、DOI
版本 MMG Database v1.0.0 名称加版本号
标识 DOI 10.13026/C2ZW95 可解析链接
许可 ODC-BY 1.0 署名要求

第三行最容易漏。PhysioNet 的库会更新,引用时写明 1.0.0 才算精确定位。DOI 指向特定版本,两者一起写最稳妥。

9.4 复现一份最小报告的三步检查

检查点 预期 不符时的常见原因 处理
通道数 147 或 148 读错记录 按记录名区分
坐标行数 149 混淆了两条记录 单独读坐标
采样率 全库 32 Hz 文件损坏 重新下载
交集大小 等于信号通道数 标签拼写不一致 统一大小写
延迟量级 零点几秒到几秒 分段没对准 先看包络再比

第三步之后,所有下游分析都建立在对齐正确的前提上。一旦对齐错了,后面的传播速度、等值线图、最强通道轨迹全部失真,而且不会报错。

§10 AI 使用声明

项目 内容
写作方式 由人工智能辅助撰写,人工校核事实与表述
事实来源 PhysioNet 项目页、欧洲 PMC 论文摘要、PhysioNet 平台页
未使用的手段 未下载全量数据做分布统计,未做频次或空值分析
数字口径 官方页面与论文摘要给出什么就写什么,两处不一致时并列
不确定项处理 标注「官方未公布」或「工作假设」,不写成事实
代码示例 记录名为示意写法,实际以官方文件列表为准
封面图 由生成模型按风格提示词产出,不含真实数据
更新责任 若官方页面修订,以官方为准

常见误读(避坑清单)

说法 实际 证据
MMG 是肌音图 此处展开为 magnetomyography,即磁图 官方摘要首句
这是电极测的电位 用超导量子干涉阵列测磁场 官方摘要中的 SARA 全称
有一条记录一路记录二十五人 一条记录属于一名受试者 文件名前三位为编号
每条都是 151 路 处理后保留 147 至 148 路 官方数据描述
采样率是 250 Hz 原始 250 Hz,发布版为 32 Hz 官方数据描述
有宫缩起止标注 无独立标注文件 官方页面与目录
受试者是随机孕妇 均为产房分诊台受检者 官方摘要
采样率太低所以数据没用 目标是 0.1 至 1 赫兹的收缩成分 官方滤波说明
二十五人与三十六人矛盾 两个口径:入组与成功处理 官方摘要与论文摘要
有同步的电极通道可对照 无,只有磁通道 官方数据描述

FAQ

问:MMG 是肌音图吗?
答:不是。在这个库里 MMG 展开为 magnetomyography,指用超导阵列记录器官电活动产生的磁场。它与运动科学里用加速度计测肌肉机械振动的肌音图完全没有关系(§1.2)。

问:它到底有多少人、多少条记录?
答:官方摘要称二十五名受试者,每条记录对应一名受试者。配套论文称从三十六名孕妇中成功处理了二十五人的记录。两个数字并存,差额含义官方未在摘要里说明(§3.3)。

问:为什么每条记录只有 147 到 148 路,而不是 151 路?
答:官方说明是滤波并剔除母体体动片段后的结果。设备阵列是一百五十一个探头,坐标记录给出一百四十九个通道的坐标,记录里剩一百四十七或一百四十八路。每一步减了哪些,官方没有逐条列出(§2.4)。

问:采样率 32 Hz 是不是太低了?
答:对形态分析确实低,对传播分析够用。三十二赫兹对应约三十一毫秒的时间分辨率,而区域内延迟通常在零点几秒以上。官方降采样的目的正是留下 0.1 至 1 赫兹的收缩成分(§4.3)。

问:有没有宫缩标注?
答:没有。目录里没有标注文件,官方只说明头文件含宫颈扩张、消退、胎头位置、距分娩天数、种族、BMI 与孕周。要做宫缩检测,得自己从信号里切(§7.2)。

问:用它能预测早产吗?
答:这份库覆盖论文所称的三十七到四十周,本身就不包含早产病例。头文件里的临床字段可以做探索性关联,但二十五个入组条件相似的产妇不足以支撑预测模型(§7.3)。

问:能不能和体表子宫肌电直接对照?
答:不能直接对照数值。一个测电位,一个是磁场,物理量不同,也没有同步采集的电极通道。可以在「同样描述子宫活动」这一层做定性比较(§2.5)。

问:为什么只有一种坐姿?
答:SARA 是固定式超导装置,受试者必须坐在屏蔽室里、腹部贴近阵列。这个物理条件决定了记录的姿势与时长都无法自由变化(§3.1)。

问:可以商用吗?
答:ODC-BY 1.0 允许商用,条件是署名。署名应引用官方指定的那篇 PLOS ONE 论文,并同时引用 PhysioNet 平台(§9.3)。

问:数据会不会更新?
答:版本号自 2016 年 3 月发布以来一直是 1.0.0,没有修订记录。若官方日后发布新版本,应以官方为准(§3.4)。

问:适合当教学材料吗?
答:适合做进阶练习,不适合入门。一百多路数据对新手偏重,可视化需要投影与插值,但结构统一、文档清楚,学会了就能直接用在其它多通道库上(§8.3)。

问:要用它需要什么硬件?
答:不需要。数据处理只用普通计算环境,Python 加 WFDB 库即可。需要超导设备的只是采集端,与使用者无关(§5.1)。

术语表

术语 英文 在本库中的含义
磁图 magnetomyography 记录器官电活动所产生磁场的成像方法
超导量子干涉器件 SQUID 测极弱磁场的超导探头
SARA SQUID Array for Reproductive Assessment 151 探头的妇科磁图阵列
子宫磁图 uterine magnetomyography 本库记录的具体对象
子宫肌电 electrohysterogram 同一生理过程的电学测量,本库未提供
宫缩 uterine contraction 子宫平滑肌收缩,本库关注的低频活动
爆发片段 burst 一段能量升高的收缩活动,本库未标注
电荷重心 center of gravity 一个区域内各通道按其幅值加权后的中心位置
传播速度 propagation speed 延迟与区域间距之比,论文给出 1.3 至 9.5 厘米每秒
象限 quadrant 按坐标把腹部切成上下左右四块
带通滤波 band-pass filter 本库为 0.1 至 1 赫兹
陷波滤波 notch filter 本库为 0.25 至 0.35 赫兹,压制呼吸
降采样 downsampling 从 250 赫兹降到 32 赫兹
体动片段 movement segment 母体移动造成伪迹的片段,已剔除
头文件 header file WFDB 的文本描述文件,后缀 hea
数据体 data file WFDB 的二进制文件
记录 record 一名受试者的一次记录单位
传感器坐标 sensor positions 149 个通道的三维位置
孕周 gestational age 记录名中的周数加天数
宫颈扩张 cervical dilation 头文件临床字段,厘米
宫颈消退 effacement 头文件临床字段,百分比
胎头位置 station 头文件临床字段
屏蔽室 shielded room 超导磁图的必需环境
分诊台 triage unit 受试者的入组场所
开放许可 ODC-BY 1.0 允许商用,需署名
空间分辨率 spatial resolution 本库相对体表电极的最大优势

附录 A:核心数字核对表

项 值 来源 来源层级
受试者数 25 官方摘要 官方
入组人数 36 论文摘要 论文
成功处理人数 25 论文摘要 论文
设备探头数 151 官方摘要 官方
坐标通道数 149 官方数据描述 官方
每条记录通道数 147 至 148 官方数据描述 官方
原始采样率 250 Hz 官方数据描述 官方
发布版采样率 32 Hz 官方数据描述 官方
带通下限 0.1 Hz 官方数据描述 官方
带通上限 1 Hz 官方数据描述 官方
陷波区间 0.25 至 0.35 Hz 官方数据描述 官方
单条原始时长 约 20 分钟 官方摘要 官方
单条处理后时长 10 至 20 分钟 官方数据描述 官方
孕周范围 37 至 40 周 论文摘要 论文
传播速度范围 1.3 至 9.5 厘米每秒 论文摘要 论文
版本 1.0.0 官方页面 官方
发布日期 2016-03-04 官方页面 官方
许可 ODC-BY 1.0 官方页面 官方
DOI 10.13026/C2ZW95 官方页面 官方

附录 B:数字的来源分层

层级 含义 本页涉及的数字
官方页面 PhysioNet 项目页直接给出 人数、探头数、通道数、采样率、滤波参数、时长、版本、许可、DOI
官方描述 官方数据描述中逐段给出的规格 坐标通道数、文件名规则、临床字段清单
论文摘要 PLOS ONE 论文摘要 入组三十六人、成功二十五人、孕周三十七到四十周、传播速度范围
推导 由官方数字换算 时间分辨率约 31 毫秒、二十分钟约三万八千点、单条内存量级
工作假设 依据几何与流程提出、官方未验证 四象限划分方式、延迟搜索窗、主导通道轨迹的意义

前两层可直接引用;第三层用于背景与量级对照;第四层可复算;第五层必须标注为方法选择,不能当作官方结论。

附录 C:完整参考文献

序号 文献 用途
1 Escalona-Vargas D, Govindan RB, Furdea A, Murphy P, Lowery CL, Eswaran H. Characterizing the Propagation of Uterine Electrophysiological Signals Recorded with a Multi-Sensor Abdominal Array in Term Pregnancies. PLoS ONE 10(10):e0140894, 2015. 数据集配套论文
2 PhysioNet. MMG Database v1.0.0. 2016-03-04. DOI 10.13026/C2ZW95. 官方数据页
3 Eswaran H, Preissl H, Wilson JD, Murphy P, Robinson SE, Lowery CL. First magnetomyographic recordings of uterine activity with spatial-temporal information with a 151-channel sensor array. Am J Obstet Gynecol 187(1):145-151, 2002. 技术来源
4 Eswaran H, Preissl H, Wilson JD, Murphy P, Lowery CL. Prediction of labor in term and preterm pregnancies using non-invasive magnetomyographic recordings of uterine contractions. Am J Obstet Gynecol 190(6):1598-1602, 2004. 应用背景
5 Pollard T, Moody BE, Lehman LH, Gow BJ, Fernandes C, Xie C, Johnson A, Mark RG, Heldt T. PhysioNet as a global platform for biomedical research. Nature Health, 2026. 平台引用
6 Open Data Commons. Attribution License v1.0. 许可文本

附录 D:任务代码

一段完整的脚本:读一条记录,按标签对齐坐标,分四象限求重心,输出两两延迟。

import numpy as np
import wfdb

BASE = "https://physionet.org/files/mmgdb/1.0.0"
REC = "001_38w0d"      #-- 示意记录名,实际以官方列表为准

def load(rec_name, base=BASE):
    rec = wfdb.rdrecord(f"{base}/{rec_name}")
    pos = wfdb.rdrecord(f"{base}/sensorpositions")
    sn = [s.strip().upper() for s in rec.sig_name]
    pn = [s.strip().upper() for s in pos.sig_name]
    shared = [n for n in sn if n in pn]
    X = rec.p_signal[:, [sn.index(n) for n in shared]]
    P = pos.p_signal[[pn.index(n) for n in shared], :3]
    return rec, X, P

def four_quadrants(P):
    mx, my = np.median(P[:, 0]), np.median(P[:, 1])
    return {
        "上": (P[:, 1] >= my) & (P[:, 0] >= mx),
        "下": (P[:, 1] < my) & (P[:, 0] < mx),
        "左": (P[:, 1] >= my) & (P[:, 0] < mx),
        "右": (P[:, 1] < my) & (P[:, 0] >= mx),
    }

def cog(block):
    w = np.abs(block)
    w = w / (w.sum(axis=1, keepdims=True) + 1e-12)
    return (block * w).sum(axis=1)

def delay(a, b, max_lag=64):
    a = (a - a.mean()) / (a.std() + 1e-12)
    b = (b - b.mean()) / (b.std() + 1e-12)
    c = np.correlate(a, b, mode="full")
    lag = np.arange(-len(a) + 1, len(a))
    keep = np.abs(lag) <= max_lag
    return int(lag[keep][np.argmax(c[keep])])

rec, X, P = load(REC)
print("通道", rec.n_sig, "对齐后", X.shape[1], "采样率", rec.fs)
q = four_quadrants(P)
print("象限通道数", {k: int(v.sum()) for k, v in q.items()})

win = rec.fs * 300      #-- 取前五分钟
seg = X[:win]
c = {k: cog(seg[:, m]) for k, m in q.items()}
ks = list(c)
for i in range(len(ks)):
    for j in range(i + 1, len(ks)):
        d = delay(c[ks[i]], c[ks[j]])
        print(f"{ks[i]}-{ks[j]} 延迟 {d / rec.fs:.3f} 秒")

脚本输出四行延迟。把延迟乘以三十二再除以距离,就得到速度;量级应当落在一到十厘米每秒之间。若算出负数或零,说明两个象限的重心几乎同步,多半是窗内没有明显宫缩。

附录 E:如果只记五件事

序 要点 一句话
1 它是什么 子宫磁图库,MMG 展开是 magnetomyography
2 它有什么 25 人、每条 147 至 148 路、32 Hz、10 至 20 分钟
3 它缺什么 无宫缩标注、无早产病例、无多体位
4 它最适合 宫缩空间分布与传播速度分析
5 它最容易被误用 当肌音图打开,或当带标注数据训练模型

编辑说明

本页事实以 PhysioNet 的 MMG Database 1.0.0 项目页为主,辅以配套 PLOS ONE 论文摘要的核对。凡官方未公布的项,标「官方未公布」;凡依据几何与流程提出的推断,标为工作假设。正文未做任何分布统计。本轮核查中,项目目录在部分网络路径返回 403,单文件与头文件路径可正常访问;官方页面本身可访问。若官方后续修订,以官方为准。

串起全文的是 001_38w0d 这一条孕三十八周零天的记录,第一次出现在 §2.3,并在 §4.2、§5.5、§7.3、§9.2 等处回指。选它的原因是它同时落在论文所述孕周区间内、命名两个组成部分都能展示,且用它可以完整走一遍「对齐、分象限、求重心、估延迟」的流程。


相关数据集导航

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

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

返回 AI-Ready 数据集