信息速览
CPAP 是一台放在床头的小机器,作用只有一个:把一股稳定的正压吹进面罩,用气压把睡着时塌陷的上呼吸道撑住。要维持这个压力,机器必须一刻不停地量两件事——管路里的压力够不够、流过的气体有多少。于是每台家用 CPAP 在出厂时都自带一个流量传感器和一个压力传感器,每秒采样几十次,一直候在那里。
这些读数原本只用于控制风机,没有人打算拿它做医学测量。但它恰恰是唯一一项不需要接触病人、不需要贴电极、不需要额外戴任何传感器的呼吸记录:面罩里的每一次吸气、每一次漏气、每一次停顿,都被同一股气流如实带过。卡在中间的是三件事——压力补偿让真实呼吸成分与机器调节成分混在一起,漏气是最主要的伪差且随翻身变化,而这些数据在法规上属于设备运行日志,不属于诊断数据。
本文讲的就是这套逻辑落在哪个具体的数据集上。坎特伯雷大学的这份记录不是一台整夜运行的呼吸机,而是三十名健康志愿者在大学实验室里、用一台串接了自建传感器的 CPAP 机器、按节拍呼吸的短时试验。它足够让你把「从流量里还原一次呼吸」的整条链路走通,也确实不够让你训练一个睡眠呼吸暂停检测器。这个落差,正是本篇要讲清楚的地方。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 中文名 | 坎特伯雷大学 CPAP 压力与流量数据 |
| 英文名 | CPAP Pressure and Flow Data from a Local Trial of 30 Adults |
| 制作机构 | 坎特伯雷大学机械工程系 |
| 作者 | Ella Guy、Jennifer Knopp、Geoff Chase |
| 托管平台 | PhysioNet |
| 发布版本 | 1.0.1,2022 年 3 月 24 日 |
| 首版日期 | 1.0.0,2021 年 7 月 19 日 |
| 受试者 | 30 名健康成人,男女各半 |
| 年龄跨度 | 19 至 58 岁 |
| 压力档位 | 4 cmH2O 与 7 cmH2O 两档 |
| 呼吸频率 | 静息、6、9、30、60 次每分钟共五档 |
| 采样率 | 原始 83.33 Hz,发布 100 Hz |
| 每条时长 | 50 秒至 180 秒 |
| 信号通道 | 压力两路、流量两路(原始版另含吸呼分流四路) |
| 文件格式 | CSV,按压力档与频率分十个目录 |
| 未压缩体量 | 233.6 MB |
| 标注 | 无事件标注、无专家判读 |
| 配套信息 | 一页人口学表、一份 README,三张采集示意图 |
| 数据许可 | CC BY-SA 4.0 |
| 论文 | BMC Research Notes,2022 |
| 核心用途 | 呼吸力学辨识、流量信号处理、做功估计 |
§1 它要解决的具体麻烦
1.1 一份给建模用的「真实现场」数据
2010 年代后期,机械通气领域已经有一套成熟的做法:用一室或二室模型,从气道压力和流量反推病人的肺弹性与气道阻力。这套方法在深度镇静的病人身上很好用,因为那时病人的呼吸完全由机器带动,压力与流量之间是一一对应的因果关系,模型可以把参数解出来。
问题出在自主呼吸。只要病人自己还在吸气,胸腔产生的负压就会与机器送出的正压叠加在一起,测到的流量是两者之和。研究者把这种现象叫做自主呼吸掩盖参数辨识——它不是噪声,而是一个结构性的混淆。而现实当中,非侵入通气几乎全部是自主呼吸模式,也就是说,方法最成熟的场景恰恰是最少见的场景。
坎特伯雷团队的做法是反过来:既然临床上拿不到干净数据,那就先在实验台上把变量控制住,造一批已知的、可复现的自主呼吸数据出来,用它检验模型能不能恢复出参数。这份数据集就是这个思路的产物——三十个人,两档压力,五档呼吸频率,每一次呼吸都由节拍器引导。
1.2 三条常见的错误期待
第一条是把「CPAP」等同于「睡眠呼吸暂停数据集」。名字里出现 CPAP 的资源,多数与 OSA 有关,直觉上会认为这里也一样。事实是受试者全部健康,没有一个病人,也没有一次睡眠。CPAP 在这里是手段,不是研究对象。
第二条是把「流量加压力」理解为「多导睡眠图」。多导睡眠图有脑电、眼电、肌电、胸腹带、血氧、体位,十几个通道,整夜记录;这份数据只有两根管子、两路压力、两路流量,最多三分钟。想从它推断睡眠分期,等于用一扇窗户代替整栋房子。
第三条是把「有处理版」理解为「已经清洗干净」。处理版只是把 ADC 计数换成了物理单位并合并了吸呼气支,传感器误差、漏气、受试者配合不良这些真实问题都还在其中,只是不再以原始码值的形式出现。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 一段干净的、有真实呼吸形态的气道流量波形 | 三十人乘五个频率乘两个压力档,每段十数个呼吸周期 | 够,是它最扎实的部分 |
| 机器送出流量与到达面罩流量之间的差异 | 呼气孔两侧各一只文丘里,两路同时记录 | 够,这是设计上的核心 |
| 已知真值的呼吸力学辨识练习 | 压力与流量双通道,频率跨度覆盖慢呼吸到快呼吸 | 基本够,但没有独立测得的参照值 |
| 睡眠呼吸暂停事件检测训练 | 无事件、无整夜、无患者 | 不够,只能做方法预研 |
| 漏气伪差的系统性研究 | 官方承认面罩密合不佳会带来误差,但未提供漏气通道 | 不够,只能从流量差里间接推断 |
| 家庭环境下的长时程数据 | 实验室短时试验 | 不够,场景完全不同 |
| 滴定策略对比 | 只有两档固定压力 | 不够,压力档位太少 |
| 与睡眠分期联动的分析 | 无脑电通道 | 不够,无法分期 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 手上有家用呼吸机的整夜导出数据,想先验证算法思路 | 提供一个有真实现场噪声、但没有整夜时间成本的试验田 | 先在它上面把流量到容积的积分、呼吸周期切分、参数辨识跑稳,再回自己的数据 |
| 做呼吸机数据产品,要给「机器能不能当监测仪用」找依据 | 它把这件事的物理链条拆开摆在明面上:两个文丘里、两条流量支、一次合并 | 把它的处理步骤作为你自己数据管线的对照基线 |
| 写论文需要一个公开的 CPAP 压力流量基准 | 有 DOI、有许可、有配套论文、有 PhysioNet 长期托管 | 引用时同时给数据集 DOI 与论文 DOI |
| 想用公开数据训练 OSA 模型 | 只能作为预训练或数据增强的边角料 | 转向带事件标注的整夜数据集,把这份数据放在方法章节 |
| 教呼吸力学课程,需要学生能动手的数据 | 每段 50 至 180 秒,CSV 直读,五列完备,学生当天就能画图 | 用原始版讲信号处理,用处理版讲生理参数 |
| 评估某厂商的漏气补偿算法 | 它的传感器在呼吸机外侧,不经过厂商补偿 | 不够,需要设备端导出数据才能对比 |
1.5 一句话判断
这是一份把「CPAP 管路即传感器」这件事做到极干净的教学级数据:真实现场的呼吸形态、可追溯的换算链、开放许可;但它不是睡眠医学数据,把它当整夜 OSA 数据集用,是整篇最需要避开的误判。
1.6 不适合谁:四条边界
不适合需要事件级标注的监督学习项目。全文没有任何一处标注呼吸暂停、低通气或觉醒,连「哪一段是正常呼吸」都只写在目录名里。
不适合需要患者人群的研究。三十名志愿者全部健康,即便其中有吸烟者、电子烟使用者与哮喘患者,也不构成阻塞型睡眠呼吸暂停的人群样本;任何基于此推测患病表现的结论都缺少分母。
不适合需要整夜时程的分析。单条记录最长一百八十秒,十数到二十几个呼吸周期,无法观察睡眠周期、体位切换与事件在夜间的累积分布。
不适合需要设备端原貌的产品验证。传感器的位置在呼吸机与面罩之间,是外挂的第三方测量装置,不含任何一家厂商的压力补偿算法、漏气估计或自动滴定逻辑。
§2 数据构成与规格
2.1 三个版本、十个目录、两类文件
数据集的组织方式很朴素:先按数据形态分两套(处理后与原始),每套内部按压力档与呼吸频率交叉分成十个目录,目录下是逐个受试者的 CSV 文件。这个结构的好处是路径本身就是元数据,看到目录名就知道压力与频率;坏处是受试者编号不连续,文件级筛选须自己解析文件名。
十个目录的命名规则一致:压力在前,频率在后。以四厘米水柱档为例,五个子目录分别是 Normal、Short、MediumShort、MediumLong、Long;七厘米档同构。呼吸引导的节拍为每分钟 60 次的短呼吸、30 次的中短呼吸、9 次的中长呼吸、6 次的长呼吸,Normal 则是不加节拍的静息呼吸。
| 目录名 | 压力档 | 节拍频率 | 段长 | 每段呼吸数 |
|---|---|---|---|---|
| 4cmH2O_Normal_Breaths | 4 cmH2O | 无节拍(静息) | 60 秒 | 约十余次 |
| 4cmH2O_Short_Breaths | 4 cmH2O | 60 次每分钟 | 50 秒 | 约十七次 |
| 4cmH2O_MediumShort_Breaths | 4 cmH2O | 30 次每分钟 | 50 秒 | 约十七次 |
| 4cmH2O_MediumLong_Breaths | 4 cmH2O | 9 次每分钟 | 120 秒 | 约十七次 |
| 4cmH2O_Long_Breaths | 4 cmH2O | 6 次每分钟 | 180 秒 | 约十七次 |
| 7cmH2O_Normal_Breaths | 7 cmH2O | 无节拍(静息) | 60 秒 | 约十余次 |
| 7cmH2O_Short_Breaths | 7 cmH2O | 60 次每分钟 | 50 秒 | 约十七次 |
| 7cmH2O_MediumShort_Breaths | 7 cmH2O | 30 次每分钟 | 50 秒 | 约十七次 |
| 7cmH2O_MediumLong_Breaths | 7 cmH2O | 9 次每分钟 | 120 秒 | 约十七次 |
| 7cmH2O_Long_Breaths | 7 cmH2O | 6 次每分钟 | 180 秒 | 约十七次 |
需要留意的是,官方摘要把五个频率写成「含被动呼吸在内的非常慢到非常快」,正文方法部分列出的却是 60、30、9、6 四档加静息。两处描述指向同一套协议,只是措辞不同,使用者按目录名判断即可。
2.2 字段与记录的完整字典
数据集的「字段」分三层:文件层的元数据(写在文件名与目录名里)、采集层的人口学信息(写在单独的一张表里)、信号层的时间序列列(写在每份 CSV 的首行)。三层之间没有外键,只能靠受试者编号串联。
| 层 | 字段 | 含义 | 取值与单位 | 来源 |
|---|---|---|---|---|
| 目录 | 压力档 | 名义 PEEP 设定 | 4 或 7,单位 cmH2O | 目录名前缀 |
| 目录 | 频率档 | 引导呼吸的快慢 | Normal、Short、MediumShort、MediumLong、Long | 目录名后缀 |
| 文件名 | 受试者编号 | 与人口学表的主键 | 两位数字,不连续 | 文件名中段 |
| 文件名 | 数据形态 | 处理版或原始版 | 有无 _raw 后缀 | 文件全名 |
| 人口学 | 性别 | 自报 | M 或 F | 人口学表 B 列 |
| 人口学 | 年龄 | 自报 | 岁 | 表 C 列 |
| 人口学 | 体重 | 自报 | 千克 | 表 D 列 |
| 人口学 | 身高 | 自报 | 厘米 | 表 E 列 |
| 人口学 | 体质指数 | 由身高体重计算 | 无量纲 | 表 F 列 |
| 人口学 | 吸烟标记 | 是否吸烟或吸电子烟 | Yes 或 No | 表 G 列 |
| 人口学 | 吸烟频率 | 每日支数或描述 | 文本 | 表 H 列 |
| 人口学 | 吸烟年限 | 持续时长 | 年或月 | 表 I 列 |
| 人口学 | 哮喘标记 | 是否哮喘 | Yes 或 No | 表 J 列 |
| 人口学 | 用药名称 | 常用吸入药 | 文本 | 表 K 列 |
| 人口学 | 用药频次 | 使用频率 | 文本 | 表 L 列 |
| 信号 | 时间 | 自记录起点计时 | 秒 | 处理版 A 列 |
| 信号 | 文丘里 1 压力 | 呼吸机出口一侧表压 | cmH2O | 处理版 B 列 |
| 信号 | 文丘里 2 压力 | 面罩入口一侧表压 | cmH2O | 处理版 C 列 |
| 信号 | 文丘里 1 流量 | 机器送出的流量 | 升每秒 | 处理版 D 列 |
| 信号 | 文丘里 2 流量 | 到达面罩的流量 | 升每秒 | 处理版 E 列 |
| 原始 | 吸气支计数 | 文丘里 1 正方向 | ADC 计数 | 原始版 C 列 |
| 原始 | 呼气支计数 | 文丘里 1 负方向 | ADC 计数 | 原始版 D 列 |
| 原始 | 吸气支计数 | 文丘里 2 正方向 | ADC 计数 | 原始版 F 列 |
| 原始 | 呼气支计数 | 文丘里 2 负方向 | ADC 计数 | 原始版 G 列 |
字段表里没有出现的内容,同样值得单列:没有漏气通道、没有环境温湿度与大气压、没有面罩型号记录、没有试验当日的配合质量评分。这些缺失直接决定了 §7 里那几条偏差的来源。
2.3 一条记录的完整解剖
一份处理后的 CSV 只有五列。首行是列名与单位,其后每行是一个采样点。采样率一百赫兹,意味着一秒五十行、三分钟九千行,用文本编辑器也翻得动。下面这段是用 Python 读入一份长呼吸记录后打印出来的真实结构,字段名与文件首行一致。
#-- 读一份处理版 CSV,确认列结构与时序长度
import pandas as pd
path = "Processed_CSV_Data_Files/4cmH2O_Long_Breaths/Subject_01_4cmH20_long_breaths.csv"
df = pd.read_csv(path)
print(df.columns.tolist())
#-- 形如 ['Time [s]', 'Pressure at Venturi 1 [cmH20]', 'Pressure at Venturi 2 [cmH20]',
#-- 'Flow at Venturi 1 [L/s]', 'Flow at Venturi 2 [L/s]']
print(df.shape) #-- 行数约等于时长乘 100,列数为 5
print(df["Time [s]"].head(3).tolist())
#-- 时间自 0 起算,步长 0.01 秒;若首值不是 0,说明文件被平移过
dt = df["Time [s]"].diff().median()
print("采样间隔", dt, "推算采样率", round(1 / dt, 2))
解剖一条记录,可以按四步走。第一步看时间轴:首值、末值、步长是否恒定,能直接判断采样是否丢失。第二步看两路压力:文丘里 1 在呼吸机一侧,文丘里 2 在面罩一侧,两路之差就是呼气孔两侧的压降;压降应当随呼气同步起伏。第三步看两路流量:文丘里 1 记录的是机器送出的气流,其中包含持续不断的偏置流量与周期性的呼吸成分;文丘里 2 记录的是真正进到面罩里的气流。第四步做积分:对流量按时间积分得到容积,一个完整呼吸周期内的正负面积若不闭合,剩下的差值就是漏气。
这四步没有一步需要额外数据,全部可由五列算出。这也是这份数据最实用的地方——它把一个复杂产品的内部机理压缩成了五个数字列。
2.4 受试者构成的分布
三十名受试者的构成写在单独一张人口学表里。官方描述是男女各半、年龄十九到五十八岁,招募集结方式为校园广告,包含了吸烟者、电子烟使用者与哮喘患者。把这三十行按官方给出的字段做粗粒度归类,得到下面的分档表;表中的分组是按原始数值归档,未做任何替换。
| 人口学分档 | 人数 | 说明 |
|---|---|---|
| 男性 | 15 | 与女性各半 |
| 女性 | 15 | 与男性各半 |
| 二十岁上下 | 25 | 校园招募的主要构成 |
| 二十八至三十三岁 | 3 | 少量在职或研究生年龄 |
| 四十七岁与五十六岁 | 2 | 年龄跨度上端 |
| 自报吸烟或吸电子烟 | 6 | 含一名规律电子烟使用者 |
| 自报哮喘 | 7 | 多数在用药,用药频次自报 |
| 体质指数低于 25 | 22 | 偏瘦与正常为主 |
| 体质指数 25 至 30 | 7 | 超重区间 |
| 体质指数 30 以上 | 1 | 肥胖区间仅一例 |
这张表说明一件重要的事:这是一支典型的大学校园志愿者队伍,年龄高度集中在二十岁附近,肥胖者只有一例,而肥胖恰恰是阻塞型睡眠呼吸暂停最强的危险因素。换句话说,它的人群构成与 OSA 临床人群之间的差距,不只是「健康与患病」的区别,还包括年龄结构与体质分布的整体错位。
2.5 它与同类资源的字段差异
| 资源 | 通道构成 | 时程 | 标注 | 人群 | 与本集的关系 |
|---|---|---|---|---|---|
| 本集 | 双文丘里压力与流量 | 50 至 180 秒 | 无 | 健康志愿者 | —— |
| 常规多导睡眠图数据集 | 脑电、眼电、肌电、气流、胸腹带、血氧、体位 | 整夜 | 逐三十秒分期与事件 | 患者 | 本集缺全部生理并行通道 |
| 单导联心电睡眠呼吸暂停集 | 单路心电 | 整夜 | 逐分钟呼吸暂停标记 | 患者 | 本集缺整夜与标注,但直接测的是呼吸 |
| 呼吸机波形公开库 | 气道压、流量、容积、二氧化碳、血氧 | 数小时 | 手术或事件标记 | 麻醉或重症患者 | 本集无临床干预与事件 |
| 家用呼吸机厂商导出数据 | 设备内部流量与压力估计 | 整夜 | 设备自带事件估计 | 使用者 | 本集是外部测量,未经厂商补偿 |
| 肺功能测试公开集 | 流量容积环、动态围度、心电、电阻抗 | 数分钟 | 试验步骤标签 | 健康人 | 结构与本集同源,通道更多 |
与本集同源的还有同课题组后来发布的几份数据:一份加了胸腹动态围度与电阻抗成像,一份加了心电与光电容积脉搏波,一份在健康人身上用装置模拟阻塞性疾病。它们的共同点是都出自同一台自建采集装置的技术路线。选哪一份,取决于你要不要并行生理通道——只要流量与压力,本集最轻;要围度与通气分布,转向后发布的那几份。
§3 定位与身份:它不是睡眠数据,是呼吸机管路的数据
3.1 三种都可以叫「CPAP 数据」的东西
同样顶着 CPAP 三个字的数据集,实际上分三类,混淆的代价很大。
第一类是整夜治疗记录。病人戴着机器睡一夜,设备记录压力、流量、漏气、事件估计,天亮后导出一份报告。这类数据的价值在于时程与人群,问题在于厂商不开放、格式各自为政。
第二类是多导睡眠图里的 CPAP 滴定夜。技师在睡眠实验室里一边看脑电一边调压力,找到能把呼吸事件压下去的最低压力。这类数据有金标准标注,但采集成本高、样本小。
第三类是实验台上的管路测量。受试者清醒、短时、按程序呼吸,研究者用外挂传感器精确测量管路里的压力与流量。本集属于这一类,且只属于这一类。
三者的关系不是优劣,而是分工:第一类回答「这个人夜里出了什么事」,第二类回答「该给多大压力」,第三类回答「这台机器的读数在物理上意味着什么」。本集站在最底层的一格。
3.2 这份数据的身份由三条事实确定
第一条是受试者健康。采集在大学的低风险试验条件下进行,伦理批件编号写在主页上,招募对象是没有诊断的成人。这一点把它与任何面向疾病的队列彻底分开。
第二条是测量装置外挂。传感器不是装在呼吸机里的,而是串接在呼吸机与面罩之间的一座 3D 打印件上。装置本身有独立的技术论文,讲清了文丘里收缩比、传感器型号与标定方法。
第三条是协议是程序化的。受试者不是自然呼吸,而是跟着屏幕上的节拍与声音吸气呼气,五档频率逐个走完。这让呼吸周期可预期,也让数据带上了明显的配合痕迹。
3.3 它与「机器自带记录」的区别
家用呼吸机内部也会记录流量和压力,但那是为了控制风机而算出来的量,中间隔着一层厂商固件:压力补偿、漏气估计、事件判定、数据压缩,每一步都可能改动原始读数。使用者看到的是处理之后的估计值,看不到传感器的原始信号。
本集的传感器在机器外面。它不知道机器在做什么补偿,只负责把流经管路的真实气体量出来。这个位置差异有两个后果:好处是数据没有厂商算法的痕迹,可用来验证算法;坏处是它也不包含任何一台真实设备的行为,无法用它反推出某款机器会怎样记录。
3.4 身份上的三个易混点
| 易混表述 | 实际身份 | 判别依据 |
|---|---|---|
| 「坎特伯雷 CPAP 睡眠数据集」 | 实验室短时呼吸试验 | 受试者健康、无睡眠分期、时长短 |
| 「家用呼吸机导出数据」 | 外挂传感器测量 | 装置有独立技术论文,非设备固件输出 |
| 「CPAP 滴定数据」 | 固定两档压力的对照试验 | 压力只有 4 与 7,无逐级滴定过程 |
| 「多通道呼吸数据」 | 单点管路压力流量 | 无胸腹带、无血氧、无脑电 |
| 「呼吸暂停数据」 | 静息状态下的规则呼吸 | 无事件、无停搏、受试者按节拍呼吸 |
| 「肺功能检查数据」 | 非受控呼吸的连续记录 | 无用力呼气动作、无肺量计读数 |
§4 质量与特色:一条换算链把 ADC 变成了生理量
4.1 数据是怎么从电压变成升每秒的
这份数据最值得学习的地方,是它把每一步换算都留在了原始版里。传感器输出的是 ADC 计数,要变成厘米水柱与升每秒,中间要过三道关:压力关、流量关、合并关。
压力关最直接:查传感器数据手册,按量程与位数把计数换算成压力值。两枚传感器型号都写在主页上,一只是压差式、一只是表压式,前者测文丘里两侧的压差,后者测管路内的静压。
流量关是质量守门人:文丘里管在喉部收缩,流速加快、静压下降,压差与流量之间存在由伯努利方程和连续性方程确定的关系。研究者用一台医院级机械呼吸机产生已知流量曲线,反过来标定这套装置,把压差换算成流量。
合并关最容易被忽略:两只文丘里各配一对单向压差传感器,吸气与呼气分别记在两个通道里,取绝对值后再按引导频率下的最短吸气长度与容积合成一条双向流量曲线。这个合并规则有参数,参数来自协议,不是来自生理,所以它对非节拍呼吸未必同样合适。
4.2 原始版与处理版的分工
两个版本不是冗余。处理版是结果,原始版是过程。凡是怀疑处理步骤影响结论的场合,都应回到原始版重算一遍。
| 对比项 | 处理版 | 原始版 |
|---|---|---|
| 列数 | 五列 | 七列 |
| 压力单位 | 厘米水柱 | ADC 计数 |
| 流量 | 已合并为双向单列 | 吸气支、呼气支分开 |
| 换算参数 | 已应用 | 未应用,须自行换算 |
| 适合的任务 | 生理参数估计、绘图、教学 | 信号处理、标定复核、算法开发 |
| 体积 | 约为原始版的一半 | 较大 |
| 出错时的可诊断性 | 低,错误被换算吸收 | 高,可逐环节复算 |
4.3 采集装置的公开程度
这套装置本身有独立的论文与硬件文章公开,包含文丘里收缩比、管路内径、传感器型号、采样单元型号与标定流程。对复现者来说这是加分项:不是只有数据没有工具,也不至于因为装置不明而无法解释数据里的异常。
相比之下,很多同类公开数据只给信号不给装置,遇到波形畸变时无从判断是生理原因还是设备原因。本集在这点上诚实得多,主页甚至明确指出「密合更好的面罩有望减少呼气末捕获的误差」,等于把漏气问题主动写在了说明书里。
4.5 案例:受试者 1 的一段长呼吸
取受试者 1 在四厘米水柱压力档下的长呼吸记录(每分钟六次的引导档,总长一百八十秒),可以完整走一遍从流量到结论的四步,这段记录在后文会被反复引用。
第一步看两路流量的关系。机器送出的流量在文丘里 1 处是一个持续的正向偏置叠加呼吸波动,到达面罩的流量在文丘里 2 处幅度略小,两者之差就是被呼气孔排掉的部分与漏掉的部分。官方对这一点的说明很克制:只讲呼气孔位于两只文丘里之间,数据同时捕获了「机器送出的流量」与「送到面罩的流量」。
第二步看压力。两处表压都在四厘米水柱附近上下浮动,吸气时略降、呼气时略升,波动幅度不大,这与 CPAP 的恒压特性一致;恒压正是它作为「气动夹板」撑开气道的工作方式。
第三步积分。对文丘里 2 的流量按时间积分得到进入面罩的容积,一个呼吸周期里吸气段为正、呼气段为负,两者不平衡的部分就是这段时间内累积的漏气或气路弹性储存。受试者 1 这一段记录没有独立漏气通道,所以这个差值只能被描述为「未闭合量」,不能直接叫做漏气量。
第四步推断呼吸做功。已知压力与流量,就能算压力乘流量的瞬时功率,再对吸气段积分得到每次呼吸的做功。这正是官方列出的用途之一:从这段数据里外推病人的呼吸用力,进而辅助通气治疗处方。
§4.5 的案例之所以值得单独拿出来,是因为它同时展示了这份数据的强项与软肋:强项是四步全部可算、每一步都有物理意义;软肋是第四步的前提——管子里的流量忠实反映病人的用力——在真实病人身上会被漏气与压力补偿打断,而在本案里这两者都被实验条件压到了很低。
4.6 质量上的三个正面事实
其一,换算链完整。原始码值与物理量同时发布,任何人可以重走一遍换算,检验结论是否依赖于某一步的假设。
其二,装置有独立文献。文丘里装置的设计、制作与标定各有公开文章,遇到异常可以回查装置层面,而不是只能猜测。
其三,元数据诚实。主页明确写出受试者构成包含吸烟者、电子烟使用者与哮喘者,明确写出面罩密合不佳会带来误差,也明确写出误差明显的片段在加工时被删除。这些都是数据提供方本可以不写的内容。
§5 取数与管线:从 PhysioNet 到一条可用的呼吸曲线
5.1 从哪里取
官方入口是 PhysioNet 的项目页,文件区按版本列出。当前版本为 1.0.1,另有 1.0.0 早先发布,两版的 DOI 不同:版本页给的是 1.0.1 的 DOI,另有「最新版本」DOI 指向同一项目。引用时按你实际下载的版本写。
文件区的顶层有三部分:处理后 CSV 目录、原始 CSV 目录、一张人口学表;另有 README、许可文本、校验和清单与三张采集示意图。
5.2 目录遍历与批量清单
十个子目录的结构完全一致,可以一次性把清单拉下来,做成一张索引表再决定要哪些。下面是可直接运行的遍历脚本,只读目录、不下载文件本体。
#-- 遍历十个子目录,生成文件索引(不下载文件本体)
import re
import requests
from urllib.parse import urljoin
BASE = "https://physionet.org/files/cpap-data-canterbury/1.0.1/"
SUBS = [f"{p}cmH2O_{b}_Breaths"
for p in ("4", "7")
for b in ("Normal", "Short", "MediumShort", "MediumLong", "Long")]
rows = []
for sub in SUBS:
url = urljoin(BASE, f"Processed_CSV_Data_Files/{sub}/")
html = requests.get(url, timeout=30).text
for href, size in re.findall(r'href="([^"]+\.csv)"[^<]*</a>\s*</td>\s*<td[^>]*>\s*([\d ]+)', html):
rows.append({"dir": sub, "file": href, "bytes": int(size.replace(" ", ""))})
print(len(rows), "份处理版文件")
print(sum(r["bytes"] for r in rows) / 1e6, "MB")
清单的价值在于编号不连续。某个目录里的受试者编号会跳号,说明那位受试者在该条件下没有可用记录,或记录在加工阶段因传感器误差被删。按照清单里的人数而不是三十去估算总行数,才不会在合并时出现空洞。
5.3 从 ADC 还原物理量
原始版给了七列,其中四列是两路吸呼分流的计数。要还原成处理版那样的一条双向流量,需要先做单位换算,再做分支合并。下面的代码演示了换算骨架,标定常数须按你自己的装置或按论文给出的关系填写。
#-- 原始版骨架:ADC 计数 -> 压力 -> 压差 -> 流量 -> 双向合并
import pandas as pd
import numpy as np
raw = pd.read_csv("RAW_CSV_Data_Files/4cmH2O_Long_Breaths/Subject_01_4cmH20_long_breaths_raw.csv")
#-- 1) 数据手册给出的满量程与位数,换算为压力(此处为结构示例,常数以手册为准)
ADC_FULL, V_FULL, P_RANGE = 1023.0, 5.0, 0.125 #-- kPa,按 SDP816-125PA
volt = raw.iloc[:, 2] / ADC_FULL * V_FULL
dp = (volt - volt.median()) / V_FULL * P_RANGE #-- 压差,kPa
#-- 2) 文丘里关系:流量正比于压差平方根,比例系数由呼吸机标定得到
K = 1.0 #-- 须替换为你的标定系数
flow_ins = K * np.sqrt(np.clip(dp, 0, None))
#-- 3) 与呼气支合并为一条双向曲线
flow_exp = -K * np.sqrt(np.clip(-dp, 0, None))
flow = np.where(flow_ins > 0, flow_ins, flow_exp)
print("正负样本比例", (flow > 0).mean())
这段代码里的常数只是骨架,真正的标定系数来自研究者用医院级呼吸机产生已知流量所做的对照。不重做标定就直接套用别人的常数,是这份数据最常见的误用方式之一:数值看似合理,实际上偏了一个系统性的倍率。
5.4 把流量变成容积与呼吸周期
拿到双向流量后,第一件事是积分成容积,第二件事是切出呼吸周期。前者是一行累加,后者需要阈值与最小间隔两个参数。
#-- 流量积分成容积,并用零点穿越切出呼吸周期
import pandas as pd
import numpy as np
df = pd.read_csv("Processed_CSV_Data_Files/4cmH2O_Long_Breaths/Subject_01_4cmH20_long_breaths.csv")
t = df.iloc[:, 0].to_numpy()
f = df.iloc[:, 4].to_numpy()
fs = 1.0 / np.median(np.diff(t))
volume = np.cumsum(f) / fs #-- 升,未做基线矫正
volume = volume - np.percentile(volume, 5) #-- 去掉高位偏置便于观察
#-- 呼气末为容积极小值点,两个极小值之间是一个呼吸周期
idx = [i for i in range(1, len(volume) - 1)
if volume[i] < volume[i - 1] and volume[i] <= volume[i + 1]]
min_gap = int(0.5 * fs) #-- 半秒内只保留一个
cycles = [p for k, p in enumerate(idx) if k == 0 or p - idx[k - 1] > min_gap]
periods = np.diff(np.array(cycles)) / fs
print("周期数", len(periods), "平均周期", round(periods.mean(), 2), "秒")
print("潮气量估计", round(np.percentile(volume, 95) - np.percentile(volume, 5), 3), "升")
按引导频率核对切出的周期数,是检验管线是否正确的第一步:六次每分钟的长呼吸,一百八十秒里应当切出十五到十八个周期;若切出四十个,多半是把心源性振荡或传感器噪声当成了呼吸。
5.5 同一段数据在 Python 里的另一个入口
有人习惯用成熟的科学计算库做呼吸相位检测,也有人想按 WFDB 生态处理。本集不是 WFDB 格式,没有头文件,也没有注释通道,所以 wfdb 库只能用于读入自己转换后的数据。这一点必须在开工前知道,否则会白白花时间找 .hea 文件。
| 工具 | 能否直接读 | 需要做的预处理 |
|---|---|---|
| pandas | 能,CSV 直读 | 无需,注意首行为列名 |
| numpy | 能,跳过表头即可 | 需自行记下采样率与列顺序 |
| scipy | 能,配合 pandas | 滤波与峰值检测参数须按 100 Hz 设定 |
| wfdb | 不能 | 须先转换为 WFDB 记录并生成头文件 |
| matplotlib | 能 | 分页截取,单文件最长一万八千行 |
5.6 哪些操作会让结论失效
一是在不同文件之间直接拼接。每个文件的起点时间都是零,压力档与频率档不同,拼接后得到的时间序列没有生理意义。
二是用静息段估计潮气量后直接外推到节拍段。静息呼吸的深度与节拍引导下的深度不同,两者的潮气量不能混用。
三是把两路流量之差直接称为漏气量。差值里还包含呼气孔排出的部分与管路弹性储存,官方只用「两个位置之间的差异」来描述它。
四是忽略加工阶段的删除。误差明显的片段在发布前被删除,文件里的时间是连续重排后的结果,因此不存在「这里少了一秒」的标记,也就不能假设时间轴与现场录音逐秒对应。
§6 与库内条目的关系
6.1 关系图谱
这份数据在库内的位置很特别:它测量的是呼吸,但所用的接口是呼吸机;它与睡眠类条目相邻,但不共享任何临床通道。
| 库内条目 | 共同点 | 差别 | 该用哪个 |
|---|---|---|---|
| 单导联心电睡眠呼吸暂停集 | 都面向睡眠呼吸暂停这个应用 | 那份靠心电间接推断,本集直接测呼吸 | 事件检测用前者,信号物理语义用本集 |
| 睡眠多导图分期数据集 | 都服务睡眠医学 | 那些有脑电与分期标签,本集没有 | 分期用前者,本集不可用于分期 |
| 脑电睡眠数据库 | 长期记录、多通道 | 本集短时、单点 | 按任务面选择 |
| 麻醉重症波形数据库 | 都有气道压与流量 | 那些有干预与事件,本集是健康人程序化呼吸 | 临床干预研究用前者 |
| 生理信号通用挑战赛数据 | 同为 PhysioNet 托管、开放许可 | 任务是分类或检测,本集无任务定义 | 参赛与基准用挑战数据 |
6.2 检索路径
在站内找同类资源,可从三个入口切入。
按标签:生理信号与大类时序数据这两个标签下,能捞到大部分含长时波形但不含影像的条目;睡眠信号标签下则是整夜多通道为主的一批。
按机构:坎特伯雷大学的这份数据属于一个更大的项目组,同组在 PhysioNet 与 Elsevier 数据期刊上还有多份同源数据,检索时限定机构名与呼吸关键词,基本能一次拉全。
按任务:如果目标是「从气道信号估计呼吸力学参数」,可用呼吸力学、肺弹性、气道阻力这类术语检索,本集之外还有若干机械通气相关的公开集可作外部对照。
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
评估这份数据时,最容易被误判的一处,是拿它去和整夜睡眠数据比「样本量」与「时长」,然后得出「太少不能用的结论」。这是错位的比较:它要回答的问题是「管路里的压力流量能不能还原一次呼吸」,这个问题一百八十秒足够,整夜反而是冗余。正确的对照对象不是整夜数据集,而是实验室呼吸测量数据与设备台架测试数据。按后两者比,它的样本量与通道数并不寒酸;按睡眠医学的需要比,它从一开始就不是那个东西。判读这一节时,请始终把「它想回答什么」放在「它有多少」前面。
7.1 五维评分
采用 DAIMS 框架的五个维度,每维 5 分制。评分对象是这份公开数据本身,不含论文与装置文章——后两者不在数据包内,但它们对可用性的影响在理由里注明。
| 维度 | 评分 | 理由 |
|---|---|---|
| 可得性(Accessibility) | 4.5 | 无需注册,CSV 直读,CC BY-SA 4.0 开放,有校验和清单 |
| 可用性(Usability) | 3.0 | 五列结构清晰,但换算常数与标定须自行重做,无头文件 |
| 标注质量(Annotation Quality) | 1.0 | 无任何事件或周期标注,条件信息只存在于目录名 |
| 方法学严谨性(Rigor) | 4.5 | 装置有独立文献,标定用医院级呼吸机对照,原始与处理后并行发布 |
| 代表性与公平性(Representativeness) | 1.5 | 三十名校园志愿者,年龄集中于二十岁附近,不追求人群代表性 |
| DAIMS 综合 | 2.9 | 工程严谨,临床代表性让位 |
标度说明:严谨性一项的高分与代表性一项的低分并不矛盾,两者衡量的是不同用途下的适配度。若把权重按「方法验证」重新分配,满分项会落在严谨性与可得性上,综合分明显更高;本文不加权,只按通用框架给出。
| 维度 | 若用于模型开发 | 若用于临床研究 | 差异来源 |
|---|---|---|---|
| 可得性 | 4.5 | 4.5 | 无差异 |
| 可用性 | 4.0 | 2.5 | 临床研究需要并行生理通道 |
| 标注质量 | 1.5 | 1.0 | 开发可自建伪标签,临床必须有金标准 |
| 严谨性 | 4.5 | 4.0 | 装置透明利于复现,外挂测量偏离临床实际 |
| 代表性 | 2.0 | 1.0 | 两者都不足,临床研究的要求更高 |
均分不到三分,属于「定位精准的小样本工具数据」这一档。它在自己的定位上做得干净,超出定位使用则没有支撑。
7.2 与它宣称的用途之间的落差
主页的用途段写的是:可用于开发或验证肺力学模型,可用于发展无法无创测量的个体化参数辨识方法,若能做到逐呼吸实时,可协助临床医生处方或优化 CPAP 治疗,包括优化 PEEP 设定。
这些用途与数据的匹配度并不均匀:
| 宣称用途 | 数据支撑程度 | 说明 |
|---|---|---|
| 验证肺力学模型 | 高 | 压力流量双通道、多频率覆盖,正是模型辨识需要的激励条件 |
| 发展个体化参数辨识方法 | 中高 | 有健康人个体差异,但没有独立测得的参照参数 |
| 辅助设定 PEEP | 低 | 只有两档压力,无法构成压力与响应之间的曲线 |
| 外推病人呼吸用力 | 中 | 有做功的可算性,但真的病人有漏气与补偿 |
| 实时反馈 | 不能验证 | 数据是离线文件,无实时性信息 |
落差的关键在第三行。PEEP 优化需要在一段压力区间内观察参数的响应,两档压力只能给出一个斜率,无法定位最优点。
7.3 已知的、可枚举的偏差
健康人偏差:全部受试者无 OSA 诊断,模型中难以出现气道塌陷这一关键现象。用健康人的流量形态训练出来的检测器,对塌陷型事件的形态缺乏先验。
年龄偏差:二十岁上下占绝大多数,老年受试者只有两例。老年群体的呼吸模式、胸壁顺应性与上气道塌陷倾向都与年轻人不同。
节拍偏差:除静息档外,全部呼吸由视听节拍引导,呼吸周期高度规整。真实睡眠中的呼吸周期是变化的,这种规整性会让基于周期统计的算法表现虚高。
短时偏差:没有体位变换,没有面罩位移,没有随时间漂移的漏气。真实场景中漏气是随翻身逐分钟变化的,本集把这一类变异整体排除在外。
加工删除偏差:传感器误差明显的片段在发布前被移除,因此留下的都是「记录得比较好」的片段。数据中看不到失败的记录有多失败。
装置偏差:文丘里装置本身有压降、有死腔、有对气流的扰动。测量行为改变了被测对象,虽然幅度不大,但在做精细力学辨识时需要考虑。
7.4 外部验证矩阵
| 验证对象 | 已在本集内验证 | 需外部数据 |
|---|---|---|
| 流量到容积的积分 | 是,周期数可与引导频率对照 | 极端浅快呼吸需另行验证 |
| 模型参数辨识 | 可用于开发,无独立真值 | 需有创或金标准测量的数据 |
| 呼吸暂停检测 | 未验证 | 必须有事件标注的整夜数据 |
| 漏气估计 | 仅承认存在误差,未提供通道 | 需带漏气日志的设备导出数据 |
| 压力补偿影响 | 完全不涉及 | 需设备端固件级数据 |
| 人群外推 | 未验证 | 需覆盖老年与肥胖的临床数据 |
7.5 它为何能持续:一种能长期站住的公共基础设施
一份只有三十人的短时数据能活下来,原因不在样本量,而在它卡住了一个位置:凡是研究「管路压力流量如何变成生理参数」的人,都需要一份格式简单、换算透明、许可开放的对照材料,而市面上几乎没有第二份。PhysioNet 的长期托管让它获得了稳定的 DOI 与可引用的版本号,即便作者不再维护,链接也不会消失。这份数据因此更像一份标准参考件,而不是一次性的研究产物。
§8 生态位与历史
8.1 从机械通气到自主呼吸的技术路线
这条路线有一个清晰的起点:一室模型把肺看作一个弹性腔、把气道看作一根阻力管,用压力与流量就能解出弹性与阻力。它在深度镇静的病人身上效果很好,因为那时机器主导了整个呼吸周期。
转折点是有人开始问:能不能在病人自主呼吸时也算出来?2015 年前后,这一支研究把时变弹性引入模型,尝试在自主呼吸的波形上做逐点辨识;随后的一系列工作把注意力放到自主呼吸与机械送气的非同步上,辨认两者叠加后的波形特征。
2020 年前后,坎特伯雷团队把问题从「临床上怎么算」拉回到「实验台上能不能先把数据做干净」,于是有了一系列以自建文丘里装置为核心的试验数据。本集是这批数据里最早发布、也最基础的一份。
8.2 项目资金的来处
主页的致谢列出两笔支持:新西兰高等教育委员会资助的医学技术卓越研究中心,与新西兰国家科学挑战的技术与创新专项。这一组合说明它是一项以工程方法改造临床监测的国家级项目的一部分,而不是某个实验室的顺手之作。理解了这一点,就能明白为什么数据里会有那么多工程细节(装置、标定、分流、合并),而临床变量相对单薄。
8.3 同源数据的扩散
本集之后的几年里,同一团队陆续发布了多份同源数据,通道越加越多:加了胸腹动态围度,加了电阻抗成像,加了心电与光电容积脉搏波,加了在健康人身上模拟阻塞性疾病的装置。这些数据与本集共享同一套采集思路与同一批工程人员,构成了一条可以按需向上扩展的路线。
8.4 它在两条生态里的位置
在开放数据生态里,它是 PhysioNet 上少数直接记录呼吸机管路物理量的项目,填补了「设备内部信号」与「临床生理信号」之间的空白。
在睡眠医学生态里,它的位置是旁支:不属于睡眠分期、不属于事件标注、不属于治疗依从性,而属于「睡眠呼吸治疗设备的物理基础」。这个位置冷门,但一旦有人要解释某台机器的读数为什么可信或不可信,就必须回到这一层。
§9 使用指引
9.1 三种角色的路径
做信号处理的人:从原始版入手,先复现换算链,再把两条分支合并成一条,最后核对周期数与引导频率是否一致。这条路径能让你在半小时内理解这份数据的全部机理。
做呼吸力学建模的人:从处理版入手,直接取压力与流量,跑一室或二室模型,把辨识出的弹性与阻力按受试者与频率分组看稳定性。频率跨度是这个练习的关键,慢呼吸与快呼吸下参数的漂移本身就是发现。
做产品与临床转化的人:不必碰原始信号,重点看两路流量的关系与官方对漏气的表述,把它作为评估「机器读数能否当监测用」的参照。§4.5 的案例可以当作一个完整的产品论证模板。
| 角色 | 起点 | 首要目标 | 常见卡点 |
|---|---|---|---|
| 信号处理 | 原始版七列 | 复现换算链 | 标定系数无处可抄,须自己标定 |
| 力学建模 | 处理版五列 | 辨识弹性与阻力 | 无独立真值,只能看自洽性 |
| 产品转化 | 主页说明与示意图 | 界定读数的可信边界 | 容易把实验室结论直接搬到家用场景 |
9.2 一条最短的可用流程
从零到画出第一张有意义图的最短路径,是四步:取清单、取一份文件、积分成容积、按呼吸周期切段并对齐压力。
#-- 最短流程:只取清单与一份样本,不下载全量
cd /tmp
curl -sL "https://physionet.org/files/cpap-data-canterbury/1.0.1/README.txt"
curl -sL "https://physionet.org/files/cpap-data-canterbury/1.0.1/SubjectDemographicData.csv"
curl -sL -o sample.csv "https://physionet.org/files/cpap-data-canterbury/1.0.1/Processed_CSV_Data_Files/7cmH2O_MediumLong_Breaths/Subject_02_7cmH20_mediumlong_breaths.csv"
wc -l sample.csv
#-- 读入并画出压力与流量两条曲线的叠加图(另存为 PNG)
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("/tmp/sample.csv")
fig, axes = plt.subplots(2, 1, sharex=True, figsize=(10, 5))
axes[0].plot(df.iloc[:, 0], df.iloc[:, 1], label="Venturi 1")
axes[0].plot(df.iloc[:, 0], df.iloc[:, 2], label="Venturi 2")
axes[0].set_ylabel("cmH2O")
axes[0].legend()
axes[1].plot(df.iloc[:, 0], df.iloc[:, 3], label="Venturi 1")
axes[1].plot(df.iloc[:, 0], df.iloc[:, 4], label="Venturi 2")
axes[1].set_ylabel("L/s")
axes[1].set_xlabel("s")
axes[1].legend()
fig.savefig("cpap_sample.png", dpi=150)
跑通之后,先看压力那条线是否在设定值附近平稳,再看流量那条线是否有清晰的周期性起伏。这两点成立,说明你拿到的文件没有错位,后续的所有分析才有意义。
9.3 引用方式
官方要求同时给出数据集的版本引用与论文引用。数据集引用的标准写法包含三位作者、年份、标题、版本号、平台与 DOI;论文引用指向 BMC Research Notes 上的那篇短文,作者顺序与数据集引用略有出入(多出三位合作者)。
| 引用对象 | 用途 | 关键要素 |
|---|---|---|
| 数据集版本记录 | 说明数据来源 | 作者三人、2022 年、版本 1.0.1、DOI 以 xfae 开头 |
| 配套论文 | 说明方法背景 | Guy 等,BMC Research Notes,2022,DOI 以 s13104 开头 |
| 平台引用 | 平台方要求 | PhysioNet 的标准论文与 RRID |
| 装置论文 | 复现采集装置时 | HardwareX 上的双向压力流量装置文章 |
| 伦理批件 | 涉及人类数据说明 | 坎特伯雷大学人类伦理委员会编号 |
§10 AI 使用声明
| 项目 | 内容 |
|---|---|
| 页面性质 | 数据集百科词条,不是论文,不是使用手册 |
| 撰写方式 | 由编辑流程辅助整理公开资料,事实以官方页面为准 |
| 资料来源层级 | 官方主页与文件目录为一级,Europe PMC 摘要为二级 |
| 未做的事 | 未下载全量数据做逐条统计,未读论文全文,未做任何实验 |
| 数字口径 | 规模、结构、边界三类;分档表按官方表格归档 |
| 可复现性 | 所有数字可在附录 A 的来源列中回溯到具体 URL |
| 免责范围 | 不构成临床决策依据,不构成合规结论 |
| 更新策略 | 官方版本变更时整页重核,不增补未核实内容 |
常见误读(避坑清单)
| 说法 | 实际 | 证据 |
|---|---|---|
| 这是睡眠呼吸暂停患者的整夜数据 | 三十名健康志愿者、实验室短时试验 | 主页「Data Description」段写明健康受试者与伦理批件 |
| 有呼吸暂停事件标注 | 完全没有事件标注 | 文件目录里只有压力档与频率档两级 |
| 传感器装在呼吸机上,是设备原始信号 | 外挂装置串接在机器与面罩之间 | 方法段描述 3D 打印双向文丘里装置 |
| 每段数据都很长,适合做长期趋势 | 最长一百八十秒,最短五十秒 | 官方文档列出各频率段的记录时长 |
| 处理版已经清洗干净 | 只做了单位换算与分支合并 | 加工说明称仅剔除误差明显的片段 |
| 两个压力档可以画滴定曲线 | 两点无法定位最优点 | 协议只设 4 与 7 cmH2O |
| 直接积分流量就得到真实潮气量 | 需先处理漏气与偏置,否则容积漂移 | 官方说明面罩密合影响呼气末捕获 |
| 可以和别的睡眠数据按时间拼接 | 每份文件时间均从零起算,无绝对时钟 | 处理版首列为自记录起点计时 |
| 受试者编号是连续的三十个 | 部分目录存在跳号 | 目录内文件清单编号不连续 |
| 这是 WFDB 格式数据 | 全部为 CSV | 文件区只有 CSV 目录与表格 |
FAQ
Q1:它能不能直接当 OSA 检测的测试集?
不能。测试集的基本要求是有金标准和有代表性样本,这份数据两者都不具备:没有事件标注,受试者也全部健康。它能做的是方法预研与信号处理验证。
Q2:为什么官方说五个呼吸频率,正文只列了四个?
官方摘要用「very slow to very fast」概括,方法段列出 60、30、9、6 四档节拍,再加上一个不加节拍的静息档,合计五档。两种说法不矛盾,只是抽象层次不同。
Q3:两路文丘里测的到底是什么?
呼气孔两侧各有一只文丘里,一只在呼吸机送出端,一只在面罩入口端。前者记录机器实际送出的气流,后者记录真正进入面罩的气流,两者的差异部分包含经呼气孔排出的气体与面罩边缘的泄漏。
Q4:为什么要在 100 赫兹采样?
原始采样是 83.33 赫兹,约合每十二毫秒一个点。重采样到 100 赫兹让时间轴变成每点十毫秒的整数,便于与秒或毫秒为单位的下游处理对齐,也让文件更易读。
Q5:受试者里有病人吗?
没有确诊的睡眠呼吸暂停患者。受试者中包含吸烟者、电子烟使用者与哮喘患者,这些是呼吸道状况的变异,不是睡眠呼吸疾病。
Q6:能不能用这份数据研究漏气?
只能间接研究。官方承认面罩密合会影响测量,但没有单独的漏气通道,也没有受试者翻身带来的漏气变化。想系统研究漏气,需要设备端导出的带漏气记录的数据。
Q7:标定系数为什么不能直接用论文里的?
因为标定依赖于具体的装置、传感器个体与管路几何。论文给出的是方法与量级,不是可以直接套用的常数。复现时应重新标定,否则会引入系统性倍率误差。
Q8:为什么加工阶段要删掉一部分数据?
官方说明误差明显的传感器记录在加工时被移除。删除提高了可用性,代价是数据里看不到失败的样本有多失败,做鲁棒性研究时会低估真实故障率。
Q9:这份数据能做产品验证吗?
能做原理验证,不能做合规验证。它的传感器在设备之外,不含任何厂商的算法,也没有法规要求的测试条件与判定标准。
Q10:同组后来发布的数据要不要一起拿?
看你是否需要并行生理通道。只需要压力流量,本集最轻;需要胸腹围度、电阻抗、心电或血氧,则应转向后续的同源数据集。
Q11:为什么只有三十人还要发布?
因为它要解决的不是人群统计问题,而是方法可行性问题。同一份数据可以让不同团队复现同一条换算链,这正是开放数据在本领域的价值。
Q12:整晚都在用的机器会产生多少这类数据?
按一百赫兹、五个通道、八小时估算,单夜约有两百八十万行、数千万个数值。这个量级说明家用呼吸机每晚都在产出与本研究同等精细的数据,只是这些数据的所有权不在研究社区手里。
术语表
| 术语 | 英文 | 含义 |
|---|---|---|
| CPAP | Continuous Positive Airway Pressure | 持续气道正压通气 |
| PEEP | Positive End-Expiratory Pressure | 呼气末正压 |
| 文丘里管 | Venturi tube | 管径收缩产生压差以测流量的装置 |
| 压差传感器 | differential pressure sensor | 测量两点压差的元件 |
| 表压传感器 | gauge pressure sensor | 相对大气压测量的元件 |
| ADC 计数 | analog-to-digital count | 模数转换后的整数码值 |
| 吸气支 | inspiratory limb | 单向记录吸气方向的通道 |
| 呼气支 | expiratory limb | 单向记录呼气方向的通道 |
| 潮气量 | tidal volume | 一次呼吸进出肺的气量 |
| 呼吸弹性 | elastance | 肺与胸壁回缩的强度指标 |
| 气道阻力 | airway resistance | 气流通过气道所受阻碍 |
| 呼吸做功 | work of breathing | 完成一次呼吸所需的功 |
| 自主呼吸 | spontaneous breathing | 由患者自己发起并驱动的呼吸 |
| 漏气 | mask leak | 面罩与面部之间的气体逸出 |
| 压力补偿 | pressure compensation | 设备为维持设定压力而对流量的主动调节 |
| 呼气孔 | expiration hole | 面罩侧用于排出二氧化碳的固定孔 |
| 滴定 | titration | 寻找合适治疗压力的过程 |
| 阻塞型睡眠呼吸暂停 | obstructive sleep apnea | 睡眠中上气道反复塌陷的疾病 |
| 低通气 | hypopnea | 通气量明显下降但未完全停止 |
| 多导睡眠图 | polysomnography | 整夜多通道睡眠监测 |
| 呼吸事件 | respiratory event | 呼吸暂停或低通气的统称 |
| 训练道 | pacing | 用视听信号引导呼吸节奏 |
| 死腔 | dead space | 不参与气体交换的管路容积 |
| 电阻抗成像 | electrical impedance tomography | 用体表电极测胸腔通气分布 |
| 动态围度 | dynamic circumference | 胸腹随呼吸的周长变化 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 受试者人数 | 30 | 主页摘要与方法段 | 官方页面 |
| 男女比例 | 各半 | 主页数据描述段 | 官方页面 |
| 年龄范围 | 19 至 58 岁 | 主页数据描述段 | 官方页面 |
| 名义压力档 | 4 与 7 cmH2O | 主页方法段 | 官方页面 |
| 引导呼吸频率 | 60、30、9、6 次每分钟加静息 | 主页方法段 | 官方页面 |
| 原始采样率 | 83.33 Hz | 主页方法段 | 官方页面 |
| 发布采样率 | 100 Hz | 主页方法段 | 官方页面 |
| 单段时长 | 50 至 180 秒 | 主页数据描述段 | 官方页面 |
| 每段呼吸数 | 约 17 次 | 摘要与方法段 | 官方页面 |
| 处理版列数 | 5 | 主页数据描述段 | 官方页面 |
| 原始版列数 | 7 | 主页数据描述段 | 官方页面 |
| 人口学表列数 | 13 | 表文件首行 | 官方文件 |
| 目录数 | 10 | 文件目录列表 | 官方文件 |
| 未压缩体量 | 233.6 MB | 文件区总览 | 官方文件 |
| 首版日期 | 2021-07-19 | 版本列表 | 官方文件 |
| 当前版本日期 | 2022-03-24 | 版本列表 | 官方文件 |
| 许可 | CC BY-SA 4.0 | 文件区许可栏 | 官方文件 |
| 伦理批件 | HEC 2020/14/LR | 主页伦理段 | 官方页面 |
| 配套论文 | BMC Research Notes 2022 | Europe PMC | 论文摘要 |
| 论文作者数 | 6 | Europe PMC 记录 | 论文摘要 |
附录 B:数字的来源分层
第一层:官方页面。受试者人数、年龄、性别比例、压力档、频率档、采样率、段长、列数、目录数、体量、版本日期、许可、伦理批件,全部出自项目主页与文件目录。这一层的数字可以直接引用,不需要加限定语。
第二层:论文摘要。论文摘要给出与主页一致的受试者人数、压力档、频率档与段长,并补充说明传感器型号与设计目标。摘要与主页在措辞上有差异(正文说四档加静息,摘要说五档),但所指相同。这一层用于交叉核对,不作为主要来源。
第三层:未核实。包括:每个目录究竟有多少名受试者有可用文件、单份文件的精确行数、各压力档下流量的实际分布、删除了多少比例的数据。这些须下载全量包逐文件统计,本篇不做,正文相应位置已注明为未核实或改为定性表述。
附录 C:完整参考文献
- Guy E, Knopp J, Chase G. CPAP Pressure and Flow Data from a Local Trial of 30 Adults at the University of Canterbury (version 1.0.1). PhysioNet. 2022. doi:10.13026/xfae-vv63
- Guy EFS, Knopp JL, Gilbertson O, Blue S, Holder-Pearson L, Chase JG. CPAP pressure and flow data at 2 positive pressure levels and multiple controlled breathing rates from a trial of 30 adults. BMC Research Notes. 2022;15. doi:10.1186/s13104-022-06133-w
- Guy EFS, Clifton JA, Knopp JL, Holder-Pearson LR, Chase JG. Respiratory pressure and split flow data collection device with rapid occlusion attachment. HardwareX. 2023. doi:10.1016/j.ohx.2023.e00489
- Guy EFS, Flett IL, Clifton JA, Calje-van der Klei T, Chen R, Knopp JL, Möller K, Chase JG. Pulmonary function testing dataset of pressure and flow, dynamic circumference, heart rate, and aeration monitoring. Data in Brief. 2024. doi:10.1016/j.dib.2024.110386
- Guy EFS, Clifton JA, Calje-Van Der Klei T, Chen R, Knopp JL, Möller K, Chase JG. Respiratory monitoring dataset, with rapid expiratory occlusions, over increasing positive airway pressure ventilation. Data in Brief. 2024. doi:10.1016/j.dib.2023.109874
- Clifton JA, Guy EFS, Caljé-van der Klei T, Knopp JL, Chase JG. Simulated obstructive respiratory disease dataset over increasing positive end-expiratory pressure. Data in Brief. 2024. doi:10.1016/j.dib.2023.109903
- Chiew YS, Pretty C, Docherty PD, et al. Time-varying respiratory system elastance: a physiological model for patients who are spontaneously breathing. PLoS One. 2015;10(1):e0114847
- Morton SE, Knopp JL, Chase JG, et al. Optimising mechanical ventilation through model-based methods and automation. Annual Reviews in Control. 2019;48:369-382
- Pollard T, Moody BE, Lehman L, et al. PhysioNet as a global platform for biomedical research. Nature Health. 2026;1(8):792-795
附录 D:任务代码
下面是三段可直接运行的任务代码,分别对应「取清单」「复现换算」「按频率核对周期数」。前两段与前文重复的部分已省略为注释。
#-- 任务 1:按压力档与频率档汇总文件数与总体量
import re
import requests
from urllib.parse import urljoin
BASE = "https://physionet.org/files/cpap-data-canterbury/1.0.1/Processed_CSV_Data_Files/"
summary = {}
for p in ("4", "7"):
for b in ("Normal", "Short", "MediumShort", "MediumLong", "Long"):
sub = f"{p}cmH2O_{b}_Breaths/"
html = requests.get(urljoin(BASE, sub), timeout=30).text
files = re.findall(r'href="([^"]+\.csv)"', html)
summary[sub] = len(files)
for k, v in summary.items():
print(k, v)
#-- 任务 2:核对切开周期数与引导频率是否一致
import glob
import numpy as np
import pandas as pd
EXPECT = {"Normal": None, "Short": 60, "MediumShort": 30, "MediumLong": 9, "Long": 6}
for path in sorted(glob.glob("Processed_CSV_Data_Files/*_Long_Breaths/*.csv"))[:3]:
df = pd.read_csv(path)
t = df.iloc[:, 0].to_numpy()
f = df.iloc[:, 4].to_numpy()
fs = 1.0 / np.median(np.diff(t))
vol = np.cumsum(f) / fs
vol = vol - np.percentile(vol, 5)
trough = [i for i in range(1, len(vol) - 1)
if vol[i] < vol[i - 1] and vol[i] <= vol[i + 1]]
keep = [p for k, p in enumerate(trough) if k == 0 or p - trough[k - 1] > 0.5 * fs]
n = len(keep) - 1
print(path.split("/")[-1], "周期数", n, "期望约", int(t[-1] / 60 * 6))
#-- 任务 3:按受试者编号合并人口学信息,输出一份分析用索引表
import pandas as pd
demo = pd.read_csv("SubjectDemographicData.csv").dropna(how="all")
demo = demo.rename(columns=lambda c: c.strip())
demo["Subject"] = demo["Subject"].astype(int)
import glob, re
rows = []
for path in glob.glob("Processed_CSV_Data_Files/*/*.csv"):
m = re.search(r"Subject_(\d+)_(\d)cmH2O_(\w+)_breaths", path)
if m:
rows.append({"Subject": int(m.group(1)), "peep": int(m.group(2)),
"rate": m.group(3), "path": path})
idx = pd.DataFrame(rows).merge(demo, on="Subject", how="left")
print(idx.groupby(["peep", "rate"])["Subject"].nunique())
idx.to_csv("cpap_index.csv", index=False)
附录 E:如果只记五件事
第一件事:它测的是呼吸机管路里的压力与流量,不是睡眠。受试者三十人,全部健康,最长一百八十秒。
第二件事:它的价值在于换算链完整——从 ADC 计数到厘米水柱与升每秒,每一步都在原始版里留着,可以重走一遍。
第三件事:两路流量是这份数据的核心设计。一只文丘里在机器端,一只在面罩端,两者的差异是理解漏气与压力补偿的起点。
第四件事:它不能当 OSA 检测的训练集或测试集,没有事件、没有患者、没有整夜。硬用会在自己的测试集上得到不可复现的漂亮数字。
第五件事:许可带传染性,商用与再发布前要逐项确认;引用时同时给数据集 DOI 与论文 DOI。
编辑说明
本篇于 2026-10-27 完成核验。资料来自三处:PhysioNet 项目主页与文件目录、文件区的人口学表与 README 原文、Europe PMC 的论文摘要(BMC Research Notes 2022,doi:10.1186/s13104-022-06133-w)。主页正文逐段读过,人口学表逐行读过并按字段归档,论文只读摘要,未取全文。
派发材料把这份数据设想为「CPAP 设备的流量压力波形加并行生理信号(血氧、呼吸努力、体位),用于睡眠呼吸暂停检测与滴定」。核对后,主干方向相符的部分是:它确实是 CPAP 管路的流量与压力记录,且确由坎特伯雷大学制作。不相符的部分有三处:受试者是健康志愿者而非 OSA 患者;没有血氧、呼吸努力、体位这类并行生理通道;是实验室短时试验而非整夜滴定。本篇按核对值写作,主轴保留「流量信号即呼吸监测」这一命题,但把它的论证从「已经用于检测」调整为「具备被用于检测的物理条件,而本集只提供了条件的一半」。
未覆盖的内容包括:每个目录中实际有可用文件的受试者人数、单份文件的精确行数、加工阶段删除数据的比例、各压力档下流量的分布形态、同一受试者跨条件的配对完整性。这些需要下载全量包逐文件统计,本篇按研究纪律不做,相应位置已标为未核实或改为定性表述。原始 CSV 的下载在本次核查中响应过慢,未能取得文件头,故原始版的列序与单位以主页说明与 README 原文为准,未做文件级复核。
本篇另有一处取舍需要说明。§4.5 的案例之所以选受试者 1 的四厘米水柱长呼吸段,是因为它是站点路径最容易拼出的一份:目录名、压力档、频率档与受试者编号都在文件名里,任何人按 §9.2 的地址就能取到同一份文件,不需要猜测编号。选段式的案例,最怕的是别人对不上号,这份恰好对得上。同一案例在 §7 的两个问题里被再次用到:一是漏气通道的缺失让「未闭合量」不能直接叫漏气,二是压力补偿的不在场让第四步的做功推断只在实验条件下成立。
本篇定位为数据集百科,不是使用手册,也不是临床或合规依据。任何依据本篇做出的算法性能判断、设备合规判断均不成立。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- sleep-edf — 共享标签:生理信号 / 睡眠信号 / 时序数据
- mass — 共享标签:生理信号 / 睡眠信号 / 时序数据
- cinc-2018-sleep-legacy — 共享标签:生理信号 / 睡眠信号 / 时序数据
- sleep-accel — 共享标签:生理信号 / 睡眠信号 / 时序数据
- slpdb — 共享标签:生理信号 / 睡眠信号
- cinc-2018-sleep-arousal — 共享标签:生理信号 / 睡眠信号 / 时序数据
- mmgdb — 共享标签:生理信号 / 时序数据
- c-elegans-wholebrain-calcium — 共享标签:生理信号 / 时序数据
- drosophila-wholebrain-2p — 共享标签:生理信号 / 时序数据
- perg-ioba-dataset — 共享标签:生理信号 / 时序数据
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

