手表记下的运动与一夜判读 — sleep-accel 腕部睡眠库

31 人 / 一人一夜 PSG / 手表加速度与心率

来源 https://physionet.org/content/sleep-accel/1.0.0/发布时间: 2026-10-28最后更新: 2026-10-28 阅读 13
手表记下的运动与一夜判读 — sleep-accel 腕部睡眠库

信息速览

数据集名称手表记下的运动与一夜判读 — sleep-accel 腕部睡眠库
数据类型时序信号,人工标注,元数据,原始数据链接
规模31 名受试者,每人一夜,共 31 夜
接入方式https://physionet.org/content/sleep-accel/1.0.0/
AI 就绪度

消费级手表的睡眠分数每天出现在数亿人的手腕上,可它怎么算出来的、原始信号长什么样,厂商从不公开。研究者拿到的是一个数字,不是一个可以被检验的过程。这条链路上缺的从来不是结论,而是结论之前的那些样本。

sleep-accel 把另一端接上了。31 位受试者在密歇根大学的睡眠实验室睡一夜,手腕上戴着 Apple Watch,身上接着多导睡眠图。第二天,判读员按 30 秒一格给出分期,手表留下的加速度与心率则被改写到同一根时间轴上。信号是消费设备给的,标签是人给的,两者落在同一个夜里。

它的规模不大,结构却少见:四类文件共用一个以 PSG 开始为零点的时间轴,负值意味着设备在进实验室之前就已经在记录。这让它更像一份对照实验的原始记录,而不是一份训练语料。一屏速览见下表。

维度 内容
全名 Motion and heart rate from a wrist-worn wearable and labeled sleep from polysomnography
常用简称 sleep-accel
建设机构 密歇根大学睡眠与昼夜节律研究实验室
提交者 Olivia Walch
上线时间 2019 年 10 月 8 日,版本 1.0.0
DOI 10.13026/hmhs-py35(1.0.0 版)
受试者 31 名成人,每人一夜
原始招募 39 人,排除 8 人后入组
设备 Apple Watch,腕部佩戴
采集通道 三轴加速度、光电容积心率、步数
金标准 临床多导睡眠图,只给判读结果
判读粒度 30 秒一格,编码 0 至 5
采样 加速度约 50 次每秒;心率不等间隔;步数十分钟一格
文件组织 四个目录,每目录 31 个文本文件
体积 解压 2.2 GB,压缩包 550.1 MB
许可 ODC-By 1.0,无需注册
引用论文 Walch 等,Sleep,2019

§1 它要解决的具体麻烦

1.1 一个不公开的算法,配不上一份可检验的数据

可穿戴睡眠研究的尴尬在于两头都够不着。往厂商那边看,算法是黑箱:同一夜的数据,两家设备能给出相差一小时的深睡时长,而外人不清楚差异来自传感器、特征还是阈值。往临床那边看,多导睡眠图虽然可信,却绑在实验室的床上,一个人一辈子做不了几次。

这两头之间本来有一条可走的路:拿消费设备的原始信号,去对齐临床的判读。问题在于原始信号通常拿不到——多数厂商只导出汇总后的分期结果,不导出三轴加速度,也不导出派生心率。没有输入,就没有可复现的建模空间。

环节 厂商一般能给 研究真正需要
原始加速度 不导出 可复算的输入
脉搏波形 只给折算后的心率 逐搏间期
分期结果 给结论不给依据 与判读逐格对齐

sleep-accel 的起点很朴素:作者自己写了一个移动应用,把手表里能读到的加速度与心率原样取出来,然后请受试者带着这只手表去做一次标准的多导睡眠监测。同一夜、同一只手、两套记录,判读由实验室完成。它要回答的不是「手表准不准」,而是「在只有运动和心率的前提下,一个公开的方法能逼近判读到什么程度」。

这个定位决定了它的形状。它不是一份让人练手的语料,而是一次被完整留档的实验:谁做的、用什么设备、怎么对齐、判读到哪一格,全部写在页面上。

1.2 三条常见的错误期待

第一条,以为它是 Apple 官方睡眠算法的对照集。 手表只是传感器。分期来自睡眠技师对多导睡眠图的判读,分类器由作者自己训练。想验证「Apple 的睡眠分数准不准」,这份数据帮不上忙。

第二条,以为加速度覆盖整夜甚至全天。 逐行核对时间戳会发现,加速度文件常常从实验室那一夜之前的一段开始,中间跳过几十小时,再连续记录到天亮后几小时。白天没有连续加速度,只有十分钟一格的步数。想做昼夜节律分析,手里最细的工具是步数,不是加速度。

第三条,以为库里有脑电波形。 多导睡眠图在这里只贡献了判读结果,脑电、眼电、下颌肌电、呼吸气流、血氧一个都没有。任何以脑电为输入的模型都无法在这里训练,也无法复核判读员当时看到了什么。

这三条期待有一个共同根源:把「多导睡眠图」读成了「多导睡眠图数据」。前者是一次判读行为,后者是一堆波形。库里给的是前者的产物。

期待 实际 差在哪
厂商标定对照 手表只当传感器 没有任何厂商算法的输出
全时段加速度 夜间为主,中间断档 白天只剩十分钟一格的步数
脑电波形 只有判读结果 原始通道一个都没有

1.3 它能给到的与给不到的

先看信号与标签这一半,这是它唯一不可替代的部分。

你的需求 它给的 够不够
消费设备原始加速度 三轴、约 50 次每秒、单位 g 够,且是它最稀缺的部分
与临床判读对齐的标签 同一夜、30 秒一格、六种取值 够,对齐机制干净
光电容积脉搏波波形 只有设备算好的心率数值 不够,做不了逐搏分析
脑电、眼电、肌电 完全没有 不够,换库

再看规模与派生指标这一半,缺口主要在这里。

你的需求 它给的 够不够
连续多夜 每人一夜 不够,做不了夜内变异
全天活动量 十分钟一格的步数 勉强,粒度粗
人口学与量表 页面未见列出 不够,需向作者索取
睡眠效率、潜伏期等汇总指标 需自己从分期序列算 够,但要自己定义口径

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

先看建模与验证类处境。

你的处境 它能帮你什么 下一步该做什么
你在做腕部睡眠分期,缺一份带临床标签的公开底座 31 夜的加速度、心率与逐格判读,全部对齐 先按 §9.2 跑通一夜,再批量对齐
你想验证「只用运动够不够」这类消融问题 同一夜同时有运动、心率、步数三路输入 逐路开关,报告每一路的增量
你手上有一款新设备,想找参照系 标签来自多导睡眠图,不是另一款消费设备 先做时间轴与采样率的对齐,再谈精度

再看评估与教学类处境。

你的处境 它能帮你什么 下一步该做什么
你想做跨数据集外部验证 论文已用 MESA 做过一次迁移检验 复现该路线,或换自己的队列
你要教一门可穿戴信号课 四类纯文本文件,格式一眼看懂 用一夜数据做完整练习,不必下整库
你在评估「消费设备能不能替代实验室」 它给的是同一夜的两种测量,变量天然配对 注意样本是筛过的健康人

1.5 一句话判断

它不是「手表准不准」的裁判,而是一份把消费设备的原始信号与临床判读摆在同一根时间轴上的对照实验记录:结论要靠你自己算,前提是先把对齐关系看懂。

1.6 不适合谁:四条边界

不适合做端到端训练集。 31 人、一夜、单中心。任何带隐层的模型都能在几十轮内记住这批人,随机切分还会让同一夜的相邻片段同时落进训练与测试,报出来的数字好看但不成立。

不适合做脑电相关任务。 库里没有脑电波形,只有脑电判读的产物。睡眠纺锤波检测、慢波增强、微觉醒的事件定位,一件都做不了。

不适合做心率变异性。 心率是设备在本地折算后的数值,采样不等间隔,原始脉搏波形也没有保留。逐搏间期、频域功率这些指标在这里没有可靠入口。

不适合代表一般人群。 抽样经过两道筛选:招募后剔除传输失败者,再剔除睡眠呼吸暂停与 REM 睡眠行为障碍者。能戴着表在实验室睡一夜、且被判读为无明显呼吸事件的人,本身就是一个偏健康的子集。

边界 一句话理由 硬到什么程度
端到端训练 31 人一夜,切分稍不慎就泄漏 硬,规模与设计双重限制
脑电类任务 库里根本没有波形 硬,无法变通
心率变异性 只有折算后的心率数值 硬,缺少逐搏信息
人群推断 两道筛选把有睡眠问题的人移出 较硬,可用外部队列补

§2 数据构成与规格

2.1 一个库由四个目录组成

根目录下是四个并列的目录,加上一份许可与一份校验清单。四个目录各装 31 个纯文本文件,文件名统一为「受试者编号 + 类型后缀」,编号在四个目录之间一一对应。31 乘 4,共 124 个数据文件。

1.0.0/
├── motion/          #-- 31 个 *_acceleration.txt,三轴加速度
├── heart_rate/      #-- 31 个 *_heartrate.txt,心率
├── steps/           #-- 31 个 *_steps.txt,十分钟区间步数
├── labels/          #-- 31 个 *_labeled_sleep.txt,三十秒分期
├── LICENSE.txt      #-- ODC-By 1.0 全文
└── SHA256SUMS.txt   #-- 124 个文件的校验和

没有 README,没有字段说明,也没有受试者清单。所有结构说明都写在项目主页上,文件本身不带表头,解析器不能靠首行判断列名,必须按目录硬编码。

目录 文件数 后缀 分隔符 列数
motion 31 _acceleration.txt 空格 4
heart_rate 31 _heartrate.txt 逗号 2
steps 31 _steps.txt 逗号 2
labels 31 _labeled_sleep.txt 空格 2

分隔符不统一这件事,第一次读文件时几乎一定会踩:加速度用空格,心率与步数用逗号,判读又回到空格。按目录分别指定分隔符,比自动推断可靠。

目录 表头 分隔符 缺失怎么表示
motion 无 空格 直接不出行
heart_rate 无 逗号 直接不出行
steps 无 逗号 写 0
labels 无 空格 写 −1

2.2 字段与记录的完整字典

先看身份类字段。四类文件没有公共的索引表,身份完全编码在文件名里,时间则统一编码在第一列。

位置 字段 含义 取值示例
文件名 受试者编号 七位数字,四类文件共用 46343
文件名 类型后缀 标识目录归属 _acceleration
加速度第 1 列 时间戳 距 PSG 开始的秒数,可带小数、可为负 -124489.16105
心率第 1 列 时间戳 同上,精度到五位小数 -556410.36066
步数第 1 列 区间起点 十分钟一格,整秒 -604539
判读第 1 列 格起点 30 秒一格,整秒 390

再看数值类字段。三类信号的量纲不同,小数位也不同,混读时最容易在单位上出错。

位置 字段 含义 取值示例
加速度第 2 至 4 列 X、Y、Z 轴 单位 g,各带七位小数 0.0174866
心率第 2 列 心率 整数,次每分钟 57
步数第 2 列 步数 该区间内的累计步数 28
判读第 2 列 分期编码 0 至 5,另见 −1 2
校验清单 文件名与摘要 相对路径与 SHA256 串 labels/…txt

字典里没有的字段比有的更值得注意:没有年龄、没有性别、没有体质指数、没有睡眠问卷、没有呼吸事件指数、没有记录日期。日历时间被彻底抹掉了,只留下相对秒数。这意味着跨受试者的绝对时间对齐是不可能的,只能按「距零点多少秒」做相对对齐。

2.3 一条记录的完整解剖

取 46343 号受试者的加速度文件开头几行:

-124489.16105 0.0174866 -0.5867004 -0.8057709
-124489.116395 0.0189819 -0.5896759 -0.8091583
-124489.115548 0.0209656 -0.5808868 -0.8150482
-124489.114691 0.0194855 -0.5808716 -0.8135834

第一列是负的十万多秒,折合约负 34.6 小时。第二个时间戳比第一个还大一点点,第三个与第二个只差 0.0008 秒——这说明时间戳并非等间隔生成,而是设备在批量上传时按各自的实际时刻写下的,存在抖动与重复。

同一个人的判读文件读起来完全是另一种节奏:

0 -1
30 -1
60 -1
...
390 0
420 0
...
1410 1
1440 1
1470 1
1500 1
1530 2

三十秒一格,整数秒,取值从 −1 跳到 0 再逐级升到 2。前十三格是 −1,说明判读并没有覆盖零点之后的头六分半——那一段在设备上已经录到了信号,在判读上却是空白。

心率和步数则是逗号分隔、两列,前者每几秒一行,后者每十分钟一行:

#-- heart_rate/46343_heartrate.txt
-556410.36066,57
-556408.36062,56
-556403.36062,56

#-- steps/46343_steps.txt
-604539,0
-599139,28
-598539,0
文件 首列含义 首行时间戳 时间间隔
加速度 采样时刻 负十万秒量级 约 0.02 秒
心率 读数时刻 负五十余万秒 数秒,不等
步数 区间起点 负六十万秒 600 秒
判读 格起点 0 30 秒

三类文件、三种分辨率、两种分隔符,这就是这个库的全部格式复杂度。

2.4 四类文件的规格对照

文件 时间分辨率 单位 覆盖范围 单文件体量 用途
加速度 约 0.02 秒一点 g 以夜间为主,含断档 数十 MB 体动、翻身、觉醒判据
心率 数秒一次,不等间隔 次每分钟 数天,含实验室前 数十至上百 KB 自主神经活动的代理量
步数 600 秒一格 步 约十天 十余 KB 白天活动量的粗粒度代理
判读 30 秒一格 类别编码 判读窗口 数 KB 监督学习的标签
项目 加速度 心率 步数 判读
是否等间隔 近似等间隔,有抖动 否 是 是
时间戳小数位 五到六位 五位 无 无
是否可为负 是 是 是 否
是否含表头 否 否 否 否
缺失如何表示 直接断档,不写行 直接断档 写 0 写 −1

「缺失不写行」和「缺失写 0」是两种不同的约定:前者读进来是变短的序列,后者让零步与没记录看起来一样。把缺失当零会低估活动量,把零当缺失会凭空造出断档。

换算项 算法 结果
加速度单点占用 四列文本,约五十字节 一夜五小时约四十余兆
判读单夜行数 判读时长除以 30 秒 数百行
整库构成 加速度占绝大多数 其余三类合计不足百分之几

2.5 睡眠编码与那个没被用到的 4

编码 含义 是否出现
0 清醒(Wake) 是
1 N1 是
2 N2 是
3 N3 是
4 官方未定义,未使用 否
5 REM 是
−1 判读窗口之外 文件里有,页面未列

前三格到第五格的跳号,来自 AASM 判读体系里「阶段 4」在 2007 年之后被并入 N3 的历史。保留 5 而不重排,是为了与旧版判读软件的输出对齐。页面上写得很清楚:4 没有被使用。

−1 则是另一回事。官方页面的编码说明只列了 0 到 5,而文件里实际存在 −1,出现在判读窗口之前的那一段。两个口径并存,差额构成官方没有说明。

取值 页面怎么写 文件里怎么出现
0 至 3、5 逐条列出含义 出现在判读窗口内
4 注明未使用 不出现
−1 未列出 出现在判读窗口之前

做解析时按「非 0 至 5 即无效」处理最稳。

2.6 时间轴:全库唯一的对齐机制

四类文件之间没有任何显式的连接键,除了文件名里的编号。真正把它们缝在一起的是第一列——距 PSG 开始的秒数。这个设计很省事,也很脆:省事在于不需要额外的对齐表,脆在于一旦有人把负数截断,跨夜的部分就悄悄丢了。

时间戳区间 含义 处理建议
负值,绝对值很大 实验室那一夜之前的日常佩戴 保留可用于昼夜节律,勿混入夜间模型
负值,接近零 入睡前的准备期 可作为清醒基线
零到判读结束 多导睡眠图覆盖的那一夜 监督学习的主战场
大于判读结束 天亮之后的延续记录 单独存放,避免污染夜间标签

判读文件的最大时间戳就是判读窗口的右边界,超过这一点的加速度没有标签。做窗口切片时,右边界必须从判读文件读,不能从加速度文件读——后者往往比前者长。

需要确定的边界 该问哪个文件 常见的错
判读从哪一格开始 判读文件首个非 −1 行 直接取加速度首行
判读到哪一格结束 判读文件末行加一格 取加速度末行
断档落在哪里 加速度时间戳差分 假定连续

2.7 四个空缺与它们的后果

空缺 官方是否说明 后果
加速度采样率 页面未标 依赖时间戳自行折算,重采样前必须核对
人口学字段 页面未见 无法做年龄性别分层,也无法做倾向性调整
多导睡眠图原始通道 明确未提供 判读不可复核,脑电类模型无从训练
采集设备的固件与型号代次 只写 Apple Watch 跨代次的传感器差异无法评估

四个空缺不是疏漏,而是取舍:库的目标是把「设备侧输入 + 临床侧输出」这一对关系公开,不是把整间实验室搬出来。理解这一点,就不会在打开目录时去找脑电文件。

空缺 能不能绕过 绕过办法
采样率 能 用时间戳差分自行折算
人口学 不能 只能联系作者
原始通道 不能 换一个多导库
设备代次 部分 用静止段的方差反推噪声底

2.8 编号是唯一的主键

受试者编号是七位数字,形态像是账号而不是顺序号。四个目录的编号集合完全一致,没有缺号也没有多余文件,这一点可以用校验清单直接验证。

核对项 期望 核对方式
四个目录文件数一致 各 31 列目录
编号集合相同 差集为空 取文件名前缀做集合运算
校验清单条目数 124 数行数
校验清单与实际文件对应 一一对应 逐行比对路径

用编号做主键,好处是不依赖任何外部表;坏处是它不携带任何语义。46343 这个数字既不表示年龄,也不表示入组顺序,跨数据集连接时也没有公共键可用。想把这份数据与别的队列合并,只能靠自采的映射表。

编号特征 观察 含义
位数 七位 形态像账号,不是顺序号
分布 大小跳跃,无连号 无法从编号推入组顺序
一致性 四个目录完全相同 可直接作为主键

§3 它是谁的设备日志:一间实验室与一只自建应用

3.1 提交者与机构

库由 Olivia Walch 提交,采集发生在密歇根大学的睡眠与昼夜节律研究实验室,数据收集时间从 2017 年 6 月延续到 2019 年 3 月。论文的合著者包括黄一超、Daniel Forger 与 Cathy Goldstein,其中 Forger 长期做昼夜节律的数学建模,Goldstein 是睡眠医学的临床医生。

这个组合解释了库的取向。做数学建模的人关心「用尽量少的通道能不能把状态推出来」,做临床的人关心「判读这件事本身有多稳」。两端合起来,才有了这样的结构:输入端压到最窄,只有三轴加速度与一个心率数值;输出端贴到最硬,是临床多导睡眠图的判读。

它不是一家设备厂商的开放数据集,也不是一次多中心队列的副产品。它是一篇方法学论文的配套材料,被完整地整理成可下载的形态。这决定了它的优点与短板:优点是对齐干净、口径明确;短板是规模停在论文够用的水平。

角色 贡献 对数据形状的影响
提交者 设计采集应用、组织入组 输入端被压到只有三路
建模者 昼夜节律的数学建模 关心少通道能否推出状态
临床医生 睡眠医学与判读 输出端贴住临床判读

3.2 时间线

时间 事件 依据
2017-06 开始采集 官方页面采集时间说明
2019-03 采集结束 官方页面采集时间说明
2019 年 论文在 Sleep 期刊发表 期刊 DOI
2019-10-08 1.0.0 版上线 PhysioNet 官方页面版本信息
此后 未发布新版本 版本列表只有一行

版本只有一个,这意味着两件事。第一,引用时必须带 1.0.0,因为不存在「最新版」这一说。第二,页面上的任何措辞都是最终措辞,不会有人来修订——包括那些没有写清楚的字段说明。

版本事实 后果 应对
只有一个版本 不存在「最新版」 引用时写死 1.0.0
六年间无更新 措辞不会再被修订 以文件为准,不以页面为准
无变更日志 无法追溯修订 保留校验清单作为基线

3.3 采集流程:一夜,以及那一夜前后的几天

受试者先在睡眠实验室接受一夜多导睡眠监测,同时佩戴 Apple Watch。手表上运行的是作者自己写的应用,负责把加速度与心率持续读出来存到本地。判读由实验室按标准流程完成。

流程里有三个容易被忽略的细节。

第一,手表不是那一夜才戴上的。心率文件的最早一行可以早到零点之前数天,步数文件的跨度接近十天。设备在实验室访视之前就已在手腕上,积累了白天与夜间的日常数据,只是加速度没有全程保留。

第二,判读窗口与设备窗口不重合。判读从零点附近的某一格开始,到某一格结束;设备记录往往两头都更长。真正带标签的区间,是两者相交的那一段。

第三,时间的零点被定义为 PSG 开始,而不是入睡或熄灯。这个选择让所有文件共享一个绝对参照,代价是负值随处可见,任何按「第零秒开始」写的循环都会在第一步丢掉前面的数据。

流程节点 发生了什么 落在哪个文件
访视前数天 手表日常佩戴 心率与步数
实验室那一夜 多导睡眠图与手表同步 加速度与判读
天亮之后 手表继续记录 加速度尾部与步数

3.4 三层数据来源

层次 内容 由谁产生 可信度
设备层 加速度、心率、步数 手表传感器与设备内算法 取决于佩戴与电量
判读层 30 秒一格的分期 实验室判读员 高,但不可复核
派生层 睡眠效率、潜伏期等 使用者自己从判读序列算 取决于口径定义

三层的性质完全不同:设备层是机器写的,判读层是人写的,派生层是使用者写的。把三层混为一谈,是这个库最容易被误用的地方。还有一层隐含的第四层——论文里报告的模型输出,它不在库里,只存在于论文的表格中。

3.5 被排除的八个人

原始招募 39 人,最终入组 31 人。页面给出的排除理由是:4 例数据传输错误,3 例睡眠呼吸暂停,1 例 REM 睡眠行为障碍。

排除原因 人数 性质
数据传输错误 4 技术性丢失
睡眠呼吸暂停 3 临床性排除
REM 睡眠行为障碍 1 临床性排除

两类排除的含义不一样。技术性丢失是随机的,与受试者特征无关,只会减少样本量;临床性排除不是随机的,它把「有呼吸事件的人」和「有异态睡眠的人」整体移出了库。结果是这 31 夜更接近「无明显睡眠障碍的成人」,而睡眠门诊里最常见的恰恰是前者。

这条边界在做外部验证时会立刻显形:一个在有呼吸暂停人群中训练的模型,换到这份数据上,事件相关的特征全部失效;反过来,在这份数据上训练的模型,拿到门诊队列里会系统性低估觉醒。

排除类型 是否随机 丢掉的是什么 能不能补
传输错误 是 随机样本 无法补,样本量减少
睡眠呼吸暂停 否 门诊最常见的一类 需另找队列
REM 行为障碍 否 异态睡眠 需另找队列

3.6 资助与利益冲突的公开

页面上有一段不常见的声明:研究由密歇根大学运动与运动科学计划、M-Cubed 项目与一项美国国家科学基金资助;作者中有人曾因演讲收取酬金与差旅费,有人是一家昼夜节律软件公司的首席执行官,另有一位从教科书出版方获得版税。

声明项 内容 对使用的意味
资助 校方计划、校内项目、国家科学基金 研究性资金,非设备厂商赞助
演讲酬金 一位作者曾受酬 与数据本身无直接关系
企业身份 一位作者为软件公司负责人 该公司未赞助本研究
版税 一位作者从出版方获版税 与数据无直接关系

这类声明本身不改变数据的可用性,但它说明这份库是在学术规范下整理并公开的,不是厂商的公关材料。使用者仍要自己判断样本的代表性。

§4 它最独特的东西:同一夜的两种判读

4.1 判读是人的行为,不是测量

多导睡眠图常被称作金标准,这个说法容易让人误会成「机器给出了正确答案」。实际上,分期是判读员看着波形、按三十秒一格做的一次分类决定。同一段脑电,两位技师可能给出不同的结论。

sleep-accel 把这件事摆到了明面上:它提供的是判读结果,不是波形。使用者拿到的标签,是某一位判读员在某一夜的判断,权威但不绝对。这也解释了一个现象——用不同数据集训练的模型互相测试时,性能下降往往不完全来自人群差异,还来自判读习惯的差异。

参照物 含义 能回答的问题
另一台设备的输出 两个算法互相比较 谁更接近谁
临床判读 人给出的分期 设备离这位判读员多远
生理真相 不可直接观测 谁都说不上

理解了这一点,评价这份数据时就会换一把尺子:它不是在测「手表离真理有多远」,而是在测「手表离这位判读员有多远」。这两件事在方法学上是不同的。

4.2 三十秒这个数字决定了什么

粒度 能表达 不能表达
30 秒一格 AASM 的五个分期、整夜结构 秒级的觉醒、瞬时的体动
数秒一次的心率 心率的缓慢起伏 逐搏间期、呼吸性窦性心律不齐
十分钟一格的步数 白天活动量的粗略轮廓 短时活动、久坐中断

三十秒不是随便定的。它是判读规范的单位,也是所有公开睡眠数据集通用的单位。选它,意味着这份数据可以直接与 sleep-edf、isruc 这类库放在同一张表里比较;代价是,任何比三十秒更细的现象都被平滑掉了。

想研究的现象 三十秒够不够 替代做法
整夜结构 够 直接用
入睡潜伏期 勉强 以首个非清醒格近似
微觉醒 不够 需另一套事件标注
体位变化 不够 腕部单点也测不到

做特征工程时,这个粒度还会带来一个隐性约束:所有特征必须在三十秒内算完,再与标签对齐。用六十秒窗做特征时,标签只能取窗中心那一格,或者按多数投票合并两格,两种做法都会引入错位。

4.3 案例:46343 号那夜

46343 是这个库里结构最典型的一条记录,四类文件的覆盖范围各不相同,正好用来说明时间轴。

文件 起点 终点 跨度
加速度 零点前约 34.6 小时 零点后约 4.9 小时 中间跳过约 34 小时
心率 零点前约 6.4 天 零点之后 数天
步数 零点前约 7 天 零点后约 2.7 天 接近十天
判读 零点 零点后约 4.7 小时 约 4.7 小时

把这张表横着看,会得到一个重要结论:四个文件没有共同的起止点。判读只有不到五小时,加速度在中间断了三十多个小时,心率和步数则一路铺开到前后好几天。任何「按整夜对齐」的假设,都要先回答「哪一段算整夜」。

再竖着看,加速度那一段尤其值得注意。文件开头是零点前三十多小时的一小段,随后跳到零点前约二十八分钟,接着连续记录到零点后四点九小时。中间那三十多小时的空白,可能是设备没戴、可能是应用没在跑、也可能是电量耗尽——页面给了第三种解释作为一般说明,但没有针对这一条给出原因。

§4.3 的案例还说明了一件事:判读的零点与设备的零点相同,但判读的右边界比加速度的右边界早。判读在零点后约四点七小时结束,加速度却延续到四点九小时。多出来的那十几分钟没有标签,如果按加速度的长度去切窗,最后几个窗会拿到空标签。

在 §2.6 的时间轴讨论里,这个案例是「负值必须保留」的直接证据;在 §5.7 的断档检测里,它又是最好的测试样本;到 §9.2 的最短流程,它被用作第一条验证记录,因为它的四类文件齐全、体量适中、问题集中。

从案例得到的教训 具体表现 该怎么改代码
四类文件不同长 判读比加速度短十几分钟 用判读的右边界切窗
断档可达一天以上 三十多小时无采样 先差分再切窗
零点是 PSG 不是入睡 首列大量负值 不要先过滤负数

4.4 一夜能测什么,测不到什么

先列能测的六个量,每一个都落在这三路信号的能力范围内。

能测 依据 测不到 原因
睡眠与清醒的逐格判别 加速度加心率,配判读标签 呼吸事件 无气流、无血氧
三分类(清醒、NREM、REM) 同上,论文报告约七成准确率 五分类的 N1 与 N2 区分 判读本身一致性就低
入睡与起床的大致时点 判读序列的首末非清醒格 睡眠潜伏期的精确定义 熄灯时刻未记录

后三个量需要更高分辨率或另一路信号,因此只能给出粗略轮廓。

能测 依据 测不到 原因
夜间体动强度 加速度的方差变化 体位与翻身方向 腕部单点,无姿态解算
白天活动量的粗略轮廓 十分钟一格的步数 久坐行为 粒度太粗,无静止判定
心率随睡眠深度的变化 心率序列与分期对齐 心率变异性指标 只有心率数值,无逐搏

这张表的分界线可以概括成一句话:凡是「用运动和心率能推出来的」,它都给;凡是「需要另一路生理信号才能确认的」,它都不给。判断一个想法能不能落在它上面,只要问一句「这个量需要不需要呼吸或脑电」——需要,就走不通。

4.5 论文报告的那组数字

指标 数值 任务
逐格准确率 九成 清醒与睡眠二分类
特异度 约六成 真实清醒中被判对的占比
灵敏度 九成三 真实睡眠中被判对的占比
三分类准确率 约七成二 清醒、NREM、REM
跨库检验 与库内相当 迁移到 MESA 队列

这组数字里最值得琢磨的不是准确率,而是特异度。九成的总体准确率建立在样本不平衡上:夜里睡眠格远多于清醒格,只要倾向于判「睡眠」,准确率就会很高。特异度只有六成,说明模型抓到清醒的能力有限。

数字 读法 别读成
九成准确率 逐格判对的比例 模型已经可用
六成特异度 醒着时只有六成被认出 只是一点小误差
七成二三分类 加上 REM 后明显下降 五分类也能到七成

论文自己也承认了这一点,并在使用说明里提出了改进方向:现有方法逐格独立分类,会在分期序列上产生碎片化的跳变,建议引入相邻格聚类与阶段转移概率。这个建议直接指出了这份数据最适合做的一类研究:不是把单格分对,而是让整夜的结构连贯。

§5 怎么把一夜搬回本地

5.1 三条获取路径

路径 命令形态 适合 注意
网页逐文件 浏览器点击 只要一两条记录 整包二点几 GB,不建议走这条
wget 镜像 wget -r -N -c -np 整库一次拉完 -c 支持断点续传
对象存储同步 aws s3 sync --no-sign-request 反复增量更新 无需密钥

三条路径拿到的是同一批文件,差别只在断点续传与并发。若只是验证链路,先取一个受试者的四个小文件就够了:判读与步数都是几十 KB,只有加速度是几十 MB。

#-- 1. 先取清单与一个小受试者的三类小文件,总共不到 1 MB
BASE=https://physionet.org/files/sleep-accel/1.0.0
curl -sL "$BASE/SHA256SUMS.txt" -o SHA256SUMS.txt
curl -sL "$BASE/labels/46343_labeled_sleep.txt" -O
curl -sL "$BASE/steps/46343_steps.txt" -O
curl -sL "$BASE/heart_rate/46343_heartrate.txt" -O
wc -l SHA256SUMS.txt

#-- 2. 再取同一人的加速度,约 45 MB
curl -sL "$BASE/motion/46343_acceleration.txt" -O

SHA256SUMS.txt 值得先下。它给出 124 个文件的摘要,可以在下载后逐条核对,避免在大文件上出现静默截断——纯文本没有文件头,截断后仍然能解析,只是少了几行。

5.2 目录与校验

步骤 命令 检查点
核对条目数 wc -l SHA256SUMS.txt 应为 124
逐文件校验 sha256sum -c SHA256SUMS.txt 全部 OK
核对目录分布 列四个子目录 各 31 个

校验这一步在纯文本数据集上比在二进制格式上更重要。二进制文件坏了往往打不开;纯文本坏了只是少几行,读进来毫无异样。

5.3 读四类文件并拼成一张表

四类文件的分隔符不同,列名也没有,最省事的做法是分别读、分别命名,再按时间戳合并。

import pandas as pd

base = '1.0.0'
sid = '46343'

acc = pd.read_csv(f'{base}/motion/{sid}_acceleration.txt', sep=' ',
                  header=None, names=['t', 'x', 'y', 'z'])
hr = pd.read_csv(f'{base}/heart_rate/{sid}_heartrate.txt', sep=',',
                 header=None, names=['t', 'bpm'])
st = pd.read_csv(f'{base}/steps/{sid}_steps.txt', sep=',',
                 header=None, names=['t', 'steps'])
lb = pd.read_csv(f'{base}/labels/{sid}_labeled_sleep.txt', sep=' ',
                 header=None, names=['t', 'stage'])

print(acc.shape, hr.shape, st.shape, lb.shape)
print(acc.t.min(), acc.t.max())
print(lb.stage.value_counts().sort_index())

stage 那一列的取值分布会直接告诉你这一段判读里有没有 −1、有没有 4。不要假设官方页面列的六个值就是全部,文件才是准的。

5.4 对齐到三十秒

对齐的核心是把所有信号按判读的格边界分箱。判读的格起点是 0、30、60 这样的整数,直接把时间戳整除即可。

import numpy as np

#-- 以判读格为骨架,每格 30 秒
lb['epoch'] = (lb.t // 30).astype(int)

#-- 加速度按格取均方根与方差,作为体动强度的两个代理量
acc['epoch'] = (acc.t // 30).astype(int)
g = acc.groupby('epoch')[['x', 'y', 'z']].agg(['mean', 'std'])
g.columns = ['_'.join(c) for c in g.columns]
mag = np.sqrt(acc.x ** 2 + acc.y ** 2 + acc.z ** 2)
acc['mag'] = mag
m = acc.groupby('epoch')['mag'].agg(['mean', 'std'])

#-- 心率按格取均值,心率稀疏,允许整格缺失
hr['epoch'] = (hr.t // 30).astype(int)
h = hr.groupby('epoch')['bpm'].mean()

df = lb.set_index('epoch').join([g, m, h])
print(df.shape, df.isna().sum().to_dict())

做这一步时有两个坑。第一,加速度在格边界上会被切开,同一格内前后两半可能来自完全不同的状态,所以均方根比首值更能代表这一格。第二,心率不是每格都有值,直接 join 会留下空值,若用前向填充,等于把上一格的心率借给下一格,会在觉醒瞬间造出不存在的平稳。

聚合方式 好处 代价
取均方根 对半格切换稳健 丢掉峰值信息
取首值 计算最省 对边界切分极敏感
取方差 直接反映体动 静止段接近零,噪声被放大
心率前向填充 表变完整 造出虚假的平稳

5.5 造一个最小特征集

论文用的是运动特征、心率局部标准差与「时钟代理」三类输入。时钟代理指的是当前时刻在二十四小时周期里的位置——它不看信号,只看时间,却能显著提升准确率,因为人什么时候睡,本身高度规律。

特征组 输入 捕捉的是什么
运动 三轴均方根与格内标准差 翻身与体动
心率 均值与滚动标准差 自主神经的起伏
时钟代理 一天相位的正弦与余弦 作息习惯本身
import numpy as np

df = df.dropna(subset=['stage'])
df = df[df.stage.isin([0, 1, 2, 3, 5])].copy()

#-- 运动特征:三轴均方根与其格内标准差
df['motion_rms'] = df['mean']
df['motion_sd'] = df['std']

#-- 心率特征:当前格均值与前后各若干格的滚动标准差
df['hr'] = df['bpm']
df['hr_sd'] = df['bpm'].rolling(11, center=True, min_periods=3).std()

#-- 时钟代理:把秒数折成一天内的相位,取正弦与余弦
sec = df.index.values * 30
df['clock_sin'] = np.sin(2 * np.pi * (sec % 86400) / 86400)
df['clock_cos'] = np.cos(2 * np.pi * (sec % 86400) / 86400)

print(df[['motion_rms', 'hr', 'hr_sd']].describe().loc[['mean', 'std']])

滚动窗口必须按人、按夜分组做。一旦把 31 个人拼成一张长表再 rolling,前一个人的最后一格会被带进后一个人的第一格,制造出一段并不存在的平滑过渡。

5.6 断档检测:先看覆盖,再做切片

在切窗之前,先确认每一段信号到不到位。加速度断档在纯文本里就是时间戳跳变,一次差分就能暴露。

import numpy as np

t = acc.t.values
dt = np.diff(t)
gap_idx = np.where(dt > 60)[0]

for i in gap_idx:
    print('gap %.1f h at t=%.0f' % (dt[i] / 3600, t[i]))

#-- 有效采样时长:按 50 次每秒折算的总秒数
print('sampled hours %.2f' % (len(t) / 50 / 3600))
print('span hours %.2f' % ((t[-1] - t[0]) / 3600))

两个数放在一起才有意义。跨度是首末时间戳之差,有效时长是采样点数除以采样率。两者相差越大,断档越多;只报跨度会高估数据量,只报有效时长会丢掉缺口的位置。

5.7 体积与本地规划

场景 数据量 建议做法
跑通一条链路 约 50 MB 只取一个受试者的四个文件
复现论文流程 2.2 GB 整库下完,按人分批读
提取特征后建模 数十 MB 逐夜算完特征存表,原始信号不留
教学演示 约 50 MB 用 §4.3 的案例

内存不是问题,2.2 GB 解压后也不过是一部电影的大小。真正费时间的是解析。

处理方式 耗时量级 适用
默认解析器逐个读 慢 只跑一两条记录
分块读再聚合 中等 批量算特征
先转二进制缓存 快 反复实验

§6 与库内条目的关系

6.1 关系图谱

库内以睡眠为名的资源不少,但它们回答的问题几乎不重叠。判断该用哪一个,关键看三件事:标签从哪来、信号从哪来、时间跨度有多长。先看设备侧的四个。

关系 库 连接点 差异
同为腕部设备 bidsleep-dataset 都用 Apple Watch 取心率与加速度 那边标签来自干电极头带;47 人、253 夜
同为可穿戴自由生活 ltmm 都是连续佩戴的惯性信号 腰部、三天、无睡眠判读
同为加速度人群数据 minute-level-step-count-nhanes 都有加速度与步数 上万人分钟级,无 PSG
同为惯性记录 accelerometry-walk-climb-drive 都含多部位原始加速度 那边是楼梯与驾驶的短时段实验

再看临床侧的四个。它们的共同点是标签硬,共同点是都没有消费设备。

关系 库 连接点 差异
同为临床判读金标准 slpdb 标签都来自实验室判读 16 人 18 段多导信号,无腕部设备
同为分期基准 sleep-edf 都用 30 秒一格、同一套编码 纯多导睡眠图,没有消费通道
同为多通道睡眠库 cps-dataset-sleep 都含判读与分期 113 人、三十余路通道,本库只有三路
同为专家判读基准 isruc-sleep 都是整夜分期 118 例、双专家判读,无消费设备
平台同源 human-sleep-project 同在 PhysioNet 发布睡眠数据 九万余名患者,规模差三个数量级

三组最容易混的,用一句话就能分开:slpdb 问的是「人睡着时身体在做什么」,本库问的是「一只手表能不能看出人睡着了」;ltmm 在时间维度上加长,本库在判读维度上加硬;nhanes 那份步数给的是横截面的人群代表性,本库给的是纵向的个体判读精度。

对比对象 本库的做法 对方的做法 分界线
slpdb 腕部三路,一夜 十余路多导,十八段 看设备能否复现判读,还是看床旁的全部反应
ltmm 一夜,有睡眠判读 三天,有跌倒分组 判读硬度与时间长度的取舍
nhanes 步数 31 人,有逐格标签 近一万五千人,无 PSG 个体精度与人群代表性
bidsleep 参照物是临床判读 参照物是消费级头带 参照物本身是否也是被检验对象

与 bidsleep-dataset 的区别最需要说清。两者都用 Apple Watch、都以三十秒一格做分期、都按 ODC-By 开放,区别在参照物:那边的标签来自 Dreem 2 头带,那是一台消费级干电极设备,本身也是被检验对象;本库的标签来自临床多导睡眠图。要写「与临床判读比较」只能用后者,要写「多夜一致性」只能用前者。

6.2 检索路径

在站内找同族资源,按库名匹配会大面积漏掉,因为睡眠类库的命名有 sleep、psg、hypno、stage 四套习惯。按标签与主题词检索更稳。

#-- 站内粗筛:按标签取生理信号下的睡眠与可穿戴两类
bash scripts/qf_psql.sh "select record_id, url_name, left(title, 40)
  from ai_ready_dataset
  where category_tags && array['睡眠信号','可穿戴传感']
  and del_sign = 0
  order by record_id;"
#-- 判断一个睡眠库有没有设备侧原始信号:看目录里有没有加速度文件
import os

for root, dirs, files in os.walk('1.0.0'):
    acc = [f for f in files if 'acceleration' in f or 'motion' in f]
    if acc:
        print(root, len(acc))

一条通用判据:看目录结构就知道库的类型。

目录特征 库的类型 能拿到什么
labels 与 motion 并列 设备信号加判读 原始通道与标签
只有同名波形文件 纯多导库 波形与注释
只有表格 汇总数据 已加工指标

6.3 三条判据

睡眠类任务先看前三行。

你的任务 首选 次选 判据
腕部设备的分期能力 本库 bidsleep 标签是否来自临床判读
大规模分期基准 sleep-edf isruc-sleep 夜数与人群多样性
呼吸事件与睡眠结构 human-sleep-project cps-dataset-sleep 是否保留呼吸通道

不属于睡眠分期的任务看后三行。

你的任务 首选 次选 判据
老年自由生活与跌倒 ltmm 无 是否有连续多日与临床量表
人群活动量与久坐 minute-level-step-count-nhanes 无 是否有万人级代表性
有创生理信号同录 slpdb 无 是否含血压与心输出量

6.4 规模差背后的单位问题

把 31、16、113、一万五千这几个数并排放,很容易得出「本库最小」的结论。这个结论信息量很低,因为四者统计的单位不同:一个是人·夜,一个是人·段,一个是人·通道,一个是人·天。

库 统计单位 单条跨度 标签落点 由此决定的用途
本库 人·夜 一夜 每三十秒一格 单夜分期的方法学验证
slpdb 人·段 二到七小时 每三十秒一格 多通道同录的观察
cps-dataset-sleep 人·夜 一夜 每三十秒一格加事件 睡眠结构的细粒度研究
nhanes 步数 人·天 一天 每分钟 人群活动量估计

第三列与第四列一起,才决定一个库能做什么。本库的标签落点在三十秒,样本单位是人·夜,天花板就是「一夜之内的分期方法」;跨夜、跨人群、跨设备都已越出它的能力。

6.5 什么时候该放弃它

三种情形越早放弃越省时间。要脑电波形,放弃;要呼吸事件,放弃;要人群代表性,放弃。

反过来,三种情形它几乎无可替代:需要一个「消费设备信号 vs 临床判读」的干净对照;需要一份能在一节课里讲完的教学样本;需要在只有三路输入的条件下讨论特征工程的增量。

判断 情形 结论
该放弃 需要原始生理波形 换多导库
该放弃 需要人群推断 换队列数据
可以用 需要干净的设备与判读对照 首选本库

§7 质量评估与局限性

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

先纠正一个容易发生的误判:把「没有脑电波形」读成「标注质量差」。这份数据的标签来自脑电判读,只是判读的产物被留下了,过程没有。用「有没有原始波形」去衡量它,相当于用有没有厨房来评价一道菜。

第二个需要校正的误判是「31 人太少所以没用」。31 人做不了训练集,但做方法学验证够用:论文正是用这个规模报告了二分类与三分类的性能,并在另一个队列上做了一次迁移检验。

误判 校正 依据
无波形即标注差 标签来自脑电判读 官方页面说明
31 人即无用 方法学验证够用 论文报告的性能
一夜即八小时 各夜长度不一 §4.3 的案例

7.1 五维评分

按 DAIMS 的常用维度打分,每项 1 至 5 分,针对「作为腕部可穿戴睡眠分期的方法学验证数据」这个用途:

维度 分数 理由
数据规模 2 31 人、一夜,只够做验证
标注质量 4 临床判读,粒度规范,但不可复核
任务适配 4 腕部三路输入的分期任务高度适配
文档完整 3 页面讲清了来源与编码,采样率与人口学缺失
可获取性 5 免注册、体积小、纯文本、校验和齐全

五项合计 18 分(满分 25)。扣分集中在规模与文档两端:规模是设计使然,文档则是可以补的——采样率、−1 的含义、人口学字段,这三条若写清楚,文档一项可以到 4 分。

分数段 维度 怎么用这个信号
满分附近 可获取性 试错成本极低,先跑通再决定
中间 标注、适配 够用,但要自己定义口径
低分 规模 不做性能主张,只做方法学验证

7.2 标注质量的两层

第一层是判读的规范性。三十秒一格、AASM 编码、由实验室完成,这套流程在睡眠医学里是标准做法。判读质量取决于技师,而技师水平在页面没有说明。

第二层是判读的可追溯性。因为波形没公开,任何人拿到标签都无法复核某一格为什么被判成 N1 而不是清醒。如果模型在某几格上系统性出错,你无法判断是模型错了,还是判读本身处在灰区。

用途 判读层够不够 说明
二分类(清醒/睡眠) 够 灰区最少,判读一致性最高
三分类(含 REM) 够 REM 的判读一致性中等
五分类(含 N1) 勉强 N1 与清醒、N1 与 N2 的边界最模糊
事件级任务 不够 没有事件标注
判读一致性研究 不够 只有一位判读员的结果

7.3 已知的、可枚举的偏差

抽样与设计层面的偏差在前四条。

偏差 表现 影响
选择偏差 剔除呼吸暂停与 REM 行为障碍者 样本偏向无明显睡眠障碍的成人
单中心偏差 全部来自同一间实验室 环境、设备代次、判读习惯都单一
夜数偏差 每人一夜 无法区分个体差异与夜内波动
首夜效应 实验室第一夜通常睡得差 睡眠结构可能偏离居家常态

测量与口径层面的偏差在后四条。

偏差 表现 影响
设备偏差 型号代次未标明 跨代次复现缺参照
时间偏差 采集跨 21 个月 固件与系统版本可能已变化
口径偏差 页面未标采样率,文件里存在 −1 解析需以文件为准
标签偏差 单判读员、无一致性系数 灰区标签的可靠性未知

首夜效应这一条值得单独说。睡眠实验室的第一夜,受试者身上接着多根导线,睡在陌生的床上,入睡时间往往比在家晚,深睡比例往往偏低。这不是这份数据的缺陷,而是所有实验室首夜数据的共性,但它会影响任何以「居家睡眠」为目标的外推。

7.4 外部验证矩阵

验证角色 做法 讲得通的地方 风险
跨库迁移 在 MESA 上测试本库训练的模型 论文已做过一次,性能相当 两个队列的判读习惯不同
跨设备迁移 换一只其他品牌的手表 三轴加速度与心率是通用量 采样率与量程需先对齐
跨人群迁移 用到老年人或有睡眠障碍者 特征定义通用 事件相关特征全部失效
与自报睡眠对照 用分期序列比对睡眠日记 两者都覆盖整夜 自报的入睡时刻误差以半小时计
算法基准 固定切分规则比较两组特征 数据固定,可复现 切分粒度一变,排名就变

跨设备是最常见也最容易翻车的一类。本库没有公布手表的代次,也没有给佩戴松紧的说明,任何「把阈值直接搬到自家设备」的做法,都会在量程与轴向定义上出问题。

对齐步骤 做法 不做的后果
重力方向 用静止段估出重力矢量 轴向错位,特征全废
噪声底 用静止段方差标定 阈值偏高或偏低
量程 核对饱和点 强体动被截平
采样率 重采样到统一频率 频域特征不可比

还有一类验证常被忽略:时间尺度上的外推。这份数据是一夜,很多应用要的是一个月。一夜的分期能不能代表长期睡眠,它自己回答不了,只能靠另一个更长的队列。

7.5 它为何能持续:一份别人不愿意再做的对照

它从 2019 年上线至今没有更新,却仍在被下载,原因是它占着一个不容易复制的组合:同一夜的消费设备原始信号与临床判读,四类文件共用一根时间轴。新库可以更大、设备更新,但要同时凑齐这三样,需要一次完整的实验室访视与一套自建采集应用。

成本项 内容 为什么难复制
床位与人力 一夜多导睡眠监测 按夜计价,无法批量
采集应用 自建应用读取手表原始数据 厂商不提供现成接口
对齐工作 把设备时间改写到判读零点 需要逐夜核
判读 技师按三十秒一格完成 依赖有资质的实验室

这个位置不靠规模支撑,靠的是采集成本。两件事叠在一起,愿意做第二次的团队不多。

§8 生态位与历史

8.1 历史沿革

2019 年之前,可穿戴睡眠研究的主流是两条路。一条是拿厂商导出的分期结果与多导睡眠图比,算出灵敏度与特异度,结论通常停在「某设备可以接受」或「某设备不可靠」。另一条是自己做腕表式活动记录仪,用体动强度做清醒睡眠判别。

路线 输入 结论形态 缺什么
厂商结果比对 设备导出的分期 某设备可用或不可用 看不到原始信号
自建活动记录 体动强度 一个清醒睡眠阈值 没有心率

这两条路都绕开了一个问题:设备内部到底看到了什么。sleep-accel 的切入点是把两者合起来:用消费设备的手表取原始加速度,同时取它派生出的心率,再与临床判读对齐。论文的贡献不在于提出多复杂的模型,而在于证明了这条路可行。

2019 年 10 月数据上线,作为论文的配套材料公开,此后再无版本更新。

8.2 三个同族资源的对照

维度 本库 sleep-edf slpdb
信号来源 腕部消费设备 实验室多导 实验室多导
通道数 3 数路脑电与眼电 十余路含血压
人数 31 近两百 16
夜数 每人一夜 部分人两夜 每人一到两段

后四行是技术参数,也是能不能合并的直接判据。

维度 本库 sleep-edf slpdb
判读粒度 30 秒 30 秒 30 秒
采样率 约 50 次每秒 100 次每秒 250 次每秒
上线年份 2019 2000 年起 1999
主要用途 设备侧分期 通用分期基准 多通道同录

这张表最该记住的是第一行:只有本库的信号来自消费设备,其余两个都来自实验室仪器。这决定了它们的模型不能互换——在实验室脑电上训练的模型,输入维度与本库完全不同;反过来也一样。

8.3 生态位:设备侧与临床侧之间的那一格

层次 代表资源 回答的问题
实验室多通道 slpdb、cps-dataset-sleep 睡眠时身体各处发生了什么
大规模临床队列 human-sleep-project 人群层面睡眠与疾病的关系
消费设备 + 临床判读 本库 一只手表的信号能逼近判读到什么程度
消费设备 + 消费设备 bidsleep-dataset 多夜之间设备自身稳不稳
人群活动量 nhanes 步数 一般人一天动多少

五层里第三层最薄。第一层采集可控,第二层医院本来就在做,第四层设备便宜,第三层却需要一次实验室访视加一套能读原始数据的软件。

层次 供给为什么多或少 进入门槛
实验室多通道 临床常规,顺手可导出 有床位即可
大规模队列 医院数据本就留存 有合规与治理能力
设备侧加判读 两件事必须同时做 采集加开发,双份成本
消费设备互比 只要两台设备 最低

8.4 谁在用它,用来做什么

从论文与后续引用看,使用者集中在三类。

使用者 用途 拿它当什么
可穿戴算法团队 验证只有运动与心率时的分期上限 公开基线
睡眠医学研究者 讨论判读的一致性边界,尤其 N1 判读研究的材料
教学者 四类纯文本、体量小的一夜数据 课堂练习

三类用法都不指望它提供人群代表性,只指望它提供一次干净的对照。定位一旦清楚,它的局限就都可以接受。

§9 使用指引

9.1 三种角色的路径

角色 第一天 第一周 注意事项
算法研究者 读页面与一条判读文件,跑通 §5.3 复现二分类与三分类的基线 切分必须按人,不能按格
临床研究者 核对判读窗口与编码 算睡眠效率与阶段占比 首夜效应会影响外推
教学者 用 §4.3 的案例讲时间轴 让学生自己做特征与对齐 强调分隔符与负时间戳

9.2 一条最短的可用流程

#-- 1. 取一个受试者的四个文件与校验清单
BASE=https://physionet.org/files/sleep-accel/1.0.0
SID=46343
curl -sL "$BASE/labels/${SID}_labeled_sleep.txt" -O
curl -sL "$BASE/steps/${SID}_steps.txt" -O
curl -sL "$BASE/heart_rate/${SID}_heartrate.txt" -O
curl -sL "$BASE/motion/${SID}_acceleration.txt" -O

#-- 2. 先看判读文件的首末两行,确认窗口
head -3 "${SID}_labeled_sleep.txt"
tail -3 "${SID}_labeled_sleep.txt"
import pandas as pd

sid = '46343'
lb = pd.read_csv(f'labels/{sid}_labeled_sleep.txt', sep=' ',
                 header=None, names=['t', 'stage'])
print('window %.2f h' % ((lb.t.max() + 30 - lb.t.min()) / 3600))
print(sorted(lb.stage.unique()))

#-- 只保留被判读的格,再按人切分训练与测试
lab = lb[lb.stage.isin([0, 1, 2, 3, 5])]
print('scored epochs', len(lab))

跑完这两段,就走完了下载、读入、确认窗口三步。

步骤 操作 检查点
下载 取四类文件与校验清单 体积与校验和是否对得上
读入 按目录分别指定分隔符 列数是否与预期一致
确认窗口 看判读文件的首末行 时长与编码集合

剩下的工作是把同一套代码套到其余三十个人上,并且切分时以人为单位。

9.3 引用方式

引用对象 内容 说明
数据集 Motion and heart rate from a wrist-worn wearable and labeled sleep from polysomnography, v1.0.0. PhysioNet. 2019 必须带版本号
标识符 DOI 10.13026/hmhs-py35 指向 1.0.0 版
原始论文 Walch O, Huang Y, Forger D, Goldstein C. Sleep. 2019 DOI 10.1093/sleep/zsz180
代码 两个公开仓库:采集端与分类器 页面给出链接
许可 ODC-By 1.0,署名即可,含商业用途 以许可全文为准

页面把论文排在数据集之前,这个顺序意味着写方法部分时应该引论文,写数据来源时引数据集,两者不能互相替代。

§10 AI 使用声明

先是生成与来源。

项目 声明
文本生成 本文由 AI 辅助撰写,结构与事实由编辑把关
数字来源 规模、结构、边界三类数字来自官方页面与库内文件
文件核验 四个子目录的清单、许可、校验清单与若干文件首末行经直接访问确认
统计口径 采样率由时间戳间隔的中位数折算;窗口长度由判读格数乘三十秒换算

再是边界与免责。

项目 声明
未采用 未做分期频次排序、未做体动分布直方图、未做逐夜样本明细
论文信息 仅检索摘要字段,未读全文
未核验内容 判读员资质与一致性、设备代次、人口学构成、断档的具体原因
免责 本文不构成临床建议;使用须遵守 ODC-By 1.0 署名要求

常见误读(避坑清单)

关于设备与信号的说法,先纠正前五条。

说法 实际 证据
「这是 Apple 官方睡眠算法的对照集」 手表只是传感器,模型由作者训练 论文摘要与页面说明
「库里有脑电波形可以训练」 只有判读结果,无任何原始通道 四个目录中无脑电文件
「加速度覆盖整夜甚至全天」 夜间段为主,中间存在数十小时断档 时间戳差分
「心率是原始脉搏波」 是设备折算后的数值,波形未保留 心率文件只有两列
「步数是分钟级」 十分钟一格 相邻时间戳差 600 秒

关于标签与用法的说法,纠正后五条。

说法 实际 证据
「时间是当天几点」 距 PSG 开始的秒数,可为负 文件首列为负值
「睡眠编码是 0 到 5 六个值」 文件里另有 −1,页面未列 判读文件首几行
「每人有多个夜晚」 每人一夜 每目录 31 个文件,编号不重复
「31 人可以训练深度模型」 只够做方法学验证 规模与论文定位
「它与 sleep-edf 可以直接合并」 通道、采样率、设备来源都不同 两者的文件结构

FAQ

Q1:它和 Apple Watch 自带的睡眠算法是什么关系?
没有关系。分期来自实验室对多导睡眠图的判读,模型是论文作者自己训练的。手表的角色是传感器,Apple 的算法没有出现在库里的任何地方。

Q2:为什么时间戳是负数?
全库以 PSG 开始那一刻为零点。手表在进实验室之前就在记录,那一段自然是负的。心率文件最早可以到零点前数天,步数跨度接近十天。

Q3:采样率到底是多少?
页面没写。逐行核对时间戳,相邻采样间隔的中位数约 0.02 秒,折算约 50 次每秒,同时也存在约 0.01 秒的间隔。做重采样前先自己核一遍。

Q4:能拿它做五分类吗?
能算,但 N1 的判读本身就摇摆,五分类的数字会很难看。论文只做了二分类与三分类。

Q5:判读里的 −1 是什么?
页面没有列这个取值。它出现在判读窗口之前,按「未判读」处理最稳。解析时把非 0 至 5 的取值一律当作无效。

Q6:为什么加速度中间会断几十小时?
页面给的一般解释是设备电量耗尽时只保留有效采集窗口。针对某一条记录,官方没有逐条说明原因。

Q7:31 个人能得出什么结论?
能得出方法学结论:在只有三路输入时,分期大致能做到什么水平;不能得出人群结论。论文的写法也是前者。

Q8:训练集测试集怎么切?
按人切。同一位受试者的相邻格高度相关,按格随机切分会把训练集的近邻塞进测试集,准确率会虚高。

Q9:心率能不能算心率变异性?
不能可靠地算。库里只有设备折算后的心率数值,采样不等间隔,没有逐搏间期,也没有原始脉搏波形。

Q10:要不要下整库?
先下一个人的四个文件,约五十兆,跑通再说。整库解压二点几 GB,绝大部分是加速度。

Q11:引用哪一篇?
引 2019 年 Sleep 期刊那篇论文,同时著录数据集与 1.0.0 版版本号。页面把论文排在数据集之前。

Q12:它有没有呼吸事件标注?
没有。受试者里原本有睡眠呼吸暂停者,但在入组阶段就被排除了,库里也不含呼吸通道与事件标注。

术语表

先是设备与信号一侧的词。

术语 含义
sleep-accel 本库在 PhysioNet 上的项目名
光电容积脉搏波 用绿光照射皮肤、由血流变化推算心率的原理
PPG 光电容积脉搏波的英文缩写
心率 本库中为设备折算后的整数,次每分钟
三轴加速度 沿三个正交方向的加速度,单位 g
g 重力加速度单位,静止时合矢量约等于 1
体动 由加速度方差反映的身体活动
断档 时间戳跳变形成的无记录区间

再是判读与分期一侧的词,这一组决定标签怎么用。

术语 含义
多导睡眠图 同时记录脑电、眼电、肌电、呼吸等多路信号的整夜监测
PSG 多导睡眠图的英文缩写
判读 由技师按规范对整夜波形逐格给出分期
30 秒一格 判读的基本单位,与 AASM 规范一致
epoch 判读格,本库固定为三十秒
AASM 美国睡眠医学会,其判读手册是当前通用规范
N1 浅睡第一期,判读一致性最低的阶段
N2 浅睡第二期,以纺锤波与 K 复合波为标志
N3 深睡期,以慢波为主
REM 快速眼动期,肌张力最低
清醒 判读编码 0,包含闭眼清醒与体动

最后是方法、指标与许可一侧的词。

术语 含义
时钟代理 用当前时刻在一天中的相位作为特征
首夜效应 在实验室第一夜睡眠变差的现象
跨库迁移 在一个库上训练、在另一个库上测试
睡眠效率 睡着时长除以卧床时长,需自行定义口径
ODC-By 1.0 开放数据共享署名许可,允许商用需署名
DAIMS 数据与信息管理评估框架,本库按五维打分

附录 A:核心数字核对表

第一组是规模与人。

项 值 来源 来源层级
受试者数 31 官方页面受试者段 官方
原始招募数 39 官方页面受试者段 官方
排除人数 8 官方页面排除说明 官方
每人夜数 1 官方页面说明 官方
数据文件数 124 四个目录清单 文件
每目录文件数 31 目录清单 文件

第二组是格式与时间分辨率。

项 值 来源 来源层级
加速度采样间隔中位数 约 0.02 秒 时间戳差分 换算
心率间隔 数秒,不等 时间戳差分 换算
步数区间 600 秒 时间戳差分 换算
判读格长 30 秒 时间戳差分 换算
判读编码 0 至 5,另见 −1 页面与文件 官方 + 文件

第三组是版本、体积与案例换算。

项 值 来源 来源层级
解压体积 2.2 GB 官方页面文件段 官方
压缩包体积 550.1 MB 官方页面文件段 官方
版本数 1 官方页面版本列表 官方
上线日期 2019-10-08 官方页面版本信息 官方
案例判读窗口 约 4.7 小时 判读格数换算 换算
案例步数跨度 约 9.7 天 首末时间戳换算 换算

附录 B:数字的来源分层

层级 含义 本库对应内容
官方 页面明文写出 31 人、39 人招募、8 人排除、体积、许可、DOI
文件 从库内文件直接读出 124 个文件、四类列结构、编码取值、−1
换算 由文件数字计算得出 采样间隔、判读窗口长度、断档跨度
未核实 官方未说明且无法推出 设备代次、判读员资质、人口学构成

四层的可信度依次下降。前两层可以直接引用,第三层要写明换算方式,第四层只能标为未知。本文所有涉及第四层的地方都用了「未说明」或「未见」,没有替官方补全。

附录 C:完整参考文献

编号 文献 说明
1 Walch O, Huang Y, Forger D, Goldstein C. Sleep stage prediction with raw acceleration and photoplethysmography heart rate data derived from a consumer wearable device. Sleep. 2019. DOI 10.1093/sleep/zsz180 方法学论文,开放获取
2 PhysioNet. Motion and heart rate from a wrist-worn wearable and labeled sleep from polysomnography, v1.0.0. 2019-10-08. DOI 10.13026/hmhs-py35 数据本体
3 采集端代码仓库与分类器代码仓库,页面给出两个公开链接 复现所需,未逐一核对
4 同一团队关于昼夜节律与可穿戴设备的其他工作 仅作背景,未纳入核验

第 3 条的两个仓库是复现的关键,页面明确列出;本文只确认链接存在,没有逐行审阅代码。

附录 D:选库判决代码

#-- 用几个问题快速判断该不该用 sleep-accel
need = {
    '需要脑电波形': False,
    '需要呼吸事件': False,
    '需要人群代表性': False,
    '需要腕部原始加速度': True,
    '需要同夜临床判读': True,
    '需要多夜稳定性': False,
}

hard = ['需要脑电波形', '需要呼吸事件', '需要人群代表性']
blockers = [k for k in hard if need.get(k)]
if blockers:
    print('放弃,硬约束:', blockers)
elif need['需要多夜稳定性']:
    print('改用 bidsleep-dataset 这类多夜数据')
else:
    print('可用,先跑 §9.2 的最短流程')

这段判断没有技术含量,但能省掉一次白跑。三个硬约束里任意一个成立,这份数据都不适合作为主数据源。

附录 E:如果只记五件事

  1. 它是消费设备信号与临床判读的同夜对照,不是 Apple 算法的测试报告。
  2. 31 人、每人一夜,四类纯文本文件共用一根以 PSG 开始为零点的秒级时间轴。
  3. 标签是三十秒一格的判读编码,脑电波形不在库里,判读不可复核。
  4. 加速度约五十次每秒且存在数十小时断档,白天只有十分钟一格的步数。
  5. 用它做方法学验证合适,做人群结论、呼吸事件、心率变异性都不合适。

编辑说明

本篇的核验路径为:官方项目页(physionet.org/content/sleep-accel/1.0.0/,HTTP 200)、四个子目录的文件清单、许可与校验清单、以及若干文件的首末行与中段抽样;采样间隔由时间戳差分的分位数折算,判读窗口由格数乘三十秒换算。

对页面与文件不一致之处(编码取值多出 −1、采样率未标注)采取并列呈现,不做对错判定。未覆盖的内容包括:判读员资质与一致性、手表的具体代次、受试者的人口学构成、以及断档的逐条原因。

统计口径统一为:采样率取相邻时间戳间隔的中位数之倒数;窗口长度取判读首末格之差加一格;体积沿用官方页面显示值。所有分布类统计(分期频次、体动直方图、字段空值率交叉表)均未做,交由使用者在拿到数据后自行处理。


相关数据集导航

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

  • cpap-data-canterbury — 共享标签:生理信号 / 睡眠信号 / 时序数据
  • bidsleep-dataset — 共享标签:生理信号 / 睡眠信号 / 可穿戴传感 / 时序数据
  • sleep-edf — 共享标签:生理信号 / 睡眠信号 / 时序数据
  • mass — 共享标签:生理信号 / 睡眠信号 / 时序数据
  • cinc-2018-sleep-legacy — 共享标签:生理信号 / 睡眠信号 / 时序数据
  • bp-graphene-bioimpedance — 共享标签:生理信号 / 可穿戴传感 / 时序数据
  • in-gauge-and-en-gage — 共享标签:生理信号 / 可穿戴传感 / 时序数据
  • big-ideas-glycemic-wearable — 共享标签:生理信号 / 可穿戴传感 / 时序数据
  • tiles-2018-sleep — 共享标签:生理信号 / 睡眠信号 / 可穿戴传感
  • mhealth — 共享标签:生理信号 / 可穿戴传感 / 时序数据

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

返回 AI-Ready 数据集