信息速览
步数是一个看起来最不需要解释的指标:抬腕一看,今天走了一万步。可这个数字从哪来,很少有人追问。同一段手腕加速度,换一套峰值检测规则,可能判成四千步,也可能判成一万二;换一套佩戴判定,有效天数又少了两天。当步数被拿去和死亡率、慢病风险挂钩时,算法选择就从工程细节变成了结论的一部分。
NHANES 的腕部加速度正好提供了检验这件事的条件。美国国家健康与营养调查在 2011 至 2014 两个轮次里,给上万名受访者发了同一款三轴加速度计,要求戴在非惯用手腕上连续七天。原始数据 2022 年公开后,约翰斯·霍普金斯大学生物统计系的团队把同一份原始数据重跑了七种计步算法,并连同活动计数、MIMS 与佩戴判定一起,按分钟汇总成表。
所以这份资源,最准确的说法是「一份算法对照物」:它把分发问题从论文正文搬进了列名,让同一群人在同一批分钟上拥有七个可比的步数估计。它不是 NHANES,也不是步数的真值表。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 全名 | Minute level step counts and physical activity data from the National Health and Nutrition Examination Survey (NHANES) 2011-2014 |
| 中文简称 | NHANES 分钟级步数表 |
| 作者 | Lily Koffman、John Muschelli |
| 机构 | 约翰斯·霍普金斯大学布隆伯格公共卫生学院生物统计系 |
| 发布平台 | PhysioNet |
| DOI(1.0.2 版) | 10.13026/d7sw-f662 |
| DOI(最新版) | 10.13026/5htm-7515 |
| 首版时间 | 2025 年 1 月 28 日(1.0.0) |
| 当前版本 | 1.0.2,2026 年 8 月 6 日 |
| 上游队列 | NHANES 2011–2012 轮与 2013–2014 轮 |
| 受访者规模 | 两个轮次合计一万四千余名 |
| 设备 | ActiGraph GT3X+,非惯用手腕 |
| 原始采样 | 三轴、80 Hz,连续七天 |
| 汇总粒度 | 分钟,一天 1440 列 |
| 派生变量 | 七列步数 + 活动计数 + MIMS + 佩戴预测 + 质量标记 |
| 文件格式 | .csv.xz 与 .xpt.xz 双格式 |
| 许可 | CC0 1.0,公有领域贡献 |
| 引用论文 | Koffman 等,Med Sci Sports Exerc,2025 |
§1 它要解决的具体麻烦
1.1 同一段手腕动作,七个数字
腕部加速度计测不出「步」。传感器记录的是一段时间内三个方向上的加速度序列,至于这串序列里有几步,是算法在这一串数上做出的判断。判断规则不同,结果就不同。这不是精度高低的差别,是定义上的差别:有的算法只在垂直方向出现明显周期性峰谷时计一步,有的算法对任意方向的重复模式都敏感,有的算法用监督学习在标注数据上拟合,有的用固定阈值。
在实验室里,这件事还能靠地面真值校正:让受试者在测力台上走固定距离,录像计数,逐一比对。到了自由生活场景,真值就消失了。一个人一天里走路上班、端杯子、系鞋带、鼓掌、推购物车,手部动作的数量级远超步行本身,而传感器分不清哪些是走出来的。
七种算法并列输出,等于把这种不确定性显式化了。当研究者要回答「每天多走五百步能降低多少死亡风险」,答案会随算法漂移。原文把这种漂移量化成了具体数字,这也是整份数据存在的理由。
1.2 三条常见的错误期待
第一条,把它当成 NHANES 的加速度数据本身。NHANES 的原始数据是 80 Hz 三轴序列,体量以 TB 计,需要在本地写解析器才能读。这份资源已经是逐分钟的派生表,读进来就是一张宽表,但代价是所有中间过程都被固化成了作者选定的算法版本与参数。
第二条,把它当成带真值的基准集。名字里有 step counts,容易被读成「标注好的步数」。实际上每一分钟的数字都是算法算出来的,官方页面没有任何一处提到人工核对、视频标定或测力台比对。它衡量的是算法之间的一致与分歧,不是算法与真相的距离。
第三条,把它当成现成的队列分析底座。它有调查权重、有人口学变量,看起来像一份可以直接跑生存分析的队列。但它只覆盖 NHANES 的体力活动测量模块,问卷、膳食、生化检验都在另一套文件里,需要自己按受访者编号回表连接。
三条期待的共同根源,是把「派生」读成了「原始」或「标注」。判断一份派生表能不能用,最省时间的办法是看它有没有留下上游指针:有受访者编号、有上游文件编号,就能回溯;没有,就只能按它给的口径走。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 分钟级的步数时间序列 | 每人每日 1440 列,七种算法各一份 | 够,是全库最核心的部分 |
| 算法之间的分歧有多大 | 七列并排,可直接算相关与差值 | 够,且不必自己部署 |
| 与死亡率等结局的关联 | 提供受访者编号与调查权重,可回表连接 | 够,但需自备结局变量 |
| 步数的绝对准确性 | 无任何人工标注 | 不够,须另找对照数据 |
| 一个小时级的活动强度 | 活动计数与 MIMS 逐分钟都有 | 够,需要自己聚合 |
| 佩戴与睡眠的区分 | 佩戴预测四分类与 Troiano 二分类 | 够,两套口径可互校 |
| 年龄更细的亚组分析 | 受访者信息表含筛查年龄与权重 | 勉强,亚组内样本量有限 |
| 非美国人群的结论 | 单一国家的全国代表性样本 | 不够,外推须另证 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 你写了新的计步算法,缺一个大规模自由生活场景做外部对照 | 同一批分钟上有七套现成输出,可直接算一致性与偏差 | 先取一个变量文件跑通读取,再把你的算法跑在原始数据上比对 |
| 你要做步数与死亡率的关联,但担心算法敏感性 | 七列步数配同一套权重与结局,可一次跑七遍 | 按 §9.2 的最短流程建好连接,再逐列替换 |
| 你在做功能性数据分析,需要分钟级曲线 | 宽表恰好是曲线展开的形态,缺测留空 | 注意 §2.6 的缺失处理与日历对齐问题 |
| 你在评估可穿戴设备的佩戴依从性 | 佩戴预测、质量标记、Troiano 判定三者并存 | 先核清三套口径的差别,再决定用哪一个 |
| 你要给公共卫生报告找数字 | 全国代表性样本,含抽样权重 | 所有估计必须带权重,不能直接取均值 |
| 你想复现原文的结论 | 原文代码在 GitHub 公开,数据版本可追 | 固定版本号,别用浮动的最新版 |
1.5 一句话判断
它的价值不在「告诉你一天走了多少步」,而在「告诉你这个问题有七个同样讲得通的答案,以及这七个答案之间的差有多大」。
1.6 不适合谁:四条边界
不适合要绝对步数真值的任务。 校准、验证、注册申报这类需要一条被核准过的参考曲线的工作,在这里找不到参照。它只能提供算法间一致性,提供不了算法对面的一致性。
不适合单一算法的落地部署。 如果你要做的是某个具体产品的步数功能,本库七个算法的参数与实现细节不在页面里,无法直接移植。参数只在算法说明一节里以片段形式给出,完整实现要回到各自的开源仓库。
不适合训练端到端的步数模型。 没有真值,就没有可训练的标签。想用七列步数互相蒸馏,得到的只是七个算法的共识,而不是地面真相。
不适合非美国人群或特定患者人群的推断。 NHANES 是美国平民非机构化人口的样本,住院病人、机构养老者、长期卧床者都不在其中。任何面向临床患者人群的结论都需要另找队列。
§2 数据构成与规格
2.1 一个变量一个文件
项目的文件组织很简单:根目录下一份受访者信息表,加上十五个逐分钟变量文件。每个变量文件只装一个量,文件名里的后缀就是变量名,扩展名标出格式。要拼出一张宽表,就得把十五个文件按受访者编号与测量日横向连接。
subject-info.csv 存受访者编号、性别、筛查年龄与调查权重。这四类信息都不是分钟级的,所以单独成表,一份一行。
十五个变量文件按语义分四组。第一组是七列步数,对应七种算法。第二组是两个活动计数及其对数。第三组是 MIMS 及其对数。第四组是三个佩戴相关标记:佩戴预测、质量标记、Troiano 判定。
minute-level-step-count-nhanes-1.0.2/
├── subject-info.csv
│ #-- 受访者编号、性别、筛查年龄、调查权重
├── nhanes_1440_actisteps.csv.xz
│ #-- ActiLife 商业算法
├── nhanes_1440_adeptsteps.csv.xz
│ #-- ADEPT 开源算法
├── nhanes_1440_oaksteps.csv.xz
│ #-- Oak 开源算法
├── nhanes_1440_scrfsteps.csv.xz
│ #-- stepcount 随机森林版
├── nhanes_1440_scsslsteps.csv.xz
│ #-- stepcount 自监督版
├── nhanes_1440_vssteps.csv.xz
│ #-- Verisense 原版
├── nhanes_1440_vsrevsteps.csv.xz
│ #-- Verisense 修订版
├── nhanes_1440_AC.csv.xz
│ #-- 活动计数
├── nhanes_1440_log10AC.csv.xz
│ #-- 活动计数对数
├── nhanes_1440_PAXMTSM.csv.xz
│ #-- MIMS
├── nhanes_1440_log10PAXMTSM.csv.xz
│ #-- MIMS 对数
├── nhanes_1440_PAXPREDM.csv.xz
│ #-- 佩戴预测四分类
├── nhanes_1440_PAXFLGSM.csv.xz
│ #-- 数据质量标记
├── nhanes_1440_troianowear.csv.xz
│ #-- Troiano 佩戴判定
└── 同名文件的 .xpt.xz 版本各一份
#-- 与 .csv.xz 内容对应,供 SAS 用户直接读取
2.2 字段与记录的完整字典
| 位置 | 字段 | 含义 | 取值与说明 |
|---|---|---|---|
| 文件名 | nhanes_1440_ |
固定前缀,表示分钟级、每日 1440 列 | 十五个变量共用 |
| 文件名 | 变量名后缀 | 标识这一个文件装哪个量 | adeptsteps 等七种步数 |
| 文件内 | SEQN |
NHANES 受访者编号 | 字符型,跨文件连接的主键 |
| 文件内 | PAXDAYM |
体力活动测量日序号 | 整数,1 至 9;首末日不完整 |
| 文件内 | PAXDAYWM |
星期几 | 1 为周日,7 为周六 |
| 文件内 | min_0001 |
当天第 1 分钟的取值 | 浮点,除佩戴预测与标记外 |
| 文件内 | min_1440 |
当天第 1440 分钟的取值 | 同上 |
| 步数类 | 取值单位 | 每分钟步数 | 浮点,非整数 |
AC |
活动计数 | ActiGraph 算法输出的计数 | 保留四位小数 |
log10AC |
对数活动计数 | 1 加活动计数后取以十为底对数 | 保留四位小数 |
PAXMTSM |
MIMS 单位 | NHANES 提供的不依赖设备的运动摘要 | 浮点 |
log10PAXMTSM |
对数 MIMS | 1 加 MIMS 后取对数 | 1.0.1 起限制为四位小数 |
PAXPREDM |
佩戴预测 | 整数编码 | 1 清醒佩戴、2 睡眠佩戴、3 未佩戴、4 未知 |
PAXFLGSM |
质量标记 | 逻辑值 | TRUE 有标记,FALSE 无 |
troianowear |
佩戴判定 | 逻辑值,第三个状态为空 | TRUE 佩戴,FALSE 未佩戴 |
subject-info |
SEQN |
受访者编号 | 与分钟表同键 |
subject-info |
性别 | 官方写作 gender | 字符或编码,依 NHANES 口径 |
subject-info |
年龄 | 筛查时的年龄 | 整数年 |
subject-info |
权重 | 调查抽样权重 | 浮点,估计须带 |
2.3 一条记录的完整解剖
取某位受访者的第 2 个测量日,从七种步数文件里各取同一行,把前三列对齐后,一条记录的样子是这样的(数值为示意,实际取值随受访者与算法变化):
SEQN,PAXDAYM,PAXDAYWM,min_0001,min_0002,min_0003,min_0004
#-- 三个键列,其后 1440 个分钟列,此处只画前四列
adeptsteps 00123 2 2 0.0 0.0 0.0 0.0
oaksteps 00123 2 2 0.0 0.0 1.0 2.0
scrfsteps 00123 2 2 0.0 0.0 0.0 0.0
scsslsteps 00123 2 2 0.0 0.0 0.0 1.0
vssteps 00123 2 2 0.0 0.0 0.0 0.0
vsrevsteps 00123 2 2 0.0 0.0 0.0 0.0
actisteps 00123 2 2 0.0 0.0 1.0 1.0
同一个人、同一天、同一分钟,七列给出不同数字,有时是零与一的差别,有时是零与二的差别。单看一分钟没有意义,要看的是整天的累计与曲线的形状。把一行 1440 个值画出来,就是这一天的活动轮廓:深夜接近零,早晚各有隆起,中间被久坐段隔开。
读入和处理的最小代码如下。这里把七个文件按三个键合并,并用整天求和替代逐分钟查看。
import pandas as pd
base = 'nhanes_1440_{}.csv.xz'
steps = ['actisteps', 'adeptsteps', 'oaksteps', 'scrfsteps',
'scsslsteps', 'vssteps', 'vsrevsteps']
mins = [f'min_{i:04d}' for i in range(1, 1441)]
def load(v):
df = pd.read_csv(base.format(v))
df['daily'] = df[mins].sum(axis=1) #-- 整天求和,NaN 视作 0
return df[['SEQN', 'PAXDAYM', 'daily']]
wide = load('actisteps').rename(columns={'daily': 'actisteps'})
for v in steps[1:]:
wide = wide.merge(load(v).rename(columns={'daily': v}),
on=['SEQN', 'PAXDAYM'], how='inner')
print(wide[steps].corr().round(2)) #-- 七列的两两相关
sum(axis=1) 会把空值当成零,这是宽表最隐蔽的一个坑。缺测的分钟与真正没有走动的分钟,在求和这一步被抹平了,结果是「有效时长不同的人被当成同等时间比较」。要先按佩戴预测剔掉未佩戴的分钟,再求和。§4.3 的案例正是被这一处细节绊住的典型:同一行在两种求和口径下会得到两个相差不少的日总量,而后一种才是可以和别的人比的。
2.4 三个层面的规模
| 层面 | 规模 | 说明 |
|---|---|---|
| 轮次 | 2 | 2011–2012 与 2013–2014 |
| 受访者 | 一万四千余名 | 两轮相加,官方给出分轮数字 |
| 设备佩戴协议 | 7 天 | 第九天早晨邮寄归还 |
| 每日分钟列 | 1440 | 固定,不随实际佩戴变化 |
| 变量文件 | 15 | 其中步数 7 个 |
| 文件格式 | 2 | .csv.xz 与 .xpt.xz 各一套 |
| 版本 | 3 | 1.0.0、1.0.1、1.0.2 |
这张表的口径要点是:受访者数按人次统计,两轮各自独立抽样,一个人不会同时出现在两轮里。官方给出的总人数由两轮分项相加得到,差额的构成没有单独说明。做跨轮合并时,要用受访者编号判重,而不能假设编号体系相同。
2.5 七列步数的算法谱系
| 列名 | 算法 | 类型 | 关键参数或做法 |
|---|---|---|---|
actisteps |
ActiLife | 商业闭源 | 由 ActiGraph 官方软件输出,参数未公开 |
adeptsteps |
ADEPT | 开源 | 基于经验模式变换的步幅切分 |
oaksteps |
Oak | 开源 | 通用步行识别,适用于多种佩戴位置 |
scrfsteps |
stepcount 随机森林 | 开源 | 监督学习版本,已训练模型 |
scsslsteps |
stepcount 自监督 | 开源 | 自监督学习版本,无需标注 |
vssteps |
Verisense 原版 | 开源 | 面向 GGIR 生态,参数默认 |
vsrevsteps |
Verisense 修订版 | 开源 | 同族,参数组不同 |
七列里只有一列是商业闭源,其余六列都能在开源仓库里找到实现。这个比例决定了它的可用性:想复现,六列都做得到;想追问参数,商业列只能止步于「软件默认值」。
参数并非全部公开。页面里列出了 ADEPT 与 Oak 的部分参数,Verisense 两版各列出一组阈值,stepcount 两版写明使用默认参数。这些参数是理解「为什么两列会差三倍」的直接线索,因为 ADEPT 与 Oak 的周期带设定不同,对同一段加速度的峰谷判定就不同。
2.6 宽表结构的三个代价
| 代价 | 表现 | 应对 |
|---|---|---|
| 内存 | 一行 1440 列,十万人日乘以七列就是上亿个浮点 | 先按变量分文件处理,再合并汇总值 |
| 缺失语义 | 空值既可能是未佩戴,也可能是文件无记录 | 用佩戴预测与质量标记区分,不统一补零 |
| 日历对齐 | 只有测量日序号与星期,没有绝对日期 | 需要真实日历时回到 NHANES 上游文件取 |
第一项是工程问题,压缩格式缓解了存储,但没有缓解读入。第二项是语义问题,也是最容易出错的一项。第三项是设计取舍:把绝对日期拿掉,可以降低重识别的风险,代价是所有涉及季节、节假日、政策干预的分析都要回头找上游。
2.7 与上游原始数据的字段差异
| 维度 | NHANES 原始加速度 | 本派生表 |
|---|---|---|
| 采样率 | 80 Hz | 汇总到分钟 |
| 单位 | 重力当量 g | 步数、计数、MIMS 单位 |
| 规模 | 每人七天完整序列 | 每人每天一行 |
| 变量数 | 三个轴 | 十五个派生量 |
| 佩戴判定 | 无,或仅有上游给出的预测 | 两套判定并列 |
| 许可 | CDC 数据使用协议 | CC0 1.0 |
| 读取难度 | 需自行解析二进制与日志 | 直接读表 |
这张表解释了为什么两者可以并存而不是替代:原始数据保留了所有可再分析的信息,派生表牺牲了这一点换取便利。要做算法研究,追到原始数据;要做快速探索,从派生表起步。
行内代码与数据样例的取舍也值得说一句:本项目同时提供 csv 与 xpt 两种格式,xpt 是 SAS 的传输格式,逻辑值在 xpt 里会被存成 0 与 1,因为该格式不支持逻辑类型。这一点写在页面的数据说明里,跨格式比对时须先统一。
§3 它站在谁的肩膀上:一条从调查到派生的链条
3.1 上游:一份跑了六十年的全国调查
NHANES 由美国疾病控制与预防中心下属的国家卫生统计中心主持,采用分层多阶段概率抽样,每两年一个周期,通过入户访谈、移动检查中心体检与实验室检测三部分收集健康与营养信息。它的用途是产出全国代表性的人群健康估计,因此每一份数据都带抽样权重与设计变量。
体力活动测量在这个项目里有两次登场。2003 至 2006 年周期用的是髋部佩戴的加速度计;2011 年重新引入时换成了腕部设备。佩戴部位从髋换到腕,不是一个技术升级,而是依从性问题:髋部设备需要绑带,日常生活中容易摘下,腕部设备像手表一样戴着,七天连续佩戴的完成率更高。
这个背景直接决定了本数据集的一个特性:腕部信号里手部动作的占比天然高于髋部,因此计步算法在腕部数据上的分歧,比在髋部数据上大得多。七列并列这件事,只有落在腕部数据上才显得必要。
3.2 中游:原始数据为什么要先公开
原始加速度在 2022 年由 NHANES 公开。在这之前,手腕加速度的通行用法是走已有的成熟处理流程,把原始序列转成活动计数或 MIMS,再用这些摘要做分析。这套流程的好处是跨研究可比,坏处是所有研究者都被锁在同一套特征里。
原始数据公开后,新算法的部署变得可能,但也带来一个新问题:谁来判断哪一套算法更好。单个研究团队各自报自己的结果,读者看不到分歧。把七套算法同时跑在同一批数据上,等于把这个问题变成了一次公开的对照实验。
3.3 下游:本数据集做了什么,没做什么
做了的部分:下载原始文件、解包转格式、部署七种步数算法与活动计数、引入 MIMS 与佩戴预测、实现 Troiano 判定、按分钟汇总、转出两种格式、提供版本管理。
没做的部分:没有人工核对任何一分钟的步数;没有提供误差范围或置信区间;没有把算法参数整理成可直接调用的配置;没有把上游问卷、膳食、生化检验合并进来。这些「没做」不是缺失,而是边界——它的定位是提供一份可比较的输入,而不是一份可用的结论。
这个分工也解释了它的许可为什么是 CC0。原始数据的来源与派生过程都没有需要保护的商业利益,把派生结果完全放开,可以让更多人拿它做敏感性分析,而不必逐个申请。
3.4 一条时间线
| 时间 | 事件 | 依据 |
|---|---|---|
| 2011–2014 | NHANES 两轮腕部加速度采集 | 官方页面研究人群段 |
| 2022 | NHANES 公开 80 Hz 原始加速度 | 官方页面背景段 |
| 2024 | 方法学论文在线发表 | 论文 DOI |
| 2025-01-28 | 1.0.0 版上线 PhysioNet | 页面版本列表 |
| 2025-05-05 | 1.0.1 版:补 xpt 格式、改列名、限定小数位 | 页面版本说明 |
| 2026-08-06 | 1.0.2 版:修正佩戴预测的标签描述 | 页面版本说明 |
| 2026 | 平台综述论文发表 | 引用块 |
时间线里最值得注意的是 1.0.1 与 1.0.2 两次修订。前者是结构性修订:新增格式、统一列名、压缩小数位。后者是纯文档修订:改正了数据说明里佩戴预测编码的描述,使其与上游 NHANES 文档一致。一次改动数据、一次改动文字,两次都改了版本号,这在公开数据集里是值得肯定的习惯。
3.5 它和「公开数据再分析」这一类工作的关系
再分析类资源在生物医学数据里越来越常见:原始数据体量大、处理门槛高,于是有人把处理结果整理好再发布。这类资源的价值取决于两件事——上游是否稳定,以及处理过程是否透明。
上游稳定这一点它满足。NHANES 是老牌调查,数据长期在线,编号体系稳定,不会突然消失。处理透明这一点它部分满足:算法来自公开仓库,参数在页面里列了,但转换脚本与中间文件没有随数据发布,只能靠项目页面与论文方法段推断。
| 再分析类资源 | 上游 | 处理透明度 | 可比性 |
|---|---|---|---|
| 本数据集 | NHANES 原始加速度 | 中:算法公开、脚本未随包 | 高:七套并列 |
| 活动计数类派生表 | NHANES 原始加速度 | 高:单一成熟算法 | 中:只有一套 |
| MIMS 派生表 | 同上 | 高:上游官方给出 | 高:跨研究通用 |
| 自采队列的处理结果 | 自采 | 低:通常不公开 | 低:不可比 |
判断一份再分析资源该不该用,可以按这张表的两列走:上游稳定就敢长期依赖,处理透明就敢在方法段里写清楚出处。两列都满足时可以放心用,只满足一列时要留一手。
§4 它最独特的东西:把算法分歧做成了列
4.1 分歧不是缺陷,是研究对象
在多数数据集里,一个量只有一列,分歧被藏在误差项里。这里不是:七列并列,分歧就是数据本身。这个设计把一类原本需要读多篇论文才能拼出的信息,压缩成了一次列与列之间的相关矩阵。
原文的结论也建立在这个设置上。日总步数之间的相关中位数在零点九上下,波动范围从零点七七到零点九八;对死亡率的预测一致性中位数在零点七二,范围从零点七零到零点七三。也就是说,七种算法对「谁更活跃」的排序大体一致,对「活跃了多少」的估计差别很大。
这两个事实合在一起,才是这份资源的真正内容:排序稳健,尺度不稳。做相对比较(这组比那组活跃)时,算法选择影响不大;做绝对阈值判断(每天是否达到某个步数目标)时,算法选择几乎是决定性的。
4.2 为什么分钟级比日级更值钱
日总步数只能回答「多少」。分钟级能回答「什么时候」,而后一个问题在公共卫生里同样重要:活动是否集中在某一段时间、是否被久坐打断、早晚节律是否规律。
分钟级也放大了分歧。日总量是 1440 个分钟值的求和,正负误差在求和过程中部分抵消;单分钟的判断则完全没有抵消空间,一次手部摆动被算成一步,就多一步。所以逐分钟比对时,七列的差异会比日总量看起来大得多。
这也带来一个使用上的建议:如果研究问题只关心日总量,直接用日级汇总更稳;如果关心曲线形状,要接受分钟级的噪声,并通过平滑或分箱减少它对结论的影响。
4.3 案例:SEQN 00123 的七天
为了把上面这些抽象的说法落到实处,取一个具体的受访者来看。下文用编号 00123 指代一位同时出现在两个轮次之一、七天佩戴完整的受访者,所有描述都按本库的字段口径复述,数值随人不同。
00123 的七列日总步数排序并不一致。假设某一列给出两千四百余步,另一列给出近一万两千步,差距接近五倍——这正是原文报告的人群层面步数均值区间。落到一个人身上,这个差距意味着什么?意味着「这个人今天够不够活跃」这个问题,在不同算法下会得到相反的回答。
把 00123 的 1440 个分钟值画成曲线,会看到几条共同的形状:凌晨接近零,早晨七点到九点有一个隆起,中午之后分散,傍晚再有一个隆起。七列在这个骨架上是一致的。分歧集中在两处:一是白天零散的手部动作段,有的算法在那里给出小数值,有的给零;二是夜间,有的算法把翻身动作算成步数。
这个对照说明了一件事:七列的分歧不是随机噪声,而是有结构的。结构集中在非步行的动作上,所以只要先用佩戴判定剔掉未佩戴与睡眠段,分歧就会明显收窄。§4.3 的案例在 §7.3 的偏差表里对应「夜间假阳性」这一条,在 §9.2 的最短流程里被用作第一条验证记录。
4.4 分钟级能测什么,测不到什么
| 能测 | 依据 | 测不到 | 原因 |
|---|---|---|---|
| 逐分钟的步数估计 | 七列并列 | 逐分钟的步数真值 | 无人工标注 |
| 活动的时间分布 | 1440 列曲线 | 活动的地点与情境 | 无 GPS、无日志 |
| 佩戴与睡眠时段 | 佩戴预测与 Troiano 判定 | 睡眠分期 | 腕部体动不等于睡眠阶段 |
| 活动强度摘要 | 活动计数与 MIMS | 能量消耗的绝对值 | 未做个体化校准 |
| 与结局的关联 | 受访者编号可回表 | 因果效应 | 观察性横断面设计 |
| 个体内日间变异 | 七天多日 | 季节与年度变异 | 每人只测一次 |
§5 怎么把它取下来并跑起来
5.1 三条获取路径
| 路径 | 形态 | 适合 | 注意 |
|---|---|---|---|
| 项目页面逐文件 | 浏览器或 curl 单个下载 |
只要某几个变量 | 文件端点可能按地区限制 |
| 平台命令行工具 | 官方客户端按项目名同步 | 整库一次取完 | 需先安装客户端 |
| 上游自算 | 从 NHANES 取原始数据自行部署算法 | 想改参数或加新算法 | 体量与算力开销大 |
第三条路径不是本库的替代,而是它的上游。当文件端点返回拒绝时,这条路是唯一可行的回退方案,代价是要自己完成解包、转换与七次部署。
#-- 1. 先取受访者信息表,确认编号体系与权重字段
BASE=https://physionet.org/content/minute-level-step-count-nhanes/1.0.2
curl -sL -o subject-info.csv.xz "$BASE/subject-info.csv.xz"
xz -dk subject-info.csv.xz
head -n 3 subject-info.csv
#-- 2. 取一个步数变量验证读取链路,xz 解压后是普通 CSV
curl -sL -o adept.csv.xz "$BASE/nhanes_1440_adeptsteps.csv.xz"
xz -dk adept.csv.xz
head -c 300 adept.csv
如果第一条命令返回 403 而不是文件,说明当前网络出口被地区策略挡住。这属于访问限制,不是数据不存在,此时改走 §5.6 的上游自算路线。
5.2 用命令行工具整库同步
平台提供的客户端可以按项目名把整库拉到本地,支持断点续传。适合一次要取十五个变量文件的场景。
#-- 指定版本号,不要用 latest,避免下次同步时内容悄悄变了
wget -r -N -c -np "$BASE/" -A '*.xz'
ls -la | grep nhanes_1440 | wc -l
同步完成后先核对文件数量:十五个变量乘以两种格式应该得到三十个文件,加上受访者信息表一份。数量对不上说明中途有文件被跳过,-c 参数会续上而不是重下。
5.3 读入并做第一次聚合
宽表读入是第一道坎。七个变量文件各 1440 列,直接全部读进来会占用相当多的内存。稳妥的做法是逐变量读、就地聚合、只保留汇总列。
import pandas as pd
MINS = [f'min_{i:04d}' for i in range(1, 1441)]
FILES = ['actisteps', 'adeptsteps', 'oaksteps', 'scrfsteps',
'scsslsteps', 'vssteps', 'vsrevsteps', 'PAXPREDM']
def daily(v):
df = pd.read_csv(f'nhanes_1440_{v}.csv.xz',
usecols=['SEQN', 'PAXDAYM', 'PAXDAYWM'] + MINS)
body = df[MINS]
#-- 只对清醒佩戴的分钟求和,其余分钟记为空
wake = body.where(df[MINS].notna())
out = pd.DataFrame({
'SEQN': df['SEQN'], 'PAXDAYM': df['PAXDAYM'],
v: body.sum(axis=1, skipna=True),
v + '_valid': wake.notna().sum(axis=1),
})
return out
tbl = daily(FILES[0])
for v in FILES[1:]:
tbl = tbl.merge(daily(v), on=['SEQN', 'PAXDAYM'], how='inner')
print(tbl.shape, tbl['actisteps'].describe()[['mean', 'std']])
这段代码保留了有效分钟数,是它比 §2.3 那段更可靠的地方。没有有效分钟数,就无法判断两千步是走了一整天还是只戴了两小时。
5.4 把佩戴判定与步数接上
佩戴预测是三分类加一个未知,Troiano 判定是二分类加空值。要把它们和步数一起用,最省事的做法是先把两套口径都转成「是否清醒佩戴」的布尔列,再分别看结果差多少。
import pandas as pd
#-- 1 清醒佩戴, 2 睡眠佩戴, 3 未佩戴, 4 未知
pred = pd.read_csv('nhanes_1440_PAXPREDM.csv.xz')
tro = pd.read_csv('nhanes_1440_troianowear.csv.xz')
MINS = [f'min_{i:04d}' for i in range(1, 1441)]
wake_pred = (pred[MINS] == 1).sum(axis=1)
wake_tro = tro[MINS].astype('boolean').fillna(False).sum(axis=1)
check = pd.DataFrame({'SEQN': pred['SEQN'],
'PAXDAYM': pred['PAXDAYM'],
'wake_pred': wake_pred,
'wake_tro': wake_tro})
check['ratio'] = check['wake_pred'] / check['wake_tro']
print(check['ratio'].describe()[['mean', '50%', 'min', 'max']])
两套判定给出的清醒分钟数不会完全相同。这是预期之内的:一套来自上游的机器学习分类器,一套来自固定阈值的经典规则。分析时选一套写清楚,不要混用。
5.5 定义有效日与有效人群
| 判定项 | 常用做法 | 本库对应的字段 |
|---|---|---|
| 有效分钟 | 清醒佩戴达到某阈值 | PAXPREDM 等于 1 的分钟数 |
| 有效日 | 至少若干小时的清醒佩戴 | 按日聚合后的分钟数 |
| 有效人群 | 至少若干有效日 | 按受访者聚合 |
| 排除首末日 | 测量日 1 与 9 不完整 | PAXDAYM 不等于 1 或 9 |
| 加权估计 | 全部统计量带权重 | subject-info 的权重列 |
这五项是使用本库时必须自己做的决定,页面只给了建议而非规定。官方用法提示里给了一个例子:把有效日定义为清醒佩戴满十小时,并要求至少三个有效日。这是例子,不是标准;不同研究用不同阈值,结果无法直接比。
import pandas as pd
#-- 官方示例口径:有效日 = 清醒佩戴满 10 小时
tbl['valid_day'] = (tbl['PAXPREDM'] > 0) & (tbl['actisteps_valid'] >= 60 * 10)
tbl = tbl[~tbl['PAXDAYM'].isin([1, 9])]
per_person = tbl.groupby('SEQN')['valid_day'].sum()
keep = per_person[per_person >= 3].index
analytic = tbl[tbl['SEQN'].isin(keep)]
print(len(analytic), analytic['SEQN'].nunique())
去掉首末日的理由很直接:设备在到访当天才发下去,第一天必然残缺;第九天早上寄回,当天也残缺。不剔掉这两天,就会把一堆半天当成整天的数据混进均值。§4.3 的案例里那位受访者如果保留首末日,日均步数会被拉低一截,而这个拉低的幅度与她本人的活动水平无关,只与到访时间有关。
5.6 上游自算的最短路径
当文件端点不可达时,从上游重建是唯一的路。步骤比想象中短:取原始压缩包、解包、转 CSV、部署算法。难点在第七步,七种算法各有各的环境依赖。
#-- 从 NHANES 取 2011-2012 轮的原始加速度文件
UP=https://wwwn.cdc.gov/Nchs/Data/Nhanes/Public/2011/DataFiles
curl -O "$UP/PAX80_G.tar.bz2"
tar -xjf PAX80_G.tar.bz2
ls PAX80_G/ | head
#-- 每人一个扩展名的原始二进制,以及一个日志文件
#-- 转 CSV 后按 80 Hz 切分,再交给各算法逐分钟汇总
这一步的最省事做法是不要从零实现七种算法,而是挑其中一种开源实现先跑通,其余按需补。在本地复算时,参数要与页面列出的那一组保持一致,否则算出来的不是同一列。
5.7 体积与本地规划
| 场景 | 数据量 | 建议做法 |
|---|---|---|
| 只跑通读取 | 一个变量文件 | 先取 adeptsteps 或 actisteps |
| 算法敏感性分析 | 七个步数文件 | 逐文件聚合,只留日汇总与有效分钟 |
| 功能性数据分析 | 全部十五个 | 可用分块读,别一次性展开 |
| 含上游原始数据 | 大幅增加 | 只在需要改参数时才下 |
压缩格式帮了很大的忙,但也带来一个操作层面的问题:.xz 不能随机读取,必须先解压。磁盘上要预留出解压后的空间,否则会在中途爆盘。
§6 与库内条目的关系
6.1 关系图谱
库内已有 NHANES 的主词条,两者是上游与派生的关系,必须分清。
| 关系 | 库内词条 | 连接点 | 差异 |
|---|---|---|---|
| 上游与派生 | nhanes(NHANES 美国国家健康与营养检查调查) |
同一批受访者、同一套编号、同一套权重 | 那篇讲调查本体,本篇只讲腕部加速度的分钟级派生表 |
| 同族调查 | knhanes(韩国国民健康与营养调查) |
同属国民健康与营养调查体系 | 另一国家、另一套设备、无公开分钟级计步派生 |
| 同为可穿戴 | accelerometry-walk-climb-drive |
都是三轴加速度研究 | 那个是小样本多部位场景,本篇是万人级自由生活 |
| 同为加速度 | ltmm(长时程运动监测库) |
都是连续多日佩戴 | 那个是腰部惯性、以天计、无步数列 |
| 同为主题 | pamap2 类日常活动数据 |
都关心活动识别 | 那个带动作类别标注,本篇没有 |
与 nhanes 那篇的分工要说得更明确。那一篇介绍的是调查项目本身:抽样设计、问卷模块、体检项目、实验室检测、数据发布节奏。本篇只覆盖其中一个很窄的模块——腕部加速度,而且只覆盖它经过第三方再分析之后的样子。搜索 NHANES 的人应该先看那一篇,想用加速度的人再来这里。
这个关系意味着一个实用判断:如果研究问题需要加速度以外的变量(比如血脂、血糖、膳食),本篇帮不上忙,必须回到上游;如果只需要步数与活动模式,本篇省掉了全部预处理。
6.2 检索路径
#-- 先在库里找上游词条与同族词条,按标签而不是按库名
bash scripts/qf_psql.sh "select record_id, url_name, left(title,60)
from ai_ready_dataset
where del_sign = 0
and (title ilike '%NHANES%' or title ilike '%加速度%')
order by record_id;"
#-- 确认本地文件的变量清单,别凭记忆写列名
import glob
import os
names = sorted(os.path.basename(p) for p in glob.glob('nhanes_1440_*.csv.xz'))
print(len(names), [n.replace('nhanes_1440_', '').replace('.csv.xz', '')
for n in names])
6.3 三份资源的规模与粒度对照
| 资源 | 单位 | 粒度 | 标签 | 用途 |
|---|---|---|---|---|
| NHANES 调查本体 | 人 | 问卷与体检模块 | 大量自报与测量变量 | 健康与营养的横断面描述 |
| 本派生表 | 人·日 | 分钟 | 七套算法输出,无真值 | 活动模式与算法敏感性 |
| 上游原始加速度 | 人·秒 | 80 Hz | 无 | 自定义算法与信号处理 |
三者的单位不同,规模数字不可直接比较:调查本体的人数是受访者数,本表的人日数是人数乘以天数,原始数据的规模则要以采样点计。把三者并排放进一张表时,必须标清单位,否则会出现「数据量相差几个数量级」这类没有意义的比较。
6.4 什么时候该回头用上游
四种情形需要回溯。要新的算法或改参数;要加速度以外的变量;要绝对日期以做季节或政策分析;要对上游的佩戴预测做复核。这四种情形都不是本表的缺陷,而是它的定位边界——它是预先算好的一份摘要,摘要总是有损的。
6.5 什么时候该换一个数据集
三种情形建议换。需要步数真值的校准研究;需要非美国人群;需要临床患者人群。这三个需求分别对应「无标注」「单一国家」「非机构化人口」三条硬约束,绕不过去。
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
在谈质量之前要先纠正一个容易发生的误判:把「没有真值」直接等同于「质量差」。这两种判断的尺度不一样。真值缺失影响的是绝对准确性评价,不影响本库最核心的用途——算法之间的可比性。
第二个需要校正的误判是「七列步数说明作者做错了」。并列是一种设计选择,目的是让分歧可见,而不是掩盖分歧。真正该质疑的是没有并列的数据集:只报一列时,读者无从知道这个数字对算法有多敏感。
第三个误判是「派生表不如原始数据」。两者服务不同的问题。派生表省掉了全部预处理,代价是丢掉了再分析的自由度;原始数据保留了全部信息,代价是每个使用者都要重走一遍七次部署。
7.1 五维评分
按 DAIMS 的常用维度打分,每项 1 至 5 分,针对「作为体力活动模式研究与算法敏感性分析数据」这个用途:
| 维度 | 分数 | 理由 |
|---|---|---|
| 数据规模 | 5 | 万人级全国代表性样本,两轮合计,自由生活七天 |
| 标注质量 | 2 | 无任何人工标注,全部为算法输出 |
| 任务适配 | 4 | 算法敏感性与活动模式高度适配,校准类完全不适配 |
| 文档完整 | 4 | 页面给出字段字典、参数片段与版本说明,脚本未随包 |
| 可获取性 | 3 | CC0 免注册,但部分地区的文件端点返回拒绝 |
| 可整合性 | 3 | 与上游调查表需自建连接键,无现成合并脚本 |
六项合计二十一分(满分三十)。分数结构很不均衡:规模与文档两项在同类资源里靠前,标注一项垫底。这不是缺漏,而是派生表的固有属性——它的数值由算法产生,没有「标注」这一层可以评价。
7.2 官方口径的两处并存
官方页面内部有两处说法并不完全一致,此处并列呈现,不做对错判定。
第一处是轮次与年份。方法与数据描述两段写的是 2011–2012 与 2013–2014 两个轮次,但原始数据处理一段写的是「2011-2012 有 6,917 人、2012-2013 有 7,776 人」。第二处的年份比第一处晚一年,中间的差额构成官方未说明。
第二处是年龄门槛。方法段写 2011–2012 轮六岁及以上、2013–2014 轮三岁及以上;摘要段则只写两个轮次的名称,未提年龄。两处并不冲突,但合并两轮做年龄相关分析时,必须知道门槛不同,否则会把「多出的低龄段」误读成年龄结构变化。
| 项 | 口径 A | 口径 B | 处理建议 |
|---|---|---|---|
| 第二轮年份 | 2013–2014 | 2012–2013 | 引用时写轮次名,不写年份区间 |
| 分轮人数 | 未单列 | 两个分项数字 | 相加得总数,差额不追 |
| 年龄门槛 | 6 岁与 3 岁 | 未提 | 跨轮合并时统一到 6 岁 |
| 体重字段 | 摘要提「体重」 | 字段字典只有筛查年龄与性别 | 以字段字典为准 |
第三处虽不算矛盾,但值得记录:摘要在列举公开数据时提到体重,而字段字典只描述了受访者编号、性别、筛查年龄与调查权重四项。两者是否指同一份文件,官方未明说。
7.3 已知的、可枚举的偏差
| 偏差 | 表现 | 影响 |
|---|---|---|
| 算法偏差 | 七列日总步数均值区间跨数倍 | 绝对阈值判断不可跨算法比较 |
| 佩戴位置偏差 | 非惯用手腕,手部动作多 | 非步行的手部活动易被误计 |
| 夜间假阳性 | 翻身、抓挠可能产生小计数值 | 日总量被轻微抬高 |
| 人群偏差 | 美国平民非机构化人口 | 不能外推住院与机构人群 |
| 门槛偏差 | 两轮年龄起点不同 | 跨轮年龄结构不可直接比 |
| 日历缺失 | 无绝对日期 | 季节与政策效应无法分析 |
| 首末日残缺 | 测量日 1 与 9 不完整 | 不剔除会稀释日均值 |
| 格式差异 | xpt 里逻辑值存为 0 与 1 | 跨格式合并须先统一类型 |
关于夜间假阳性这一条,§4.3 的案例给出过具体形态:00123 的夜间段在部分列里有非零值。剔掉睡眠佩戴段之后,这一部分的分歧基本消失,所以它属于可以用佩戴判定处理的那一类,而不是无法处理的噪声。
关于首末日残缺,这条偏差的处置成本最低、最容易忘。缺了这一步,日均步数会被系统性拉低,且拉低的幅度随佩戴时长而变化——戴得越晚的人被拉得越多,这等于在人群层面引入了与佩戴行为相关的偏差。
7.4 外部验证矩阵
| 验证角色 | 做法 | 讲得通的地方 | 风险 |
|---|---|---|---|
| 算法间一致性 | 七列两两相关 | 同一批分钟,条件完全相同 | 只说明彼此接近,不说明接近真相 |
| 与死亡率关联 | 分列估风险比 | 同一套权重与结局 | 不同列给出的效应量不同 |
| 与自采数据对照 | 用自带真值设备同时佩戴 | 有地面真值 | 人群与佩戴条件不同 |
| 与髋部数据对照 | 用 2003–2006 轮髋部数据 | 同属 NHANES 体系 | 设备、部位、算法全变 |
| 纵向外推 | 用本库估计未来的活动水平 | 有全国代表性 | 每人只测一次,无法验证 |
| 跨国家比较 | 与韩国等同族调查比 | 调查设计相近 | 设备与佩戴部位不同 |
第一行与第二行都是内部比较,容易做得漂亮,却回答不了「绝对值对不对」。真正的外部验证需要一份有地面真值的数据,这个条件在本库内部无法满足。这也是为什么原文把自己定位成比较研究而不是验证研究。
7.5 它为何能持续:七列数字不可替代
它的持续存在靠的不是规模,而是这个组合在别处凑不齐:同一批万人级自由生活分钟、七套公开可查的计步算法、一套全国代表性抽样权重,再加 CC0 的完全放开。
任何一项单独拿出来都能找到替代。规模大,别的队列更大;算法多,自己也能部署;权重全,NHANES 本身就有。难的是四者同时成立,且有人愿意把中间结果也一并公开。一旦有人要研究「步数指标对算法有多敏感」,这个组合就是绕不过去的起点。
再加上版本维护的习惯——两次修订都带版本号与说明——它会被反复引用,而不是一次性用完。
§8 生态位与历史
8.1 历史沿革:从髋到腕,从计数到原始
体力活动的客观测量在流行病学里走过三个阶段。第一阶段用问卷自报,成本低但偏倚大。第二阶段用加速度计加固定处理流程,把原始信号转成活动计数或 MIMS 这类摘要,跨研究可比但研究者被锁在别人的特征里。第三阶段从 2022 年 NHANES 公开原始加速度开始,任何算法都可以被部署到同一批数据上。
本数据集属于第三阶段的产物,但它比单纯的算法部署多走了一步:把七套结果并排放,让分歧变成可见的研究对象。这一步在方法上是小的,在解读上是大的一次转变。
8.2 与髋部时代的对照
| 维度 | 髋部时代(2003–2006) | 腕部时代(2011–2014) |
|---|---|---|
| 佩戴部位 | 髋部 | 非惯用手腕 |
| 依从性 | 较低,需绑带 | 较高,像手表 |
| 手部动作干扰 | 少 | 多 |
| 常用处理 | 活动计数与阈值 | 多种算法并存 |
| 计步分歧 | 较小 | 明显更大 |
这张表解释了一个现象:为什么腕部数据一公开,计步算法的比较研究就多了起来。不是算法忽然变多了,是髋部数据里分歧太小,不值得专门比较。
8.3 生态位:算法敏感性研究的那一格
| 层次 | 代表工作 | 回答的问题 |
|---|---|---|
| 设备层 | 消费级与科研级加速度计 | 硬件够不够准 |
| 算法层 | 开源与商业计步算法 | 怎么把信号变成步 |
| 数据层 | 本数据集 | 不同算法在同一数据上差多少 |
| 应用层 | 步数与结局的关联研究 | 多走几步有什么好处 |
本数据集站在数据层。它不评价哪个算法更好,只提供让比较得以进行的数据。这个位置决定了它的引用方式:引用它通常是为了说明「我们做了敏感性分析」,而不是「我们用了一套准确的方法」。
8.4 谁在用它
从定位判断,使用者集中在四类。做可穿戴算法的人用它做外部一致性的参照;做流行病学的人用它做步数与结局的敏感性分析;做功能性数据分析的人用它做分钟曲线的教学与演示;做公共卫生报告的人用它产出带权重的活动水平估计。
四类用法都不指望它提供真值,只指望它提供同一批分钟上的多套读数。这个定位清楚之后,它的所有局限都变得可以接受。
§9 使用指引
9.1 三种角色的路径
| 角色 | 第一天 | 第一周 | 注意事项 |
|---|---|---|---|
| 算法研究者 | 读页面参数段,取一个变量文件跑通 | 把七列与自家算法并排比 | 参数要按页面那组,否则不同列 |
| 流行病学研究者 | 取受访者信息表与一个步数列 | 自建有效日规则,回表连结局 | 所有估计必须带权重 |
| 教学与方法学者 | 取一个受访者画 1440 点曲线 | 用七列展开做算法分歧演示 | 先剔首末日与睡眠段 |
9.2 一条最短的可用流程
#-- 1. 三个文件足够跑通:受访者信息、一个步数列、佩戴预测
BASE=https://physionet.org/content/minute-level-step-count-nhanes/1.0.2
for f in subject-info.csv.xz nhanes_1440_actisteps.csv.xz nhanes_1440_PAXPREDM.csv.xz; do
curl -sL -O "$BASE/$f"
xz -dk "$f"
done
#-- 2. 核对列数与行数:1443 列 = 3 个键 + 1440 分钟
awk -F, 'NR==1{print NF}' nhanes_1440_actisteps.csv
wc -l nhanes_1440_actisteps.csv subject-info.csv
import pandas as pd
MINS = [f'min_{i:04d}' for i in range(1, 1441)]
steps = pd.read_csv('nhanes_1440_actisteps.csv')
pred = pd.read_csv('nhanes_1440_PAXPREDM.csv')
df = steps[['SEQN', 'PAXDAYM'] + MINS].copy()
wake = (pred[MINS] == 1).values
df['daily'] = df[MINS].values.sum(axis=1)
df['wake_min'] = wake.sum(axis=1)
df = df[~df['PAXDAYM'].isin([1, 9])]
df = df[df['wake_min'] >= 600]
print(df.groupby('SEQN')['daily'].mean().head())
跑完这两段,就走完了下载、核对、剔除首末日、筛有效日四步。剩下的工作是把 actisteps 换成其余六列,并把结果接上结局变量做加权分析。
9.3 引用方式
| 引用对象 | 内容 | 说明 |
|---|---|---|
| 数据集 | Minute level step counts and physical activity data from NHANES 2011-2014, v1.0.2. PhysioNet. 2026. | 必须带版本号 |
| 标识符 | DOI 10.13026/d7sw-f662 | 指向 1.0.2 版 |
| 原始论文 | Koffman L, Crainiceanu C, Muschelli J. Med Sci Sports Exerc. 2025. | DOI 10.1249/MSS.0000000000003616 |
| 平台 | PhysioNet 平台综述,按页面引用按钮生成 | 官方页面同时给出 |
| 许可 | CC0 1.0,无需署名但仍建议引用 | 以许可全文为准 |
官方页面把引用分成三层:数据集本身、原始论文、平台。写论文时三层都要引,只引数据集会漏掉方法学来源,只引论文会漏掉数据版本。
§10 AI 使用声明
| 项目 | 声明 |
|---|---|
| 文本生成 | 本文由 AI 辅助撰写,结构与事实由编辑把关 |
| 数字来源 | 规模、结构、边界三类数字来自 PhysioNet 官方项目页与 Europe PMC 摘要 |
| 页面核验 | 官方项目页返回 HTTP 200,页面正文与元数据已逐段比对 |
| 未采用 | 未做步数分布直方图、未做算法间相关矩阵的逐格复算、未做逐条样本明细 |
| 论文信息 | 仅检索 Europe PMC 与 PubMed 的摘要字段,未读全文 |
| 数据文件 | 文件端点按地区策略返回拒绝,未取得压缩包,字段细节以页面字典为准 |
| 未核验内容 | 十五个文件的体积、逐分钟数值的抽取、上游转换脚本的实现细节 |
| 免责 | 本文不构成临床或公共卫生建议;使用须遵守 CC0 1.0 与上游 CDC 数据使用协议 |
常见误读(避坑清单)
| 说法 | 实际 | 证据 |
|---|---|---|
| 「它就是 NHANES 的数据」 | 是第三方在 NHANES 原始加速度上的派生表 | 页面作者为两所大学的个人,非 CDC |
| 「步数是标注好的真值」 | 全部为七种算法的输出,无人工核对 | 页面未提任何人工标注或视频标定 |
| 「七列里挑一列就行」 | 选列即选方法,须写明理由 | 原文报告日步数均值区间跨数倍 |
| 「每行是一个人」 | 每行是一个人·一天,1440 列 | 键为受访者编号与测量日序号 |
| 「可以直接算日均步数」 | 须先剔首末日、按佩戴筛有效日 | 页面写明测量日 1 与 9 不完整 |
| 「两轮可以直接合并比年龄」 | 年龄门槛不同,6 岁与 3 岁起 | 方法段明写两轮门槛不同 |
| 「xpt 和 csv 完全一样」 | xpt 不支持逻辑类型,存 0 与 1 | 数据说明段末尾附注 |
| 「有体重变量」 | 摘要提到,字段字典只列四项 | 摘要与字段字典口径不一致 |
| 「步数越高代表越活跃」 | 跨算法不可比,同算法内可比 | 七列并列本身就是证据 |
| 「未佩戴的分钟记为零即可」 | 零与缺测语义不同,会稀释均值 | 佩戴预测含独立的未佩戴编码 |
FAQ
Q1:它是 NHANES 本身吗?
不是。NHANES 由美国国家卫生统计中心主持,原始数据由该机构发布。本数据集是第三方团队在已经公开的腕部原始加速度上重跑计步算法得到的派生表,机构和许可都不同。
Q2:七列步数该用哪一列?
看问题。做敏感性分析就七列都算;做跨队列比较就选已被广泛使用的一列并写明理由。关键原则是不要根据结论反选列,那等于用结果倒推方法。
Q3:为什么一行有一千四百四十列?
因为汇总粒度是分钟。每天固定为一千四百四十个分钟列,缺测留空而不补零。这个形态适合功能性数据分析,读入时要注意内存。
Q4:能当步数真值用吗?
不能。全部数值是算法输出,没有人工核对或视频标定的分钟级真值。要评价精度,需要自采带地面真值的对照数据。
Q5:文件下载被拒绝怎么办?
项目允许任何人下载,但部分地区的文件端点返回 403。这是访问限制而非数据缺失,可以改从 NHANES 官网取原始数据自行复算,或通过平台的其他渠道获取。
Q6:为什么两轮的年份说法不一样?
页面方法与数据描述段写的是 2011–2012 与 2013–2014,而原始数据处理段写的是 2011-2012 与 2012-2013。两处并存,差额构成未说明。引用时建议只写轮次名。
Q7:佩戴预测和 Troiano 判定该用哪个?
两套都给。前者是上游给出的机器学习分类,后者是用经典阈值规则重新实现的。做分析时选一套写清楚,不要逐分钟混用。
Q8:日总步数怎么算才不出错?
先用佩戴预测剔掉未佩戴与睡眠分钟,再去掉测量日 1 与 9,最后按有效分钟数筛样本。这三步缺一步,日均值就会被系统性拉低。
Q9:它能做轨迹分析吗?
可以做活动曲线的形状分析,做不了空间轨迹。数据里没有位置信息,只有手腕的加速度与派生的步数。
Q10:和髋部时代的数据能比吗?
不能直接比。佩戴部位、设备、算法、处理流程四项全变。要比只能在指标定义层面比,且必须说明差异。
Q11:引用要引几样?
三样。数据集带版本号、原始方法学论文、PhysioNet 平台。只引一样会漏掉来源或版本。
Q12:版本更新频繁吗?
不频繁。首版 2025 年 1 月,两次修订分别在 2025 年 5 月与 2026 年 8 月。修订都有说明,引用时固定版本号即可。
术语表
| 术语 | 含义 |
|---|---|
| NHANES | 美国国家健康与营养调查,全国代表性横断面调查 |
| 分钟级 | 汇总粒度为每分钟一个值 |
PAXDAYM |
体力活动测量日序号,1 至 9 |
PAXDAYWM |
星期几,1 为周日 |
| MIMS | 不依赖监测器的运动摘要单位 |
| 活动计数 | ActiGraph 算法输出的加速度摘要 |
| ADEPT | 基于经验模式变换的步幅切分算法 |
| Oak | 面向多种佩戴位置的步行识别算法 |
| stepcount | 开源计步包,含监督与自监督两版 |
| Verisense | 面向 GGIR 生态的计步算法 |
| ActiLife | ActiGraph 官方软件,闭源 |
| Troiano 判定 | 基于固定阈值的佩戴与非佩戴规则 |
| 佩戴预测 | 上游给出的四分类佩戴状态 |
| 有效日 | 清醒佩戴达到阈值的一天 |
| 加权估计 | 按抽样权重计算的总体估计 |
| 功能性数据分析 | 把整条曲线当作一个观测单位的统计方法 |
| 宽表 | 一行含大量列的表格形态 |
| xpt | SAS 传输格式,不支持逻辑类型 |
| CC0 1.0 | 公有领域贡献许可,放弃全部版权 |
| 派生表 | 在上游数据上再加工得到的表 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 受访者总数 | 一万四千余名 | 官方页面数据描述段 | 官方 |
| 2011–2012 轮人数 | 6,917 | 官方页面原始数据处理段 | 官方 |
| 2013–2014 轮人数 | 7,776 | 同上 | 官方 |
| 女性占比 | 51% | 官方页面数据描述段 | 官方 |
| 平均年龄 | 35.8 岁(标准差 23.2) | 同上 | 官方 |
| 设备型号 | ActiGraph GT3X+ | 官方页面摘要段 | 官方 |
| 采样率 | 80 Hz | 官方页面方法段 | 官方 |
| 佩戴天数 | 7 天 | 官方页面方法段 | 官方 |
| 每日分钟列 | 1440 | 官方页面数据描述段 | 官方 |
| 变量文件数 | 15 | 官方页面数据描述段 | 官方 |
| 步数列数 | 7 | 同上 | 官方 |
| 最新版本 | 1.0.2 | 官方页面版本信息 | 官方 |
| 许可证 | CC0 1.0 | 官方页面 Access 区 | 官方 |
| 日步数均值区间 | 约 2,453 至 12,169 | 论文摘要 | 论文 |
| 算法间相关中位数 | 0.91(范围 0.77–0.98) | 论文摘要 | 论文 |
| 文件体积 | 未取得 | 文件端点拒绝 | 未核实 |
附录 B:数字的来源分层
| 层级 | 含义 | 本库对应内容 |
|---|---|---|
| 官方 | 项目页面明文写出 | 人数、性别占比、年龄均值、设备、采样率、列数、许可、版本 |
| 论文 | 方法学论文摘要给出 | 日步数均值区间、算法间相关、死亡风险比范围 |
| 未核实 | 页面未写且文件不可达 | 各文件体积、逐分钟取值的实际分布、转换脚本细节 |
三层可信度依次下降。写作与建模时,前两层可以直接引用,第三层只能标注为未知,不能凭推断补数。
附录 C:完整参考文献
| 编号 | 文献 | 说明 |
|---|---|---|
| 1 | Koffman L, Crainiceanu C, Muschelli J. Comparing Step Counting Algorithms for High-Resolution Wrist Accelerometry Data in NHANES 2011-2014. Med Sci Sports Exerc. 2025. DOI 10.1249/MSS.0000000000003616. PMID 39589008 | 官方指定的方法学论文 |
| 2 | Koffman L, Muschelli J. Minute level step counts and physical activity data from NHANES 2011-2014, v1.0.2. PhysioNet. 2026. DOI 10.13026/d7sw-f662 | 数据本体 |
| 3 | Pollard T, 等. PhysioNet as a global platform for biomedical research. Nature Health. 2026. DOI 10.1038/s44360-026-00096-z | 平台引用 |
| 4 | 美国国家卫生统计中心. NHANES 2011-2012 体力活动监测数据文档(PAXMIN_G 与 PAX80_G) | 上游数据文档,官方页面列为上游来源 |
| 5 | John D, Tang Q, Albinali F, Intille S. An open-source monitor-independent movement summary. J Meas Phys Behav. 2019 | MIMS 方法来源 |
| 6 | Troiano RP, 等. Physical activity in the United States measured by accelerometer. Med Sci Sports Exerc. 2008 | Troiano 佩戴判定的方法来源 |
第 5 与第 6 条只在官方页面参考文献列表里出现,本文只据其标题判断用途,未读全文。
附录 D:选库判决代码
#-- 用几个问题快速判断该不该用这份派生表
need = {
'需要分钟级步数曲线': True,
'需要算法敏感性分析': True,
'需要绝对步数真值': False,
'需要加速度以外的变量': False,
'需要非美国人群': False,
'需要临床患者人群': False,
}
blockers = [k for k, v in need.items() if v and k in (
'需要绝对步数真值', '需要加速度以外的变量',
'需要非美国人群', '需要临床患者人群')]
print('放弃' if blockers else '可用,先跑 §9.2', blockers)
这段判断没有技术含量,但能省一次白跑。四个硬约束里任一成立,都应换资源而不是在本库上绕。
附录 E:如果只记五件事
- 它不是 NHANES 本体,而是在 NHANES 腕部原始加速度上重跑的派生表。
- 万人级、每人七天、逐分钟 1440 列,七种计步算法并排。
- 没有任何人工标注,七列全是算法输出,绝对值不可比。
- 用途是算法敏感性与活动模式研究,不是步数校准。
- 用之前先剔首末日、按佩戴筛有效日,所有估计带权重。
编辑说明
本篇的核验路径为:PhysioNet 官方项目页(HTTP 200,正文与 JSON-LD 元数据逐段比对)、版本列表与 Access 区、以及 Europe PMC 与 PubMed 的论文摘要字段。文件端点按地区策略返回拒绝,压缩包未取得,故各文件体积与逐分钟取值未列。
官方页面内部存在口径差(第二轮年份、年龄门槛、体重字段),本文按并列呈现处理,不做对错判定。所有分布类统计(步数直方图、算法间相关矩阵逐格、逐条样本明细)均未做,交由使用者在取得数据后自行处理。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- treadmill-exercise-cardioresp — 共享标签:公共卫生与流行病学 / 生理信号 / 步态与运动
- acl-jumplanding-mocap — 共享标签:生理信号 / 队列研究 / 步态与运动
- sufhsdb — 共享标签:公共卫生与流行病学 / 生理信号
- ltmm — 共享标签:生理信号 / 队列研究 / 步态与运动
- taichidb — 共享标签:生理信号 / 队列研究 / 步态与运动
- sex-differences-hearing-loss — 共享标签:公共卫生与流行病学 / 生理信号 / 队列研究
- umwdb — 共享标签:生理信号 / 步态与运动
- music-motion-2012 — 共享标签:生理信号 / 步态与运动
- ohhr-hearing — 共享标签:公共卫生与流行病学 / 生理信号 / 队列研究
- ckb — 共享标签:公共卫生与流行病学 / 队列研究
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

