信息速览
一台脉搏血氧仪夹在手指上,三秒后给出一个数字:98%。这个数字在临床上决定要不要给氧、要不要插管、要不要让病人出院,可它和真实动脉血氧饱和度之间的差,从来没有人能在公开数据里系统地量过。量这件事之所以难,不在于算法,而在于金标准——真正的金标准是动脉血,而要拿到动脉血,得在受试者身上置一根桡动脉导管,并且让他在可控条件下被"脱饱和"到缺氧区间。能做这件事的实验室全球一只手数得过来,其中愿意把数据公开的更少,愿意按统一结构长期维护的几乎没有。于是过去二十年里,关于血氧仪在深色皮肤上偏高这一结论,证据主要来自两类并不理想的来源:小样本实验室研究,以及从电子病历里回溯配对的回顾性研究——后者连"这两个数是不是同一时刻测的"都无法保证。
OpenOximetry 脉搏血氧库是为这个缺口建的公共底座。加州大学旧金山分校(UCSF)低氧研究实验室把健康志愿者请进实验室,用闭路呼吸系统把他们的动脉血氧饱和度稳定滴定到 70%–100% 的若干个平台,每个平台上抽一次动脉血,用校准过的共血氧仪测出金标准 SaO2,同时把受试者身上所有被测血氧仪的读数一并记下。这一整套动作被拆成六张关系表、138 个字段,并在同一份数据里附上双轨的皮肤色调度量(Monk 肤色量表与分光光度计)、指径、150 Hz 的多通道生理波形,以及 86 Hz 的未滤波原始光电容积脉搏波。
它的代价同样清楚:受试者是年轻健康志愿者,不是病人;数据是受控实验室条件下的理想读数,不是病房里的真实噪声;当前版本明确声明未经清洗过滤;访问要签数据使用协议。它不是一个"拿来训练大模型"的库,是一把用来量误差的尺子。一屏速览见下表。
一屏速览
| 维度 | 内容 |
|---|---|
| 全名 | OpenOximetry Repository |
| 发布方 | PhysioNet;数据由加州大学旧金山分校低氧研究实验室与 Open Oximetry 项目贡献 |
| 首次发布 | 2024 年 2 月 27 日,版本 1.0.0 |
| 最近改动 | 2025 年 2 月 28 日,版本 1.1.1 |
| 版本序列 | 1.0.0(2024-02-27)、1.0.1(2024-07-30)、1.1.0(2025-02-19)、1.1.1(2025-02-28) |
| 受试者数 | 144 名(论文 v1.0 发布口径,其中 77 名自我认同为女性) |
| encounter 数 | 466 次;人均 3.2 次(标准差 3.65),单人最多 21 次 |
| 设备数 | 53 款脉搏血氧仪(v1.0 初始发布口径) |
| 表结构 | 6 张表、138 个字段(作为对照,OMOP 为 37 表 394 字段) |
| 金标准 | 动脉血气共血氧测定 SaO2,仪器示例为 Radiometer ABL90 Flex Plus |
| 脱饱和区间 | SaO2 70%–100%,期间 PaCO2 维持 35–45 mmHg |
| 波形规格 | 150 Hz 主波形、2 Hz 参考血氧 CSV、86 Hz 原始光电容积脉搏波 |
| 皮肤色调度量 | Monk 肤色量表(定性)+ 分光光度计(定量,每部位重复三次) |
| 文件格式 | CSV 关系表 + WFDB 波形(.dat 配 .hea) |
| 许可 | PhysioNet 受限健康数据许可 1.5.0,须注册并签数据使用协议 |
| 典型用途 | 血氧仪偏差与皮肤色素的关系、跨设备横向对比、波形级误差归因、标准与监管评估 |
§1 它要解决的具体麻烦
1.1 血氧仪的误差不是噪声,是带方向的系统偏差
随机噪声可以通过重复测量消掉,系统偏差不能。脉搏血氧仪的误差恰好属于后者:它不是"测不准",而是"在某些人身上往某个方向偏"。官方背景段把这件事写得很直接——已知部分血氧仪在深色皮肤人群身上报出的读数会高于真实动脉功能饱和度(通常偏高),并且这种偏倚已经产生了真实的临床后果,包括影响治疗资格的判定。
这个偏差的麻烦在于它同时具备三个属性,缺一个都不足以构成公共卫生问题。第一,它有方向性,不是围绕真值对称抖动,所以"多测几次取平均"没有用。第二,它分布在人群的子集上,不是所有人平均承担,所以总体精度指标(比如全体受试者的平均绝对误差)看起来可以接受,落到具体人群上却系统性失真。第三,它作用的场景是低氧区间,而低氧恰恰是最需要准确读数的时刻——血氧 98% 时差 2 个百分点无关紧要,血氧 82% 时差 2 个百分点可能改变处置。
要证明这三点,需要的数据形态是"同一个人在同一时刻的两个数":一个来自被测设备(SpO2),一个来自金标准(SaO2)。而同一时刻这个条件,在真实临床里几乎无法保证。
1.2 为什么这类数据天然稀缺
获取配对数据的门槛由三个环节叠加而成。第一个环节是金标准本身。动脉血要置管,置管是有创操作,需要专业人员在合规环境下完成,样本取出后还要立刻上校准过的共血氧仪分析——血气样本放置时间一长,结果就不可信。第二个环节是低氧状态。要让受试者安全地待在 70%–100% 的饱和度区间,需要闭路呼吸系统、需要滴定医用空气、氧气、氮气与二氧化碳的比例、需要全程监测,这不是病房能做的事。第三个环节是时间。官方方法段写明,一次脱饱和过程约二十分钟,受试者保持不动,每个平台上要等饱和度稳定后才能采血。
回顾性研究绕开了这三个环节,代价是把"同一时刻"这个前提一起绕开了。官方背景段列出了回顾性配对的具体问题:无法确认探头放置是否正确、不知道探头型号、无法评估信号质量、采血时刻与读数时刻可能错位、结果写入电子病历的时刻又可能再错一次,以及采血前后患者状态本身就在变化。更根本的是覆盖范围——能自然稳定地处在 70%–88% 饱和度区间的患者极少,所以回顾性数据几乎拿不到低氧段。
实验室数据与回顾性数据因此不是"多一点少一点"的差别,而是两种不同性质的证据:前者精度高、范围可控、人群窄;后者人群真实、范围残缺、时间不可靠。OpenOximetry 做的是把前者做成可持续更新的公共基础设施,并留出接口把按同样协议采集的前瞻性临床研究合并进来。
1.3 三条常见的错误期待
第一条,期待它是"临床真实环境下的数据"。它来自健康志愿者在实验室里的受控脱饱和,受试者全程不动、设备互相遮光、血气样本即抽即测。论文自己的使用说明也承认,该库聚焦的是理想受控条件下的性能,未必覆盖真实临床场景的变异。想研究运动伪影、探头脱落、末梢灌注差这些病房里常见的问题,它给不了。
第二条,期待它已经清洗干净。官方在"数据更新"一节明确写了:当前版本的实验室脱饱和数据是按采集原样提供的(unprocessed as collected),标准化的清洗流程要等后续版本才实施,过滤标准会在数据更新时公布。把这份数据直接当"干净标注"喂给模型,等于把采集阶段可能引入的伪迹一起喂进去。
第三条,期待它是一份"血氧仪排行"。设备表只描述设备本身(唯一设备号、品牌、型号、透光模式与探头),官方明确说这些描述性数据"在有的时候才发布,并不总是可得,也不是发布数据的必要条件"。也就是说,某些设备你可能拿得到读数却拿不到型号信息;同时,库里出现的设备是实验室按全球市场相关性与普及度自行采购的,不是一份覆盖市场的清单。
1.4 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| SpO2 与 SaO2 的逐次配对 | 每次抽血一个 sample_number,同号下各设备读数与血气结果对齐 | 够,这是它存在的核心理由 |
| 低氧段的性能评估 | 平台覆盖 SaO2 70%–100% | 够,低氧段正是回顾性数据最缺的部分 |
| 皮肤色素与误差的关系 | Monk 量表定性 + 分光光度计定量,多部位多次 | 够,双轨制是别处没有的 |
| 跨设备横向对比 | 53 款设备,同一受试者同一次 encounter 内并测 | 够,但设备清单不覆盖市场 |
| 原始光电容积波形 | 86 Hz 红外与红光双通道,未缩放未滤波 | 够,但仅部分 encounter 有,且当前版本不同步 |
| 真实病房条件下的误差 | 不提供 | 不够,受试者为健康志愿者且保持不动 |
| 临床结局关联 | 不提供 | 不够,无随访、无结局、无用药 |
| 儿童与新生儿 | 不提供 | 不够,当前为健康成人;前瞻性临床研究尚未纳入本版本 |
| 清洗后的分析就绪数据 | 不提供 | 不够,v1.1.1 仍为原样数据 |
1.5 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 你在做血氧仪算法,需要金标准验证 | 提供逐次配对的 SpO2 与 SaO2,可直接算偏差、精密度与均方根误差 | 按 sample_number 做配对,先只保留稳定平台内的样本 |
| 你在评估深色皮肤人群的偏倚 | 提供同一次采血时刻的多设备读数,配双轨色调度量 | 定性用 Monk 量表分层,定量用分光光度计读数做连续分析 |
| 你想做波形级误差归因 | 150 Hz 多通道波形 + 86 Hz 原始 PPG | 先确认 PPG 与其余波形不同步,再决定是否只用主波形 |
| 你在做监管或标准研究 | 采集参数以 ISO 80601-2-61:2017 与 2013 年 FDA 510(k) 指南为基线 | 对照官方方案文档核对平台序列与 PaCO2 控制范围 |
| 你有一份自己的血氧测试数据想并入 | 官方明确接受符合数据字典的外部数据 | 先对照数据字典看字段能否映射,不能映射的联系团队扩展字典 |
| 你在做健康公平的政策研究 | 提供可复用的公开证据链,从实验室数据到临床影响 | 注意人群是健康年轻志愿者,外推到患者要交代清楚 |
1.6 一句话判断与四条边界
它不适合当"更大的训练集",而适合当"更硬的标准答案":在受控条件下把设备读数钉死在动脉血气上,让"误差"这个概念第一次有了可复核的公共基准。
不适合拿来做泛化性能训练。 144 名受试者、466 次 encounter,规模上是一个精细的对照实验,不是一个深度学习语料。
不适合拿来做真实世界性能声明。 受试者是健康志愿者,平均每次 encounter 年龄 27 岁(范围 17–47 岁),不动、遮光、即抽即测。任何"在真实病房里也能达到这个精度"的推论都需要另外的证据。
不适合拿来做结局研究。 数据里没有随访、没有治疗、没有结局。它能说的是"设备读数与金标准差多少",不能说"这个差造成了什么后果"。
不适合直接用 PPG 与其它波形做联合时序建模。 官方明确写了,本版本的原始 PPG 文件与同一次 encounter 的其它波形未做时间同步。
§2 数据构成与规格
2.1 六张表怎么拼起来
OpenOximetry 是一个关系型数据库,不是一堆平铺的 CSV。六张表通过公共标识符连起来,其中大多数表以 encounter_id 为主键的一部分。这个设计不是形式主义,它直接对应采集现场的物理结构:一个人可以来很多次(patient 对 encounter 是一对多),一次 encounter 里抽很多次血(encounter 对 sample_number 是一对多),每次抽血时很多台设备各出一个数(sample_number 对设备读数是一对多)。
表之间的连接键只有三个:patient_id、encounter_id、sample_number(官方使用说明里也写作 sample)。理解这三个键的层级关系,是使用这份数据的全部前提:
| 层级 | 标识 | 粒度 | 谁在这一层 |
|---|---|---|---|
| 人 | patient_id |
一名受试者一行 | 性别、族裔与种族认同、研究站点 |
| 次 | encounter_id |
一次脱饱和或一次临床采样一行 | 年龄、指径、设备戴在哪根手指、Monk 量表 |
| 采样点 | sample_number |
一次抽血一个序号 | 各设备 SpO2、血气全部指标 |
关键在于:encounter 表是唯一一张"看一次 encounter 只需要看一行"的表。其它表都是长表——血氧仪表是一行一个读数,血气表是一行一次血气,分光光度计表是一行一次测量。这是初学者最容易搞错的地方:想统计"有多少次 encounter",直接数行会得到错误答案,因为大部分表里一次 encounter 会出现很多行。
2.2 字段字典:六张表各管什么
官方页面把逐字段的完整定义放在随库发布的数据字典文件(OpenOximetry_Data_dictionary_v1.1.0.csv)里,页面本身只给表级描述。下表把六张表的职责、行粒度与页面明确提到的字段逐项列出。
| 表 | 行粒度 | 页面明确提到的字段或信息 | 说明 |
|---|---|---|---|
patients.csv |
一人一行 | 性别、族裔与种族认同、研究站点 | 只放相对不变量;v1.1.1 把族裔重编码为字符串值 |
encounter.csv |
一次 encounter 一行 | 当时年龄、设备戴在哪根手指或部位、指径、Monk 肤色量表 | 唯一一张一行即一次的表;v1.1.1 增加右耳、左耳与前额设备位 |
pulseoximeter.csv |
一设备一读数一行 | encounter_id、sample_number、SpO2 |
读数的主体表 |
bloodgas.csv |
一次血气一行 | SaO2、pH、PaCO2、血红蛋白、高铁血红蛋白、碳氧血红蛋白、呼吸频率 | 官方使用说明中同一张表被写作 abg.csv |
devices.csv |
一型号一行 | 唯一设备号、品牌、型号、透光模式与探头 | 描述性数据,可得性不作保证 |
spectrophotometer.csv |
一部位一次测量一行 | 定量肤色与反射率、encounter_id、patient_id |
每个解剖部位通常测三次,每次 encounter 重复 |
字段总数 138 个,分布在六张表上。官方在论文里特别解释了为什么不用 OMOP:OMOP 通用数据模型有 37 张表、394 个字段,而肤色度量、手指测量、血氧设备这类内容落在以电子病历为中心的 schema 里很别扭;同时他们优先考虑让非技术背景的贡献者也能参与,所以选了更简单的模型。这个取舍有代价——它不是一个能与电子病历生态直接互通的通用模型,跨库合并要靠手写映射。
2.3 一次 encounter 的完整解剖
一次受控脱饱和 encounter 的流程是固定的。受试者到场后先做基线测量:人口学信息、指径(用游标卡尺量)、定性与定量肤色、性别、身高、体重、血压。随后置入桡动脉导管(临床研究中则利用已有的动脉通路)。被测血氧仪逐一佩戴到位,彼此之间以及与环境光之间做遮光隔离。
接着受试者接入闭路呼吸系统,系统按医用空气、氧气、氮气与二氧化碳的配比把饱和度滴定到目标平台。目标按 ISO 80601 标准与 FDA 指南分布在 SaO2 70%–100% 区间,同时把 PaCO2 控制在 35–45 mmHg。到达平台并且稳定之后,采集一组动脉血,立刻在校准过的共血氧仪上分析;采血那一刻,所有被测设备的读数被同时记录,并顺序编号为这次 encounter 内的 sample_number。官方方法段还写了两个细节:每次脱饱和过程约二十分钟,受试者保持不动;每台设备至少在四个随机的手指位置上测过;研究协调员对动脉血 SaO2 结果设盲。
把这条链翻译成表结构就是这样:encounter 表的一行装下这次访问的全部静态信息(谁、多大、哪个站点、设备戴在哪、指径多粗、Monk 几级);血氧仪表的若干行装下每个采样点上每台设备的 SpO2;血气表的若干行装下每个采样点的全部血气指标。三者靠 encounter_id 与 sample_number 对齐。
分光光度计表则是另一条支线。它按解剖部位记录定量肤色与反射率,同一部位通常测三次以保证一致性,并在每次 encounter 重复。官方说明同一受试者可能使用多台分光光度计,这一点在做纵向比较时要留意——仪器换了,读数基线可能跟着换。
2.4 主键与关联路径
官方使用说明给出的标准连接姿势是这样的:先在设备表上按 device_id 筛出你要的那款设备,再把结果用 encounter_id 与 device_id 连到血氧仪表拿到 SpO2,用 encounter_id 与 sample 连到血气表拿到同一采样点的 SaO2;需要人口学或肤色再往外连 patient 表或 spectrophotometer 表。
| 步骤 | 操作 | 键 | 得到 |
|---|---|---|---|
| 1 | 在 devices.csv 上按 device_id 过滤 |
device_id |
目标型号 |
| 2 | 连 pulseoximeter.csv |
encounter_id + device_id |
该型号在各次 encounter 的 SpO2 |
| 3 | 连 bloodgas.csv |
encounter_id + sample_number |
同一采样点的 SaO2 与全部血气指标 |
| 4 | 连 patients.csv |
patient_id |
性别、族裔、站点 |
| 5 | 连 spectrophotometer.csv |
encounter_id 或 patient_id |
定量肤色与反射率 |
这里有两个必须知道的坑。第一个是 v1.1.1 的变更:血气表里的设备号改成了浮点形式,整数部分仍是此前的设备号,小数部分代表探头号(probe ID),而探头的进一步说明要等后续版本。这意味着直接按整数相等去连设备表,在 v1.1.1 上会连不上。第二个是日期:encounter 表里的日期被按受试者施加了一个随机偏移,整体推向未来,同时尽量保留季节性。因此受试者内部的先后次序是可靠的,受试者之间的先后次序被刻意打乱。想做跨人的时间序列,这条限制会直接挡住你。
2.5 三类波形文件的通道与采样率
波形与表格是分开存放的,文件名对应 encounter。官方页面列出三类,论文里写的是"最多三类",措辞上的差别本身就是个提醒——不是每次 encounter 都齐。
| 类别 | 采样率 | 文件形态 | 内容 | 注意 |
|---|---|---|---|---|
| 主波形 | 150 Hz | WFDB,文件名即 encounter_id |
心电、氧气与二氧化碳(mmHg)、呼吸频率、动脉血压(mmHg) | 记录保留三位小数 |
| 参考血氧 | 2 Hz | CSV,后缀 _2hz |
SpO2、心率、脉搏灌注指数(页面口径) | 含 ScalcO2,即由呼气末氧浓度瞬时估计的 SaO2;采血点带标签,与其它表的 sample 号对应 |
| 原始光电容积波 | 86 Hz | WFDB,后缀 _ppg |
红外与红光双通道,未缩放未滤波 | 仅部分 encounter 有;本版本未与同次其它波形做时间同步 |
波形目录的组织方式是哈希分片:中间层目录 0-9 与 a-f 对应 encounter id 的首字符,比如首字符是 b 的 encounter 的波形都在 b 目录下。这个设计对全量遍历很友好,对"按人取波形"很不友好——你得先从 encounter 表拿到 id,再按首字符拼路径。
2.6 与同类资源的字段差异
| 对比项 | OpenOximetry 库 | 回顾性电子病历配对 | 小型实验室研究报告 |
|---|---|---|---|
| 金标准 | 动脉血气共血氧,即抽即测 | 电子病历里的血气结果 | 动脉血气,通常有 |
| 时间对齐 | 采血时刻被数字化记录,读数同时记录 | 采血与读数时刻可能错位 | 有,但未必记录到数据里 |
| 饱和度覆盖 | 70%–100% 全程平台 | 集中在高值段,低氧段极少 | 通常覆盖,但样本少 |
| 皮肤色调度量 | 定性加定量双轨,多部位多次 | 多为种族或族裔分类变量 | 多为定性量表 |
| 探头位置 | 明确记录哪根手指或部位 | 未知 | 通常记录 |
| 数据是否公开可复核 | 是,有 DOI 与版本 | 否,多为机构内部 | 否,多为论文附表 |
| 是否持续更新 | 是,有版本序列与合并机制 | 不涉及 | 不涉及 |
这张表的最后两行才是真正的分野。前五项是数据质量维度,后两项是基础设施维度:一个能持续更新、有版本、有 DOI、允许外部团队按字典并入的公共库,与一篇论文的附表,即使数字一样,可用性也不在一个量级。
§3 它是谁的数据
3.1 贡献者与机构
页面署名的五位作者是 Nicholas Fong、Michael Lipnick、Philip Bickler、John Feiner 与 Tyler Law,均来自加州大学旧金山分校:麻醉与围术期医学系、UCSF 低氧研究实验室、医学院,以及手术与麻醉健康公平中心(CHESA)。配套论文的作者名单要长得多,涵盖斯坦福、约翰霍普金斯、贝勒、哈佛、华盛顿大学、拉什大学、杜克、普利茅斯大学等机构,另有 ISO 血氧仪联合工作组共同召集人参与——这份名单本身就说明它是一个跨机构协作项目,而不是一个实验室的内部产物。
项目的资助方在官方致谢里列明:戈登与贝蒂·摩尔基金会、帕特里克·J·麦戈文基金会、罗伯特·伍德·约翰逊基金会、UNITAID(经 PATH)、UCSF 与 USAID STAR。论文致谢中额外提到 PATH 与 USAID STAR,以及若干个人的贡献。
利益冲突声明写得相当具体,值得原样转述:UCSF 低氧研究实验室接受血氧仪厂商的资助,为厂商做产品开发与监管性能检测,但本库中的数据不包含厂商赞助研究的设备;所有被测设备由实验室自行采购;没有血氧仪公司直接资助 Open Oximetry 项目,也不参与研究设计、分析或本库的建设;维护本库的研究者均不持有任何血氧仪公司的股份或权益。
3.2 版本时间线
| 版本 | 发布日期 | 变更内容 |
|---|---|---|
| 1.0.0 | 2024-02-27 | 首次发布,含受控脱饱和研究数据 |
| 1.0.1 | 2024-07-30 | 方法学文字更新,澄清当前与计划中的数据过滤步骤;数据本身未变 |
| 1.1.0 | 2025-02-19 | 页面 Release Notes 未逐条列出(本节仅记录日期) |
| 1.1.1 | 2025-02-28 | patient 表族裔重编码为字符串;encounter 表增加右耳、左耳、前额设备位;血气表设备号改浮点(整数为设备号、小数为探头号)并纳入 _2hz 波形中的生命体征;2 Hz 波形纳入参考设备的生命体征 |
1.1.1 的 Release Notes 里有一条官方拼写:新增字段写作 forhead_device(前额设备位)。这是页面原文,不是笔误转写——按字段名做程序化读取时照抄官方拼写。
版本的节奏说明一件事:这是一个仍在演进的库。官方明确表示数据会随受控脱饱和研究与前瞻性真实世界临床研究的推进持续加入,字段与表也可能因为新数据无法映射到既有字段而被修改。对使用者来说,这意味着引用时必须写死版本号,并且复现分析时最好把版本号一起存档。
3.3 采集场景:受控脱饱和实验室
数据产生的地点是 UCSF 低氧实验室——全球少数几家能独立做人体受控低氧研究的实验室之一。方案文档公开在 openoximetry.org 的方案页上,另有单独的皮肤颜色评估方案(UCSF IRB 21-35637)。论文里给出的方案要点包括:闭路系统调节医用空气、氮气与二氧化碳;目标区间 SaO2 70%–100% 且 PaCO2 35–45 mmHg;平台值用计算得到的 SaO2 估计;每次脱饱和约二十分钟;受试者保持不动;研究协调员对动脉血结果设盲;每台设备至少在四个随机手指位置上测。
三条采集参数的设计依据是标准而非习惯:数据集的采集需求最初按 ISO 80601-2-61:2017 与 2013 年 FDA 510(k) 指南(脉搏血氧仪上市前通告)设定,之后又经 OpenOximetry 协作社区与 EquiOx 前瞻性临床试验(ClinicalTrials.gov NCT05554510)的讨论扩充,加入更多已知或假设会影响性能的参数。
3.4 来源层次:自有数据与合并数据
数据进入本库有两条路径,两者的可信度层级不同,官方自己做了区分。
| 来源 | 路径 | 官方对数据质量的态度 |
|---|---|---|
| UCSF 低氧实验室或 UCSF EquiOx 临床试验 | 去标识后由团队直接持续上传 | 由维护团队负责 |
| 其他团队按 OpenOx 采集标准独立上传到 PhysioNet 的数据 | 经提交团队请求,由 OpenOx 团队审核后合并 | 审核只看数据结构与所报采集方案,不对数据准确性或质量作任何声明 |
这个区分很重要。合并进来外部数据时,官方的审查范围是结构与协议,不是数值本身。因此按站点或来源分层分析时,不能默认所有来源的数据质量一致。
§4 它最独特的东西
4.1 SpO2 与 SaO2 的逐次配对
这份数据最不可替代的地方,是把"配对"这件事做到了采样点级别。回顾性研究里的配对是事后凑的:从电子病历里找一条血气记录,再找时间上最近的 SpO2,两者的时间差可能是几分钟,而几分钟足够让患者的氧合状态变化一次。本库的做法反过来——采血那一刻被数字化记录下来,同一刻所有设备的读数被一起记下,并共享一个 sample_number。配对不是推断出来的,是采集时构造出来的。
这个设计解决了一个更隐蔽的问题:设备之间的可比性。同一采样点上,所有被测设备面对的是同一个人的同一份血。如果想比较 A 品牌与 B 品牌在深色皮肤上的差异,用回顾性数据要分别找两组病人,两组人的年龄、疾病、探头型号都不一样;在这里,两组读数来自同一次抽血。
4.2 皮肤色调度量的双轨制
肤色怎么量,是这个领域的方法学争论焦点之一。本库给了两套并行答案:定性用 Monk 肤色量表(Monk Skin Tone Scale),定量用分光光度计测反射率。前者是十级的主观比对量表,后者是仪器读数。
同时持有两套度量的价值在于它们会不一致,而这不一致性本身是研究对象。种族与族裔这类分类变量长期被当作肤色的代理,但代理误差很大;分光光度计给出连续量,却受测量部位、仪器型号、环境光影响。本库的结构支持把三者放在同一次 encounter 上比较:种族认同字段在 patient 表,Monk 量表在 encounter 表,分光光度计读数在独立的表里按部位记录。
官方页面还点出一个尚未被充分使用的方向:既然库里积累了这么多肤色数据,就可以单独研究"定性肤色与定量肤色之间是什么关系"这个问题,而不必把它绑在血氧仪误差上。
4.3 一次读数的完整链条
把一次配对的读数链拆开看(不涉及任何具体数值):
| 环节 | 产生什么 | 落在哪张表 |
|---|---|---|
| 滴定到目标平台并稳定 | 一次 encounter 的平台序列 | 波形文件的 ScalcO2 序列可反推 |
| 从动脉导管抽血 | 一个 sample_number |
bloodgas.csv 的一行 |
| 血样上共血氧仪 | SaO2 与全部血气指标 | bloodgas.csv 同行 |
| 同一刻读设备 | 每台设备一个 SpO2 | pulseoximeter.csv 的若干行 |
| 设备戴在哪 | 手指或部位分配 | encounter.csv 同行 |
| 这人肤色如何 | Monk 级与分光光度计读数 | encounter.csv 与 spectrophotometer.csv |
链条上每一环都对应一个可查验的位置,这是它作为"标准答案"的底气:结果不对的时候,可以顺着链条往回查,而不是面对一个无法拆开的黑箱。
4.4 粒度:从 encounter 到 sample_number
粒度的选择决定了能问什么问题。sample_number 是序列化的:一次 encounter 里第几次抽血。它保留了次序,因此可以做纵向分析——同一个人在从高到低的各个平台上,误差是怎么变化的。这个维度在只有"人-设备-平均误差"三级结构的公开数据里是看不到的。
同时要清楚粒度带来的重复计量问题。一次 encounter 里有多个采样点,一个受试者可能有多次 encounter,最多的一位有 21 次。如果不做分组,样本量看起来很大,实际上独立的人只有 144 名。任何以"样本数"为分母的推断都会严重高估证据强度——这不是数据缺陷,是设计使然,官方把人均 3.2 次、最大 21 次、67 人只有一次、77 人多于一次这些数字明写出来,正是在提醒使用者注意这个结构。
4.5 边界条件:健康年轻志愿者的代价
受试者是健康成年人,通过多种渠道招募:高校与社区组织、公园、健身房与社区中心、专业会议、按邮编定向的社交媒体投放、给 UCSF 潜在符合条件者的邮件与信件,以及一家专业招募机构。论文给出的受试者画像是一组明确到可以引用的数字:144 名受试者,77 名自我认同为女性,466 次 encounter,人均 3.2 次(标准差 3.65),最多 21 次;67 人只有一次 encounter,77 人回访多次;encounter 时的平均年龄 27 岁,范围 17–47 岁。
这组数字同时定义了它的能力边界。年龄 17–47 岁的健康志愿者意味着:没有老年人的末梢循环改变,没有婴幼儿的探头适配问题,没有贫血、低灌注、血管活性药物、指甲油、水肿这些在病房里天天遇到的干扰因素。论文列出的那些"该研究但还没研究"的变量——贫血、指径、探头位置、脉搏灌注幅度、温度、设备特性——恰恰说明本库提供的是基线,而不是真实世界的全貌。
§5 怎么拿到
5.1 访问门槛与许可
本库是受限访问资源。页面的访问政策原文是:只有签署了指定数据使用协议的注册用户才能访问文件。许可为 PhysioNet 受限健康数据许可 1.5.0,协议为 PhysioNet 受限健康数据使用协议 1.5.0。它不属于需要伦理培训与机构认证的凭证制资源,门槛是注册加签协议。
协议条款(论文使用说明中列举的部分)包括:不得尝试识别数据集中的任何个人、需保障数据安全、不得出售或分发数据、仅用于科学研究且不得转售。数据使用协议在法律上是前置条件,不是形式——跨机构共享分析代码时也要注意,代码本身可以共享,数据不能。
5.2 目录结构
页面上公开可见的文件名包括六张 CSV 表与随库发布的数据字典(OpenOximetry_Data_dictionary_v1.1.0.csv),波形部分按 encounter id 首字符哈希分片到 0-9 与 a-f 的中间层目录。完整的目录清单需要登录后才能看到——本次核验时 files 目录返回 403(所在区域受限),因此未做逐文件核对,这一点已在 §10 声明。
逻辑上的目录形态:
| 路径层 | 内容 |
|---|---|
| 根 | 六张 CSV 表、数据字典 CSV |
| 波形根 | 0–9、a–f 共十六个中间层目录 |
| 中间层 | 该首字符下的全部 waveform 记录 |
| encounter 级 | 主波形 .dat+.hea、_2hz.csv、_ppg.dat |
5.3 批量下载
受限资源不能匿名 curl,要走 PhysioNet 的认证下载。官方推荐的做法是用 PhysioNet 提供的命令行工具在登录后整库同步,缺点是会把波形全部拉下来,体积不小:
#-- 登录一次,凭据保存在本地
physionet-client login
#-- 整库同步到当前目录下的 openox-repo/
physionet-client download openox-repo ./openox-repo
#-- 只看目录不下载(确认版本与文件清单)
physionet-client ls openox-repo/1.1.1/
只想拿表格不要波形的话,登录后单独取六个 CSV 更快。注意波形目录被拆成十六个中间层,逐目录递归取比整库同步可控:
#-- 只取 encounter id 首字符为 b 的波形子集
for c in b; do
physionet-client download "openox-repo/1.1.1/waveforms/$c" "./wf/$c"
done
上面的路径写法是示意,实际目录名以登录后看到的清单为准;页面只保证了"中间层目录按首字符分片"这条规则。
5.4 读表与连接
import pandas as pd
base = "./openox-repo/1.1.1"
patients = pd.read_csv(f"{base}/patients.csv")
encounter = pd.read_csv(f"{base}/encounter.csv")
pulseox = pd.read_csv(f"{base}/pulseoximeter.csv")
bloodgas = pd.read_csv(f"{base}/bloodgas.csv")
devices = pd.read_csv(f"{base}/devices.csv")
spectro = pd.read_csv(f"{base}/spectrophotometer.csv")
#-- 1. 先筛设备:v1.1.1 起血气表里的设备号是浮点,整数部分才是 device_id
target = devices[devices.device_id == 7][["device_id"]]
#-- 2. 连血氧读数
spo2 = pulseox.merge(target, on="device_id")
#-- 3. 连同一采样点的血气 SaO2
paired = spo2.merge(
bloodgas[["encounter_id", "sample_number", "SaO2"]],
on=["encounter_id", "sample_number"],
how="inner",
)
#-- 4. 补肤色:Monk 在 encounter 表,定量反射率在 spectrophotometer 表
paired = paired.merge(
encounter[["encounter_id", "patient_id", "monk"]],
on="encounter_id", how="left",
)
print(paired.shape, paired.columns.tolist())
这段的第三行是整份数据的核心动作:encounter_id 加 sample_number 的双键内连接,就是"把设备读数钉到动脉血上"的全部实现。列名以数据字典为准,页面与论文对同一张表有过 bloodgas.csv 与 abg.csv 两种叫法(§10)。
5.5 波形读取
import wfdb
eid = "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9"
root = "./wf/" + eid[0] #-- 按 encounter id 首字符找中间层目录
rec = wfdb.rdrecord(f"{root}/{eid}")
print(rec.fs, rec.sig_name) #-- 150 Hz;心电、氧气、二氧化碳、呼吸率、动脉压
ppg = wfdb.rdrecord(f"{root}/{eid}_ppg")
print(ppg.fs, ppg.sig_name) #-- 86 Hz;红外与红光双通道
_2hz.csv 是普通 CSV,直接用 pandas 读即可,它带采血点标签,可以反查 sample 号。三个文件的采样率不同(150 / 2 / 86),做联合分析前必须各自重采样或按时间索引对齐——而原始 PPG 本版本没有时间同步信息,强对齐是不成立的。
5.6 五个坑
| 坑 | 现象 | 怎么办 |
|---|---|---|
| encounter 表行数 ≠ encounter 数 | 血氧仪表、血气表、分光光度计表都是长表 | 数 encounter 只在 encounter 表上数 |
| v1.1.1 设备号变浮点 | 按整数相等连设备表连不上 | 取整数部分做 device_id,小数部分留作探头号 |
| 日期被偏移到未来 | 受试者之间的时间次序不可靠 | 只做受试者内部的先后分析 |
| PPG 与其余波形不同步 | 联合时序分析的时间轴对不上 | 当前版本只用主波形,或单独分析 PPG |
| 数据是原样未清洗 | 采集阶段伪迹可能留在里面 | 自己做伪迹剔除并在论文里写明规则 |
§6 与库内条目的关系
6.1 关系图谱
| 站内数据集 | 与本库的关系 | 差异点 |
|---|---|---|
| BOLD 血气与血氧关联库 | 同为 SpO2 与 SaO2 配对的公开资源 | 来源与设计不同,BOLD 是另一团队发布的独立资源 |
| ENCoDE 皮肤色调度量库 | 都把肤色当作可度量的连续变量 | 本库把肤色与动脉血金标准绑在一起;ENCoDE 聚焦色调度量本身 |
| OSV 氧饱和度变异性库 | 都关注血氧读数的稳定性 | 本库读数是与金标准配对的离散采样点;OSV 关注变异性 |
| MIMIC-III-Ext-PPG | 都有光电容积脉搏波 | 本库的 PPG 是 86 Hz 未滤波原始双通道,且未经时间同步 |
| PulseDB | 都提供可用于算法评测的波形 | PulseDB 面向无袖带血压估计,无动脉血金标准 |
| BIDMC PPG | 都用 PPG 做生理量估计 | BIDMC 面向呼吸率估计,无配对血气 |
| PPG-DaLiA | 都有 PPG 波形 | PPG-DaLiA 是日常活动场景的可穿戴数据,参考值是心电图导出的心率 |
| BUT PPG | 都有智能手机或消费级 PPG | 无动脉血金标准,场景为日常使用 |
| VideoPulse | 都是非接触或间接的血氧相关信号 | 面向人脸视频脉搏,无金标准配对 |
| VitalDB | 都有术中连续生理波形 | VitalDB 来自真实手术,无受控脱饱和设计 |
| MIMIC-IV-Waveform | 都有多通道高频波形 | 重症监护真实场景,无配对动脉血金标准 |
| 巴塞罗那 SICU 波形库 | 都有床旁监护波形 | 真实 ICU 场景,信号质量与噪声谱不同 |
6.2 检索路径
在库内找血氧相关数据时,按"有没有动脉血金标准"这一条先切一刀,效率最高。有金标准的只有本库与 BOLD,其余的参考值要么是心电导出的心率,要么是呼吸率,要么根本没有同步的参考测量。第二刀按"是不是受控条件"切:本库是实验室受控脱饱和,VitalDB、MIMIC 系列波形是真实临床,PPG-DaLiA 与 BUT PPG 是日常活动。这两刀切下来,每个库的位置就清楚了。
6.3 分工判据
| 你要回答的问题 | 该用谁 |
|---|---|
| 这台血氧仪相对动脉血到底差多少 | 本库 |
| 深色皮肤上的偏倚有多大 | 本库(配 ENCoDE 看色调度量方法) |
| 病房里真实使用时的误差 | 本库不够,需真实临床资源 |
| PPG 波形上能算出心率吗 | PulseDB、PPG-DaLiA、BIDMC PPG |
| PPG 能估呼吸率吗 | BIDMC PPG |
| 无袖带血压估计 | PulseDB |
| 消费级设备的日常表现 | BUT PPG、PPG-DaLiA |
| 术中或 ICU 的连续波形建模 | VitalDB、MIMIC-IV-Waveform、巴塞罗那 SICU 波形库 |
§7 质量评估与局限性
7.0 前置校正:官方自己声明的三件事
在使用任何推断之前,先把官方自己写在页面上的三条声明摆出来,它们不是缺陷清单,是使用前提。
第一,当前版本未清洗。实验室脱饱和数据按采集原样提供;标准化清洗流程在后续版本实施,过滤标准会在数据更新时公布。这意味着 v1.1.1 里可能保留采集阶段引入的潜在伪迹或不准确值。
第二,外部合并数据只审结构。对外部团队提交的数据,审核范围只有数据结构与所报采集方案,官方明确不对这些数据的准确性或质量作任何声明。
第三,波形文件的可得性不齐。原始 PPG 仅部分 encounter 有;论文写"最多三类波形文件"而页面写"三类",措辞差异提示并非每次 encounter 都齐全。
7.1 五维评分
| 维度 | 评价 | 理由 |
|---|---|---|
| 金标准强度 | 高 | 动脉血气共血氧,采血时刻数字化记录,读数同时记录 |
| 时间对齐 | 高 | 配对在采集时构造,不靠事后匹配 |
| 人群代表性 | 低 | 健康志愿者,17–47 岁,受试者不动、设备遮光 |
| 清洗程度 | 低 | 官方声明 v1.1.1 为原样数据,清洗留待后续版本 |
| 基础设施完备度 | 高 | 有数据字典、版本号、DOI、合并机制与持续更新计划 |
这个评分形态很典型:它在一个维度上做到极致(金标准与时间对齐),在另一个维度上明确不足(人群代表性与清洗程度)。把它当"全面优质的数据"用会踩坑,把它当"金标准对照"用则非常扎实。
7.2 数据的两层:原始层与发布层
论文的技术验证部分说明了数据从采集到发布经历了什么:绝大多数处理都用于去标识、把波形转成 WFDB 格式、以及验证去标识与格式转换本身。波形在研究期间以纯文本形式存储,转成 WFDB 时未做进一步处理。
原始层是 REDCap(范德堡大学的临床研究数据捕获工具),选择理由包括允许图形界面人工录入、可通过 API 程序化访问、符合 FDA 21 CFR Part 11。血气分析仪、实验室设备与研究人员的原始数据由一系列 Python 脚本摄入,生成对外发布版本。构建代码纳入版本控制并由实验室成员定期审阅;代码内嵌断言,会在保存前重新读盘比对,不一致就抛异常;构建过程会生成关键测量参数的图表,用于人工确认数值合理。
这套流程保证了"发布的数据等于采集的数据",也正因如此,它不保证"采集的数据没有伪迹"。两层要分开看。
7.3 可枚举的偏差来源
| 偏差来源 | 方向 | 影响 |
|---|---|---|
| 人群为健康年轻志愿者 | 未知 | 结论外推到老年、婴幼儿、重症患者需另行验证 |
| 受试者保持不动 | 偏乐观 | 真实场景的运动伪影未被计入 |
| 设备互相遮光与环境遮光 | 偏乐观 | 真实场景的光干扰未被计入 |
| 设备由实验室自行采购 | 选择偏差 | 不代表市场全貌;论文提到另有一项针对未过 FDA 审批的廉价设备的研究 |
| 分光光度计可能多台 | 仪器间差异 | 纵向比较时要注意仪器是否更换 |
| 数据未经清洗 | 未知 | 伪迹可能抬高误差估计 |
| 日期被随机偏移到未来 | 无方向 | 跨受试者的时间分析不可行 |
这张表的价值在于它把"这份数据有什么问题"从印象变成清单。十一条里没有一条是隐藏的——全部能在官方页面或论文里找到原文,这正是它可信的地方。
7.4 外部验证与一致性
官方列出的参考文献构成了一条完整的证据链:从 1987 年关于皮肤色素影响血氧精度的早期观察,到 2005 与 2007 年 UCSF 团队自己的实验室研究,到 2020 年《新英格兰医学杂志》关于血氧测量种族偏倚的通信,再到 2022 年的系统综述与荟萃分析,以及关于 COVID-19 治疗资格判定延迟的研究。这条链说明本库不是凭空建起来的,它回应的是一个已经积累二十余年的公开问题。
一致性方面需要提醒的是数字口径:论文里的 144 名受试者、466 次 encounter、53 款设备是 v1.0 发布的数字,本条描述的是 1.1.1。Release Notes 里 v1.1.1 的变更都是字段层面的,没有声明新增数据源,但官方也没有明确说 1.1.1 与 1.0 的规模完全相同。引用规模数字时写清口径是必要的。
7.5 为何仍在持续
它持续的理由与大多数公开数据集不同。多数数据集的价值来自规模,更新意味着更多数据;本库的价值来自结构与协议,更新意味着更多来源按同一结构并入。只要"能做受控脱饱和的实验室很少、愿意按统一结构公开的更少"这个事实不变,它作为汇聚点的位置就不会被替代。资助方多元(三家基金会加两个国际机构)、协作社区跨机构、配套方案文档公开,这三点共同降低了它对单一团队的依赖。
§8 生态位与历史
8.1 沿革
时间线很短但节奏清楚:2024 年 2 月首版,同年 7 月方法学澄清,2025 年 2 月连续两个版本,同月配套论文在 Scientific Data 发表(2025 年 4 月 3 日在线,卷 12 第 570 号)。首版到论文发表只有一年,说明它是"先发布数据、再发数据描述符"的模式,而不是"先发论文、再补数据"。
论文的标题信息量很大——“Open Access Dataset and Common Data Model for Pulse Oximeter Performance Data”,两个关键词并列:开放数据集,与通用数据模型。它要做的不只是给一批数据,而是给一套别人也能照着填的结构。
8.2 与监管标准的关系
采集参数以 ISO 80601-2-61:2017 与 2013 年 FDA 510(k) 指南为起点,这一点决定了它的用途不止于学术研究。论文背景段提到,关于血氧仪健康不平等的文献增长已经触发监管机构修订血氧仪检测与性能指南的行动,而阻碍这些行动的主要障碍之一是公共领域缺乏足够的高质量数据。
ISO 血氧仪联合工作组共同召集人出现在论文作者名单里,是这条关系的直接证据。换句话说,本库在设计上就是奔着"能被监管引用"去的:平台序列、PaCO2 控制范围、每设备至少四个手指位置、协调员设盲,这些都不是学术论文需要的细节,而是标准符合性需要的细节。
8.3 生态位
| 角色 | 大规模训练集 | 金标准对照集 |
|---|---|---|
| 典型用法 | 预训练、大规模评测 | 误差标定、设备对比、方法学验证 |
| 关键属性 | 数据量大、人群广 | 参考值硬、时间对齐、协议明确 |
| 代表资源 | 电子病历派生的血氧数据、可穿戴波形库 | 本库、BOLD |
| 失败模式 | 参考值软、标签噪声累积 | 规模小、人群窄、外推受限 |
本库坐在右边一列,且比同类坐得更靠边——它连波形都给了未滤波的原始版本,就是为了不替使用者做任何预处理决定。
8.4 谁在用
从官方列出的潜在用途看,目标使用者有四类:研究血氧仪性能与患者变量关系的研究者、设备开发者、监管机构与标准制定者、以及希望并入自己数据的外部团队。官方还额外点出三个尚未被充分探索的方向:众多尚未被研究的生理变量对性能的影响;定量与定性肤色的交互;以及高频 PPG、呼吸与血压波形对性能或低氧生理效应的分析。
第三类使用者的存在被官方单独写了一句话:拥有血氧性能测试数据并希望纳入本数据库的贡献者可以联系通讯作者,字段无法映射到既有字典的也可以联系团队扩展字典。这种"鼓励扩展"的姿态在数据描述符里并不常见。
§9 使用指引
9.1 三种角色的路径
| 角色 | 第一天 | 第一周 | 注意事项 |
|---|---|---|---|
| 算法研究者 | 通读数据字典,跑通 §5.4 的双键连接 | 建立按受试者分组的误差基线 | 样本点不等于独立样本,分母要按人算 |
| 设备工程师 | 在设备表上定位自家型号,取配对读数 | 按平台分层算偏差与精密度 | 小数点后的探头号别丢,v1.1.1 起有意义 |
| 监管与标准人员 | 对照方案文档核对平台序列与控制范围 | 复算标准符合性指标 | 引用时写死版本号与 DOI |
9.2 一条最短的可用流程
#-- 1. 注册、签 DUA、登录
physionet-client login
#-- 2. 只取表格,不取波形(波形体积大且按首字符分片)
physionet-client download openox-repo/1.1.1 ./openox
#-- 3. 先读数据字典,确认列名与 v1.1.1 的浮点设备号约定
head -1 ./openox/bloodgas.csv
import pandas as pd
#-- 4. 配对:一个采样点一行,带设备 SpO2 与血气 SaO2
enc = pd.read_csv("./openox/encounter.csv")
pox = pd.read_csv("./openox/pulseoximeter.csv")
abg = pd.read_csv("./openox/bloodgas.csv")
df = pox.merge(abg, on=["encounter_id", "sample_number"], how="inner")
df = df.merge(enc[["encounter_id", "patient_id"]], on="encounter_id", how="left")
#-- 5. 按受试者分组报告,不按采样点
print(df.groupby("patient_id").size().describe())
最后一步的 groupby("patient_id") 是刻意的。把 466 次 encounter 或更多的采样点当成独立样本去做统计推断,会得到过窄的置信区间——同一个人、同一批设备、同一次访问内的多个采样点高度相关。分组报告至少能让读者看到这个结构。
9.3 引用方式
| 引用对象 | 内容 |
|---|---|
| 数据集(版本) | Fong, N., Lipnick, M., Bickler, P., Feiner, J., & Law, T. (2025). OpenOximetry Repository (version 1.1.1). PhysioNet. RRID:SCR_007345. https://doi.org/10.13026/be2e-cn29 |
| 原始论文 | Fong, N., Lipnick, M.S., Behnke, E. et al. Open Access Dataset and Common Data Model for Pulse Oximeter Performance Data. Sci Data 12, 570 (2025). https://doi.org/10.1038/s41597-025-04870-8 |
| 平台 | PhysioNet 平台综述论文,按官方页面 Cite 按钮生成 |
| 最新版本 DOI | 10.13026/e821-1858(页面标注为 latest,与版本 DOI 不同) |
引用时建议同时写明三件事:使用的版本号、是否使用了未清洗的原样数据、以及分组方式是按受试者还是按采样点。这三件事在方法学章节里缺一件,结果就难以复现。
§10 AI 使用声明
| 项目 | 声明 |
|---|---|
| 文本生成 | 本文由 AI 辅助撰写,编辑把关结构与事实 |
| 数字来源 | 规模、结构、边界三类数字来自 PhysioNet 官方项目页(1.1.1)与 Scientific Data 数据描述符论文 |
| 文件核验 | 本次核验仅到项目页;files 目录返回 403(所在区域受限),未直读任何 CSV 或波形文件 |
| 不一致说明 | 四处官方内部不一致:IRB 编号(页面 #23-40212 / 论文 #21-35637);2 Hz 文件第三列(页面写脉搏灌注指数 PI / 论文写信号质量指示);原始 PPG 是否同步(页面写未同步 / 论文使用说明写已同步);表名(页面 Data Description 用 bloodgas.csv / Usage Notes 用 abg.csv,patients.csv / patient.csv,devices.csv / device) |
| 论文信息 | 配套论文为 Scientific Data 12, 570 (2025),2025 年 4 月 3 日发表,doi 10.1038/s41597-025-04870-8;已通读全文正文 |
| 未核验内容 | 六张表的行数与文件体积;波形文件总数与可用比例;53 款设备的具体品牌型号清单;分光光度计测量部位清单;v1.1.1 相对 v1.0 的受试者与 encounter 增量;EquiOx 前瞻性临床数据是否已纳入;单次 encounter 的典型采样点数 |
| 图像 | 无配图;封面为生成式提示词,不含任何真实波形或受试者影像 |
| 免责 | 本文不构成临床建议;数据使用须遵守 PhysioNet 受限健康数据许可 1.5.0 与数据使用协议;任何对具体设备的提及不代表对其性能的背书 |
常见误读(避坑清单)
| 说法 | 实际 | 证据 |
|---|---|---|
| 「它的数据已经清洗过了」 | v1.1.1 是按采集原样提供,清洗流程留待后续版本 | 官方"数据更新"一节 |
| 「466 次 encounter 就是 466 个独立样本」 | 来自 144 名受试者,人均 3.2 次,单人最多 21 次 | 论文 Data Records 段 |
| 「它是真实病房里的数据」 | 健康志愿者在实验室受控脱饱和,保持不动、设备遮光 | 官方 Methods 与论文局限说明 |
| 「PPG 可以和其它波形对齐分析」 | 本版本的原始 PPG 未与同次其它波形做时间同步 | 官方 Waveform Files 段 |
| 「设备型号一定有」 | 设备表是描述性数据,可得性不作保证 | 官方 Device 段 |
| 「血氧仪表的行数就是 encounter 数」 | 血氧仪表是一行一个读数,长表 | 官方 Pulse oximeter 段 |
| 「设备上按整数设备号连就行」 | v1.1.1 起血气表设备号为浮点,整数部分是设备号、小数部分是探头号 | 官方 Release Notes |
| 「可以按日期做跨受试者的时间序列」 | 日期按受试者施加随机偏移并推向未来,仅保留个体内次序与季节性 | 官方 Encounter 段与论文去标识段 |
| 「深色皮肤的偏倚在这里一定能量出来」 | 数据支持这类分析,但人群为健康年轻志愿者,外推需谨慎 | 官方 Background 与 §7.3 |
| 「它是电子病历数据,能对接 OMOP」 | 官方明确弃用 OMOP,自研 6 表 138 字段模型 | 论文 Data tables 段 |
FAQ
Q1:它和 BOLD 血气血氧关联库是同一份数据吗?
不是。两者都提供 SpO2 与 SaO2 的配对,但由不同团队发布、设计与来源不同,是彼此独立的资源。站内把两条都收进来,正是为了让使用者按自己的问题选择:需要受控实验室条件下的逐次配对,本库的平台设计与双轨色调度量更完整;需要另一套来源做交叉验证,两条可以互为外部对照。引用时务必分别写清各自的版本与 DOI。
Q2:为什么规模数字要标成"v1.0 口径"?
论文给出的 144 名受试者、466 次 encounter、53 款设备是 v1.0 发布时的统计,而当前版本是 1.1.1。1.1.1 的 Release Notes 列出的变更全部是字段层面的(族裔重编码、增加耳部与前额设备位、设备号改浮点、纳入 2 Hz 生命体征),没有声明新增数据源;但官方也没有明确说两个版本的规模完全一致。因此写死口径是最稳妥的做法。
Q3:能不能直接拿它训练一个"从 PPG 估 SaO2"的模型?
可以做,但要清楚两件事。第一,原始 PPG 只有部分 encounter 有,且未与同次其它波形时间同步,做多模态联合建模的时间轴不成立;第二,有效独立样本是 144 名受试者而不是采样点数,模型很容易记住人而不是学会映射。更现实的用法是把它当评测集:在别处训练,在这里用动脉血金标准做误差标定。
Q4:数据里的日期为什么都在未来?
这是去标识手段,不是数据错误。对每个受试者,日期被统一推移一个随机的年数到未来,再加减一个随机天数以保留季节性(例如日照对肤色的影响)。这保证了同一个人的先后次序可靠、跨人的次序不可推断,同时年龄都小于 89 岁。标识符本身也是哈希的:内部编号拼接一个每人随机的盐再做哈希,防止彩虹表反查。
Q5:我有自己的血氧测试数据,能并进去吗?
官方明确欢迎。路径是按现有数据字典整理后联系通讯作者,字段无法映射的也可以联系团队扩展字典。需要注意两点:合并进来的外部数据,官方审核范围只有数据结构与所报采集方案,不对数值准确性作声明;此外所有研究都需符合各自的机构审查委员会批准,且遵循《赫尔辛基宣言》的伦理原则。
术语表
| 术语 | 解释 |
|---|---|
| SpO2 | 脉搏血氧仪测得的血红蛋白氧饱和度,无创、连续、即时 |
| SaO2 | 动脉血气共血氧测得的动脉功能饱和度,本库的金标准 |
| 共血氧测定 | Co-oximetry;用多波长分光法分别测氧合血红蛋白、脱氧血红蛋白、碳氧血红蛋白与高铁血红蛋白 |
| 受控脱饱和 | Controlled desaturation;在实验室用闭路呼吸系统把健康人血氧滴定到目标平台 |
| 平台 | Plateau;血氧稳定维持在某一目标值的一段时期,稳定后才采血 |
| encounter | 一次脱饱和访问或一次临床采样事件;本库的核心组织单位 |
| sample_number | 一次 encounter 内的采血序号,把设备读数与血气结果对齐的键 |
| Monk 肤色量表 | Monk Skin Tone Scale;十级定性的肤色比对量表 |
| 分光光度计 | Spectrophotometer;定量测皮肤反射率的仪器,本库用于定量肤色 |
| 光电容积脉搏波 | Photoplethysmography, PPG;用光测组织血容积变化的波形,本库存 86 Hz 原始红外与红光通道 |
| 脉搏灌注指数 | Pulsatility Index, PI;脉搏波中脉动成分与非脉动成分之比 |
| ScalcO2 | 由呼气末氧浓度瞬时估计的 SaO2,用于在滴定中预估平台 |
| ETO2 / ETCO2 | 呼气末氧浓度与呼气末二氧化碳浓度,单位 mmHg |
| ARMS | 均方根误差,血氧仪精度评价的常用指标 |
| REDCap | 范德堡大学的临床研究数据捕获平台,本库的原始数据层 |
| WFDB | PhysioNet 的波形存储格式,头文件加信号文件 |
| HIPAA 安全港 | 美国健康保险可携性与责任法案的去标识标准,本库按此移除标识符 |
| DUA | Data Use Agreement,数据使用协议;受限数据的法律前置条件 |
| ISO 80601-2-61 | 医用电气设备中脉搏血氧设备基本安全与基本性能的专用标准 |
| FDA 510(k) | 美国医疗器械上市前通告程序;2013 版指南给出了血氧仪的性能测试要求 |
| EquiOx | UCSF 的前瞻性临床试验(NCT05554510),研究住院患者血氧误差与皮肤色素的关系 |
| RRID | Research Resource Identifier,研究资源标识符;本库为 SCR_007345 |
附录 A:核心数字核对表
| 数字 | 出处 |
|---|---|
| 144(受试者数) | 论文 Data Records 段,v1.0 发布口径 |
| 77(自我认同为女性的受试者数) | 论文 Data Records 段 |
| 466(encounter 数) | 论文 Data Records 段 |
| 3.2(人均 encounter 数,标准差 3.65) | 论文 Data Records 段 |
| 21(单人最多 encounter 数) | 论文 Data Records 段 |
| 67 / 77(只有一次 encounter 的人数 / 多于一次的人数) | 论文 Data Records 段 |
| 27(encounter 时平均年龄),17–47(年龄范围) | 论文 Data Records 段 |
| 53(v1.0 初始发布中的设备数) | 论文 Data Records 段 |
| 6(表数量)与 138(字段数) | 论文 Data tables 段 |
| 37 / 394(OMOP 的表数与字段数,作为对照) | 论文 Data tables 段 |
| 70%–100%(SaO2 目标平台区间) | 官方 Methods 段;论文 Methods 段 |
| 35–45 mmHg(PaCO2 控制范围) | 论文 Methods 段 |
| 约 20 分钟(单次脱饱和时长) | 论文 Methods 段 |
| 至少 4(每台设备的随机手指位置数) | 论文 Methods 段 |
| 3(每个解剖部位的分光光度计重复次数) | 官方 Spectrophotometer 段;论文同段 |
| 150 Hz / 2 Hz / 86 Hz(主波形 / 参考血氧 / 原始 PPG 采样率) | 官方 Waveform Files 段 |
| 3(波形记录保留的小数位数) | 官方 Waveform Files 段 |
| 0-9 与 a-f(波形目录中间层数,共 16 个) | 官方 Usage Notes 段 |
| 4(版本数:1.0.0 / 1.0.1 / 1.1.0 / 1.1.1) | 官方 Versions 区块 |
| 2024-02-27(首版日期)与 2025-02-28(v1.1.1 日期) | 官方 Versions 区块 |
| 10.13026/be2e-cn29(v1.1.1 DOI)与 10.13026/e821-1858(最新版本 DOI) | 官方 Discovery 区块 |
| 1.5.0(受限健康数据许可与使用协议版本) | 官方 License 与 Data Use Agreement 区 |
| 734 / 1262(当前版本与全部版本的项目浏览量) | 官方 Project Views 区块 |
| Sci Data 12, 570 (2025),2025-04-03(配套论文) | 官方 Additional citation 区;论文页 |
| UCSF IRB #23-40212(页面)与 #21-35637(论文) | 官方 Ethics 段;论文 Participants 段 |
| NCT05554510(EquiOx 临床试验注册号) | 论文 Methods 段 |
编辑说明
本文的核验时间为 2026 年 10 月 29 日。核对方式为直接访问 PhysioNet 项目页(含带版本号的 1.1.1 页面)并逐段通读 Abstract、Background、Methods、Data Description、Usage Notes、Release Notes、Ethics、Acknowledgements、Conflicts of Interest、References 与 Discovery 区块,另通读配套数据描述符论文全文。由于所在区域受限,files 目录返回 403,未能直读六张 CSV、数据字典或任何波形文件,因此不给出任何表行数、文件体积或设备型号清单。文中保留的五处官方内部不一致已在 §7.0、§7.4、§10 与常见误读里分别说明一次。代码示例为用法示意,未在本地运行。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的数据集,按相关度降序排列:
- bold-blood-gas-oximetry(共享标签:生理信号 / 脉搏血氧;同为 SpO2 与 SaO2 配对的公开资源,来源与设计相互独立)
- encode-skin-color(共享标签:皮肤色调度量;Monk 量表与分光光度计双轨方法的对照参考)
- osv(共享标签:生理信号 / 脉搏血氧;关注血氧读数自身的变异性)
- mimic-iii-ext-ppg(共享标签:光电容积脉搏波;重症监护场景的 PPG 基准)
- pulsedb(共享标签:生理波形;无袖带血压估计基准波形库)
- bidmc-ppg(共享标签:光电容积脉搏波;PPG 呼吸率估算基准)
- ppg-dalia(共享标签:生理波形 / 可穿戴;日常活动场景的 PPG 心率估计)
- butppg(共享标签:光电容积脉搏波;智能手机 PPG 数据集)
- videopulse(共享标签:生理信号;人脸视频脉搏的非接触测量)
- vitaldb(共享标签:生理波形;术中连续生命体征,真实临床场景对照)
- mimic-iv-waveform-legacy(共享标签:生理波形;重症监护高频多通道波形)
- barcelona-sicu-signals(共享标签:生理波形;床旁监护原样样本)
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

