脚步里的长程相关 — UMWDB 步态动力学记录

10 名健康男性 / 60 条步间期序列 / 6 种行走条件

来源 https://physionet.org/content/umwdb/1.0.0/发布时间: 2026-10-28最后更新: 2026-10-28 阅读 10
脚步里的长程相关 — UMWDB 步态动力学记录

信息速览

数据集名称脚步里的长程相关 — UMWDB 步态动力学记录
数据类型时序信号,元数据,原始数据链接
规模10 名健康男性受试者(非患者群体)
接入方式https://physionet.org/content/umwdb/1.0.0/
AI 就绪度

UMWDB 是 PhysioNet 上编号靠前的一批开放生理数据之一,正式名称为 Long-term Recordings of Gait Dynamics,由 Jeffrey Hausdorff 提交,2001 年 8 月以 v1.0.0 发布。它记录的事情很小:十名健康年轻男性在无障碍的椭圆形步道上连续走一小时,鞋里贴一枚薄薄的力敏开关,把每一次落足的时刻记下来,再把相邻两次落足之间的时间差写成一行数字。十个人、每人六种走法、合计六十条这样的数字长列,压在硬盘里不到两张软盘。

它想回答的问题却不小。人走路时每一步的间隔并不恒定,正常人的步间期序列看上去像噪声,但把几百上千步连起来看,会发现涨落在不同时间尺度上统计相似,也就是分形。UMWDB 就是拿来做这件事的第一批公开素材:同一个人先用自己舒服的速度走、再走慢、再走快,然后换成跟着节拍器走同样的三种速度,看这种自相似在什么条件下还在、什么条件下消失。

它的边界同样清楚:只有十个人,全是健康男性,没有原始波形,没有疾病标签,二十多年没有修订,体积小到可以邮件附件发送。它是一份方法学基准,不是一份临床队列。一屏速览见下表。

维度 内容
中文常用名 步态动力学长期记录数据集
英文全称 Long-term Recordings of Gait Dynamics
PhysioNet 短名 umwdb
提交者 Jeffrey M. Hausdorff
发布机构 PhysioNet(MIT-LCP 与贝斯以色列女执事医疗中心共建)
首次发布 2001-08-16,v1.0.0
最近修订 无,自首发起未再改版
受试者 10 名健康年轻男性,平均 21.7 岁,18–29 岁
行走条件 自由正常 / 自由慢速 / 自由快速 / 节拍正常 / 节拍慢速 / 节拍快速,共 6 种
文件数 60 个数据文件 + 3 个辅助文件(校验和、两张示意图)
记录单元 每次落足一个步间期,单位秒,逐行纯文本
记录时长 每种条件连续行走约 1 小时
未压缩体积 1.1 MB
配套论文 Hausdorff 等,J Appl Physiol 80:1448-1457,1996
数据集 DOI 10.13026/C28679
许可 Open Data Commons Attribution License v1.0
访问方式 直接下载,无需注册、无需签署使用协议

§1 它要解决的具体麻烦

1.1 人的脚步不是节拍器,而这件事本身值得测量

运动控制领域有一个长期困扰:人的运动输出看起来总在抖动,同一动作重复做,每次的时长、幅度、轨迹都不完全相同。早期做法把这些抖动归为误差,用均值与标准差概括,剩下的当作噪声扔掉。二十世纪九十年代的生理复杂性研究提出另一种读法:这些抖动可能在时间上是有结构的,相邻的偏差不是彼此独立,而是相互关联,且相关能拖得很远。

步态是最好的试验场。走路是被动动力学与主动控制共同作用的结果,每一步都会受上一步的影响,同时又被更高层的节律意图约束。如果步间期序列确实带有长程相关,那么它就不是简单的随机游走,而是某种带记忆的生成过程;如果这种长程相关在外部节律接管时消失,那就说明这套记忆来自内部的、自发的中枢节律,而不是来自外部计时。

UMWDB 的全部设计都围绕这一个假设展开。它没有多模态,没有临床分组,也没有想把步态做成生物识别或跌倒预测。它只把同一批人在受控条件下走出的步间期序列完整留存下来,让任何人都能重做那套标度分析,或者提出相反的读法。

1.2 三条常见的错误期待

第一条是把 UMWDB 当成「步态识别」或「异常步态检测」语料。这类任务需要大量个体、需要患者与健康人的对照、需要行走画面的多视角或惯性传感器多通道。UMWDB 十个人、一个通道、没有标签,任何分类任务在这里都无法划分出有意义的训练与测试集。

第二条是把它当成「可穿戴步态数据」。虽然力敏开关确实贴在鞋里,属于可穿戴采集,但发布出来的不是传感器波形,而是已经切分完成的间隔标量。想练原始信号处理、想做步态相位分割、想算步频的瞬时变化,都需要波形层数据,UMWDB 拿不出来。

第三条是把它当成「老年步态」或「帕金森步态」的对照集。提交者后来确实在老年人、帕金森病患者、亨廷顿病患者身上做过同类研究,但那些记录大多没有进入这个包。UMWDB 里的十个人平均二十一岁出头,是全库里最年轻的一批受试者之一。

1.3 它能给到的与给不到的

你的需求 它给的 够不够
一条干净的健康步间期序列 每人每条件一条,逐行数值 够
同一受试者内的步速对照 正常、慢、快三种自由步速 够,且是最强的部分
外部节律接管时的对照 三种节拍器速度 够
原始落足时刻或波形 只给间隔差值 不够
跨越年龄段的对照 全部 18–29 岁男性 不够
患者与健康人的分组 无患者 不够
官方训练集与测试集划分 无 不够
现成的标度指数计算结果 论文里有群体层面结论,无逐人数值 部分够
可直接跑通的基线代码 无官方代码,需自己实现 DFA 不够
商用不受限 ODC-By 1.0,署名即可 够
大样本统计功效 十人 不够

这张表里有一个隐含判断:UMWDB 的稀缺性不在于数据量,而在于「同一受试者、同一场地、同一天内、六种条件的完整对照」。十个人不多,但十个人各自贡献六条一小时长序列,使得「条件内比较」的分析是充分的,而「人群间比较」的分析是不充分的。选择它之前先想清楚自己的问题属于哪一类。

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

你的处境 它能帮你什么 下一步该做什么
刚接触分形时间序列分析,想找一个能立刻上手的真数据 体积极小、格式极简、无前置清洗负担,一小时步序列足以做 DFA 与功率谱 先读 1996 年原文的图,再用自己的实现复现其趋势方向
手上有一批患者的步态记录,需要健康参照 提供同条件健康年轻成人的步间期基准形态 注意年龄与性别不可比,只能借用方法而非借用数值
想验证自己写的标度指数估计器是否正确 十人六条件的固定输入,结果可跨实现比对 用原文给出的指数区间做粗校验,不要追求逐位一致
设计新的步态采集协议,想决定每段走多久 每条序列约一小时,可切成不同长度子段看指数收敛 关注短段偏差,原文与后续文献都指出序列长度会显著影响估计
需要一个公开、许可宽松、可复现的教学材料 60 个纯文本文件,学生用任何语言都能读入 让学生先做自由与节拍条件的对比,结论最直观
想做步态生物识别或个体分类 只有十人,每人的序列长度不等,不适合 转向多受试者、多通道的惯性传感器数据集
想训练步态生成模型 序列长度足够,但条件标签仅六类且样本极少 只能做单人单条件的自回归或扩散建模演示
想用它写系统综述里的数据可得性一节 许可与访问路径明确,可引 DOI 引用数据集 DOI 与 1996 年论文两条

1.5 一句话判断

这是一个体积极小、设计极干净的健康步态步间期基准,价值在「同一批人、六种条件的内部对照」,不在样本量,也不在临床覆盖。

1.6 不适合谁:四条边界

第一条边界是人。十名受试者全是男性,年龄集中在下限很窄的区间,无神经肌肉、呼吸或心血管病史,且未服用任何药物。这意味着任何涉及性别差异、年龄效应、共病影响的分析,在这里都缺少组内变异。想研究「步态随年龄退化」的人不适用;想研究「步态在健康年轻男性中的标度性质」的人才适用。

第二条边界是信号层级。发布物是间隔序列,不是波形。凡是需要从原始时刻重新定义步态事件、需要区分支撑相与摆动相、需要看足底压力分布的问题,都被挡在门外。§4.3 的案例里那六个文件正是这种层级差异的写照,它连一个人的落足波形都没有留存。这一点常被低估:不少人以为有步间期就等于有步态,实际上两者之间隔着一整套事件检测与信号处理。

第三条边界是外部效度。受试者在无障碍的椭圆形步道上连续行走,路面平整,环境单调,没有转弯频繁的走廊,没有楼梯,没有双任务,也没有穿不同鞋具的对照。真实生活中的步态远比这个条件复杂,从 UMWDB 得到的标度性质不能直接外推到户外自由生活场景。

第四条边界是时间。数据自 2001 年首发后未再更新,没有勘误,也没有迁移到 WFDB 或 BIDS 之类的新封装。PhysioNet 平台本身在演进,但这个包的内容保持原样。如果某项研究要求与最新版平台规范兼容,需要自行做格式转换,并自行承担转换引入的风险。

§2 数据构成与规格

2.1 六十个文件与三个配件的平铺结构

整个包没有目录层级。解压后所有文件落在同一层,文件名由受试者编号与条件后缀拼接而成,例如 si01.norm 表示一号受试者的自由正常步速记录。编号从 si01 排到 si10,后缀共六种。除此之外还有三个非数据文件:SHA256SUMS.txt 是校验和清单,fig.png 与 fig.ps 是同一张示意图的两种格式,用来展示步间期序列的样子。

这种平铺结构的优点是几乎不需要任何解析约定,任何脚本一个通配符就能枚举全部文件;缺点是六种条件的语义只编码在扩展名里,没有清单文件把后缀映射到条件名称。初次接触的人必须回到网页正文,才能确认 .metnrm 是节拍正常、.metfst 是节拍快速。

六种后缀与条件的对应关系如下:

后缀 行走条件 是否有外部节律 页面表述的步速
.norm 自由行走,自选正常速度 无 usual pace
.slow 自由行走,自选慢速 无 slow pace
.fast 自由行走,自选快速 无 fast pace
.metnrm 跟随节拍器,节拍频率对应正常步速 有 节拍器设定
.metslw 跟随节拍器,节拍频率对应慢速 有 节拍器设定
.metfst 跟随节拍器,节拍频率对应快速 有 节拍器设定

表中的「步速」一列需要说明:自由行走的三种速度是受试者自己选的,不是仪器设定的;节拍器三种速度则是按外部设定执行的。两种机制混在同一张表里,是理解这套数据的第一个分水岭。

2.2 字段与记录的完整字典

UMWDB 没有表结构,字段只在两个层面存在:文件级元数据,以及文件内的行级数值。为了让接入方能对照,下面把这两层拆开列全。要注意的是,文件级字段没有任何一个写在数据文件内部,全部靠文件名与网页正文承载。

层级 名称 类型或取值 出现位置 说明
文件级 受试者编号 si01 至 si10 文件名前缀 十名受试者的匿名编号,与人口学信息不对应
文件级 行走条件 六种后缀之一 文件名扩展名 自由三速或节拍三速
文件级 是否外部节律 是 / 否 由后缀推断 节拍条件为是,自由条件为否
文件级 记录时长 约 1 小时 网页正文 同一受试者六条件各自独立记录
文件级 序列长度 随文件不同 文件行数 页面未给逐文件步数,只提自由条件可达上千步
文件级 采集装置 超薄力敏开关 网页正文 贴于单只鞋内侧
文件级 场地 椭圆形无障碍步道 网页正文 长度 225 米或 400 米
文件级 数值单位 秒 网页正文 文件内无单位声明
文件级 数值精度 未声明 无 需按文件大小与行数自行推断
行级 步序号 隐式,从 1 起 行位置 无显式列,依赖行顺序
行级 步间期 浮点数值 每行唯一内容 相邻两次落足的时间差
行级 缺失标记 无 无 页面未描述任何缺失值约定
行级 质量标记 无 无 没有标注哪些步属于异常或备用
派生 步频 步间期倒数 需自行计算 单位换算次数每秒
派生 累计时刻 累加前缀和 需自行计算 累加会放大取整误差
派生 传输量 相邻值之差 需自行计算 文献中用于辅助判断平稳性
受试者级 年龄 平均 21.7 岁,范围 18–29 仅网页正文汇总 无逐人表
受试者级 身高 1.77 ± 0.08 米 仅网页正文汇总 无逐人表
受试者级 体重 71.8 ± 10.7 千克 仅网页正文汇总 无逐人表
受试者级 性别 全部男性 网页正文 无逐人表
受试者级 病史排除 无神经肌肉、呼吸、心血管病史 网页正文 无逐人表
受试者级 用药 未服用药物 网页正文 无逐人表
受试者级 知情同意 书面签署 网页正文 不含同意书文本

这张字典本身就是一份边界说明:受试者级的所有字段都只有汇总值,唯一能逐文件对接的键是编号前缀加条件后缀。任何试图把年龄当作协变量放进模型的做法,都会卡在「十个人只有一个均值」这一关上。

2.3 一条记录的完整解剖

取 si01.norm 作为标本。它是受试者一号在自由正常步速下走一小时的结果。文件第一行是全部行走中第一个完整的步间期,第二行是第二个,依此类推,直到文件结束。没有表头,没有末尾汇总,没有分隔符,每行就是一个十进制数。

用任何命令行工具都能看到它的开头几行,下面是等价的读法:

#-- 取 1.0.0 版本里的第一个文件的开头十行
curl -s https://physionet.org/files/umwdb/1.0.0/si01.norm | head -n 10

#-- 看文件有多少行,也就是这一小时里走了多少步
curl -s https://physionet.org/files/umwdb/1.0.0/si01.norm | wc -l

#-- 看数值的量级:单位是秒,健康成人正常步速通常在 1 秒上下
curl -s https://physionet.org/files/umwdb/1.0.0/si01.norm | sort -n | head -n 1
curl -s https://physionet.org/files/umwdb/1.0.0/si01.norm | sort -n | tail -n 1

从结构上读,这个文件同时承载三种信息。第一种是步序,它只能是行号,因为文件里没有任何一列重复记录位置。第二种是步间期本身,它既是数值也是时间,累加起来才得到绝对时刻。第三种是条件的隐式标注,它不在文件里,而在文件名里。

同一名受试者的六个文件放在一起看,才能看出设计意图:三个自由步速的文件彼此之间是内部对照,三个节拍文件彼此之间也是内部对照,而自由与节拍之间则是对立条件的对照。单看一个文件,只能得到一个人一次行走的描述;六个文件合起来,才构成一个完整的受试者内实验。

2.4 六种条件的规模对照

由于页面没有逐文件给出步数,只能从文件体积与记录时长的组合推断相对规模。这类推断属于结构层面的常识,不是分布统计:同样压缩率下,文件大小与行数近似成正比,而每行长度由数值的小数位数决定,六种条件的格式一致,因此体积差异主要来自步数差异。

条件 典型文件体积量级 与自由条件的相对规模 结构含义
自由正常 十几到二十几千字节 基准 一小时自选速度,步数最多的一档之外
自由慢速 十几到二十几千字节 略少或相当 步频低但每步步间期数值更长
自由快速 二十千字节上下 步数最多 步频高,行数多
节拍正常 十千字节上下 约自由条件的一半 记录时长或有效步数少于自由条件
节拍慢速 十千字节以下 最少 同上,且步频更低
节拍快速 十千字节上下 约自由条件的一半 同上,且步频更高

这一列「相对规模」值得单独强调,因为它改变了下游分析的默认假设。若默认六个条件都是一小时等长序列,那么在节拍条件下做长程标度估计时就会出现有效样本不足的问题,尤其是在需要上千步才能稳定估计的尺度上。页面正文只说明自由条件下长程相关可持续约一千步,没有说节拍条件也能到同样的长度。

2.5 与同类资源的字段差异

把 UMWDB 放在今天的步态数据生态里,会看到它的字段集几乎是同类资源里最精简的。下面的对照只比较字段与结构,不评判优劣。

资源类型 每个步的载体 采样层面 受试者级字段 条件标签
UMWDB 一个间隔标量 事件级,逐步 仅群体汇总 六类,编码在扩展名
惯性传感器步态集 多轴加速度与角速度 固定采样率波形 逐人表,常含年龄性别身高 多为场景或疾病标签
足底压力垫步态集 压力分布帧 固定帧率图像序列 逐人表 多为行走任务标签
动作捕捉步态集 关节坐标序列 固定帧率 逐人表 多为动作类别
临床步态评分量表 维度分数 评估级 逐人表,含量表分 量表分档

差异的核心在于还原度。UMWDB 牺牲了全部波形信息,换取极小的体积与极低的接入成本;代价是任何需要回到信号层的分析都无法进行。这一点在选型时应当作为硬约束而不是软偏好:如果研究问题里出现「步态相位」「支撑时间」「压力中心」这类词,UMWDB 就直接出局,不需要再讨论规模。

§3 空间与时间:这批记录发生在哪里、属于哪个年代

3.1 一条 225 米或 400 米的椭圆步道

记录场地被描述为平坦、无障碍、长约 225 米或 400 米的椭圆形路径。受试者在其上连续绕行,不停顿。这个设计带着明确的取舍:椭圆形意味着每圈都有两次方向相反的转弯,转弯处步态会变化;但路径足够长,转弯在整段时间里的占比很低,不至于主导整体标度性质。

页面没有说明为什么出现两个长度。一种可能是不同受试者的实验在不同场地完成;另一种可能是同一场地的两套标线。无论哪种,这都带来一个未声明的不一致:如果受试者分布在不同长度上,转弯次数与转弯间隔就不同,而这恰恰会影响步间期的局部结构。

这个不一致无法从发布物里消除,因为文件里没有场地字段。任何声称「全部记录在同一场地完成」的分析都会引入未经证实的假设。稳妥的做法是在方法学描述里写明「场地长度存在两个取值,逐人归属未公布」。

3.2 一小时:为什么是这个长度

一小时是一个折中值。太短,序列只有几百步,长程相关的估计会严重偏向短程;太长,受试者疲劳会引入非平稳的慢漂移,节拍条件下的注意力也难以维持。原文的选择使得自由条件下能覆盖约一千步,刚好落在当时 DFA 方法可以稳定估计的尺度上。

一小时的另一个后果是:它把「疲劳」变成了实验的一部分而不是误差。一小时连续行走对健康年轻人来说负荷不大,但对步间期的慢趋势仍有影响。原文提到去除时间序列漂移后长程相关不受影响,这在一定程度上回应了疲劳疑虑,但没有消除它,因为去趋势本身也是分析者的选择。

3.3 1996 年的实验,2001 年的发布

实验发生在 1996 年前后,论文同年发表于 Journal of Applied Physiology。数据在五年后才随 PhysioNet 上线。这五年的间隔解释了若干特征:格式是最朴素的纯文本,没有元数据文件,没有版本化的采集参数表,因为这些规范在 2001 年尚未成为共识。

这也意味着 UMWDB 是 PhysioNet 早期「作者提交、平台托管」模式的产物。它的质量取决于提交者当时的整理习惯,而不是平台后来的审核流程。理解这一点,就不会期待它具备今天开放数据集常见的那种完备性,例如数据字典、采集协议原文、伦理批件编号。

3.4 它属于哪个研究传统

UMWDB 属于生理复杂性研究的一个分支。这一传统把心率、呼吸、步态等节律信号看作复杂系统的输出,关注的是标度性质而不是均值差异。与之平行的还有心率变异性研究、脑电复杂度研究,共享同一套工具箱:去趋势波动分析、Hurst 指数、功率谱斜率、熵。

在这个传统里,数据集的角色是方法学的试金石。一个好数据集的标志不是样本多,而是条件设置能让假设可检验。UMWDB 的六条件设计正是这种思路:它把「内部节律」与「外部节律」做成同一批人的两种状态,让标度差异可以被归因。

3.5 时间维度上的空白

数据集中不存在任何绝对时间字段。不知道实验在一年中的哪一天、一天的哪个时刻进行。对于步态这类受昼夜节律影响较小、但受温度与鞋具影响的行为,这个空白通常可以接受;但如果有人想把 UMWDB 与其他同日采集的数据做时间对齐,就会发现没有任何锚点可用。

同样空白的是时长的一致性。页面说每种条件约一小时,但没有逐文件给出精确时长。这意味着「等长序列」只是一个近似假设,实际做批量分析时应先逐个文件确认真实行数,再决定是否需要截断对齐。

§4 分形假设:这套数据最想证明的一件事

4.1 长程相关的含义

长程相关指的是序列中相隔很远的两个值之间仍有统计依赖。日常经验里,昨天的气温与今天的气温相关,但与上个月的气温基本无关,这是短程相关。长程相关的典型形态是相关随间隔按幂律缓慢衰减,衰减得足够慢,以至于相关长度在观测窗口内看不到尽头。

步间期序列若具有这种性质,意味着某一步偏慢,会让后面很多步都倾向于偏慢,且这种倾向不会在几步之内消失。这在运动控制上不是显然的:一个每一步都受随机扰动影响的系统,直觉上应当很快忘记历史。要有长程相关,系统本身必须带有某种跨步的记忆或反馈结构。

4.2 判据:标度指数落在什么位置

判断长程相关最常用的工具是标度指数。原论文使用的是去趋势波动分析,其输出通常记为 α。数值上,α 接近 0.5 表示序列近似无相关(白噪声型涨落),α 明显大于 0.5 表示正长程相关,α 小于 0.5 表示反相关。

UMWDB 的设计让这三档在同一份数据里都能被观察到,而不需要换数据集:自由行走三个速度给出正长程相关,节拍器行走给出反相关或近似无相关。原文的结论正是围绕这个对比展开的,页面正文也复述了这一点。

观察对象 原文表述的性质 对应的标度解读 数据内对应文件
自由行走,三种速度 长程相关,幂律衰减,可持续约一千步 标度指数明显高于无相关水平 .norm .slow .fast
节拍器行走,三种速度 长程相关消失,呈反相关 标度指数低于无相关水平 .metnrm .metslw .metfst
自由行走,去漂移后 长程相关未受影响 结论对去趋势不敏感 对自由三文件做预处理

4.3 案例:si01 的六份文件

拿 si01 走一遍完整对比,能最直观地看到这套设计的意图。这个受试者提供了六份文件,全部可以匿名直接下载。分析者可以分别对 .norm 与 .metnrm 做同一套标度估计,看两条曲线在对数坐标下是否分叉。

这个案例之所以适合作为贯穿实例,是因为它把 UMWDB 的全部设计压缩在一个人身上:同一个人的同一天、同一双鞋、同一条步道,唯一改变的变量是「由谁来决定步速」。§4.2 的判据表在 si01 身上可直接验证,§5.5 的代码也是以它为例,§7.3 讨论的偏差同样以它为例说明为什么不能跨人外推。

需要提醒的是,si01 只是十个人里的一个。单个人的曲线形状可能与群体结论有出入,这正是原文报告群体层面结果而不是逐人结果的原因。把 si01 当作「典型代表」是一种便利,不是一种事实。

4.4 论文留给我们的一半答案

原论文的结论是:自由行走时三种速度下都存在长程相关,节拍器行走时长程相关消失、波动呈反相关,且去除漂移后结论不变。由此作者推断这种分形性质是运动系统的内在属性,可能与控制行走节律的高级中枢有关。

这个结论后来受到挑战。2009 年有研究用分数整合滑动平均模型重新分析同一批 1996 年数据,认为节拍条件下的相关并没有真正消失,而是表现出反持续,并且在与节拍器的异步量中能看到另一套涨落结构。这个分歧至今没有完全收敛。

§4.3 的案例在这里体现得最清楚:正因为原始序列被完整公开,后来的研究者才能用不同方法重新分析同一批数据并得出不同结论。若当初只发布了群体统计量,这场方法学争论就无从谈起。

4.5 它证明的与它没证明的

已证明的部分是有限的、可复现的:十名健康年轻男性在给定条件下,步间期序列呈现出与无相关不同的标度行为,且自由与节拍两种条件的行为不同。这部分可以用发布的数据独立重算。

没有证明的部分常被误读为已证明:这套性质是否适用于女性、老年人、患者,是否在真实环境中保持,是否具有诊断价值,是否由某个具体神经通路产生。这些都不在数据能回答的范围内,原文也没有声称能回答。把它们当成结论引用,是对数据边界的越界使用。

§5 怎么把它拿到手里并跑起来

5.1 三条下载通道

PhysioNet 为这个包提供了三条等价通道:浏览器直接下载 ZIP、按文件逐个 HTTP 拉取、以及通过 AWS 开放数据镜像同步。三条通道拿到的是同一份内容,只是传输方式不同。由于总量只有 1.1 MB,任何一条通道都在几秒内完成,不存在分卷、断点续传或限速的问题。

通道 命令形态 适用场景 是否需要凭证
ZIP 直下 浏览器访问 get-zip 路径 手动检查、一次性取全量 否
逐文件 HTTP 以 files 路径为根递归抓取 脚本化、只取部分文件 否
AWS 镜像 以 no-sign-request 同步公开桶 云上批处理、避免直连限速 否

三条通道都不要求注册、不要求填写用途、不要求签署数据使用协议。这一点在今天的医学数据里已经不多见,也是它在教学场景里长期被使用的原因之一。

5.2 一次性取全并校验

取全量之后建议先核对校验和。包内自带 SHA256 清单,覆盖全部数据文件。下面这段脚本把下载、解压、校验、清点行数连成一条链:

#-- 建工作目录,取 ZIP,解压到 data 子目录
mkdir -p ~/umwdb && cd ~/umwdb
curl -fL -o umwdb.zip https://physionet.org/content/umwdb/get-zip/1.0.0/
unzip -q umwdb.zip -d data

#-- 进入解压后的版本目录,核对校验和
cd data/umwdb/1.0.0 2>/dev/null || cd data
sha256sum -c SHA256SUMS.txt | tail -n 3

#-- 统计每个数据文件的行数,也就是每种条件的步数
for f in si*.norm si*.slow si*.fast si*.metnrm si*.metslw si*.metfst; do
  printf '%s\t%s\n' "$f" "$(wc -l < "$f")"
done | sort -k2,2n | head -n 12

这段脚本的最后一步会给出步数最少的若干个文件。若这些文件集中在节拍条件,就印证了 §2.4 的推断:节拍条件的有效步数普遍少于自由条件。做长序列分析前应先看这份清单,再决定对齐策略。

5.3 用 Python 读入并整理成长表

文件本身没有条件字段,读入时需要从文件名解析。下面把十人六条件整理成一张长表,附带受试者编号、条件名、条件族(自由或节拍)与步序号:

#-- 只依赖标准库与 pandas,路径按上一节的解压结果
import glob
import os
import re
import pandas as pd

DATA_DIR = os.path.expanduser("~/umwdb/data/umwdb/1.0.0")
COND = {"norm": "free_normal", "slow": "free_slow", "fast": "free_fast",
        "metnrm": "metronome_normal", "metslw": "metronome_slow",
        "metfst": "metronome_fast"}

rows = []
for path in sorted(glob.glob(os.path.join(DATA_DIR, "si*.*"))):
    name = os.path.basename(path)
    m = re.fullmatch(r"(si\d{2})\.(norm|slow|fast|metnrm|metslw|metfst)", name)
    if not m:
        continue
    subject, suffix = m.group(1), m.group(2)
    with open(path, encoding="utf-8") as fh:
        vals = [float(x) for x in fh.read().split()]
    family = "metronome" if suffix.startswith("met") else "free"
    for i, v in enumerate(vals, start=1):
        rows.append((subject, COND[suffix], family, i, v))

df = pd.DataFrame(rows, columns=["subject", "condition", "family", "step", "interval_s"])
print(df.groupby(["family", "condition"])["interval_s"].size().unstack())
print(df["interval_s"].describe())
df.to_parquet(os.path.expanduser("~/umwdb/umwdb_long.parquet"))

整理成表之后,六个条件就不再用扩展名区分,而是变成两列可以分组的名义变量。这一步是接入任何分析框架的前提,也是把「文件名语义」转成「数据语义」的关键。

5.4 一个最小的标度估计

下面给出一个足够短、可以当场跑通的去趋势波动分析实现,用它可以对任意一条序列估出标度指数。这段代码只求正确表达算法,不追求数值优化,因此用纯 Python 列表与简单最小二乘实现:

import numpy as np

def dfa_alpha(x, scales=None):
    #-- x 为步间期序列;scales 为窗口长度列表,默认从 4 到序列长度的四分之一
    x = np.asarray(x, dtype=float)
    y = np.cumsum(x - x.mean())
    if scales is None:
        top = max(8, len(x) // 4)
        scales = np.unique(np.round(np.logspace(np.log10(4), np.log10(top), 16)).astype(int))
    log_n, log_f = [], []
    for n in scales:
        k = len(y) // n
        if k < 2:
            continue
        seg = y[:k * n].reshape(k, n)
        t = np.arange(n)
        fit = np.polyfit(t, seg.T, 1)
        trend = (fit[0][:, None] * t[None, :] + fit[1][:, None])
        log_n.append(np.log(n))
        log_f.append(np.log(np.sqrt(((seg - trend) ** 2).mean())))
    return float(np.polyfit(log_n, log_f, 1)[0])

#-- 对 si01 的自由正常与节拍正常两条序列分别估计
import pandas as pd
df = pd.read_parquet("~/umwdb/umwdb_long.parquet")
for cond in ["free_normal", "metronome_normal"]:
    s = df[(df.subject == "si01") & (df.condition == cond)]["interval_s"].to_numpy()
    print(cond, len(s), round(dfa_alpha(s), 3))

代码里的窗口长度上限取序列长度的四分之一,是为了避免最长的几档窗口只剩下两三个分段、估计方差过大。如果改用更严格的设置,可以进一步把上限压到十分之一,代价是最长尺度上的信息减少。

5.5 把案例跑成一个对照实验

把上面的估计器套到 si01 的六个文件上,就得到 §4.3 的案例的完整版本。注意这不是要复现原文的绝对数值,而是要看两种条件族之间是否出现方向一致的分叉:

import pandas as pd
df = pd.read_parquet("~/umwdb/umwdb_long.parquet")
sub = df[df.subject == "si01"]
for cond, g in sub.groupby("condition", sort=True):
    x = g.sort_values("step")["interval_s"].to_numpy()
    print(f"{cond:>18s}  n={len(x):5d}  alpha={dfa_alpha(x):.3f}")

若输出中自由三条件的估计值普遍高于节拍三条件,就与原文的定性结论一致。若个别条件相反,也不必立刻怀疑代码:单个受试者的估计本身带有较大不确定性,这正是原文以群体层面陈述结论的原因。要得到稳健判断,应当对十个人分别估计,再看条件族的整体分布,而不是只看一个人。

5.6 与其他读法的衔接

同一批数据可以用不同的标度工具读。除了去趋势波动分析,还有 Higuchi 分形维数、盒计数维数、以及基于自回归分数整合滑动平均的参数估计。2009 年的重分析正是用后者得出了与原文不同的结论。三种方法对同一序列给出的数值不可直接比较,因为它们度量的不是同一个量。

这带来一个实操建议:报告结果时必须同时写明方法与参数,尤其是窗口长度范围。序列长度的选择会显著影响估计结果,这一点在后来的方法学综述中被反复强调。UMWDB 的序列长度足以支持多种窗口设置,反而使得参数不规范的报告更难被发现,因此更需要显式声明。

§6 与库内条目的关系

6.1 关系图谱

UMWDB 在千方医数集的步态与运动类条目里属于「极简派」的一端。它的同族条目大多走多通道、多受试者、多任务的路线,而它只保留一个标量通道。下面的图谱按「数据形态」分层,而不是按疾病或科室分层,因为后者对这份数据集没有意义。

层级 库内相邻类型 与 UMWDB 的关系 何时从它转向过去
事件级单通道 UMWDB 本身 本层唯一的纯步间期资源之一 需要更多受试者或患者时
波形级惯性 可穿戴步态与活动识别类条目 提供原始加速度与角速度,采样率达数十至数百赫兹 需要做信号处理或相位识别时
影像级运动分析 动作捕捉与步态视频类条目 提供关节坐标或视频帧 需要空间姿态而非时间间隔时
生理节律 心率变异性类条目 同属复杂性分析传统,工具可复用 研究非运动节律时
临床量表 步态评分与功能评估类条目 提供量表维度分与分组 需要诊断或严重度标签时

6.2 检索路径

在站内找到相关条目,通常有三条路径。第一条从方法出发:搜「去趋势波动分析」「标度指数」「Hurst」,会把 UMWDB 与心率变异性、脑电复杂度类条目一并带出。第二条从任务出发:搜「步态」「步频」「落地时刻」,会先命中多通道步态集,再在邻近位置出现 UMWDB。第三条从数据形态出发:搜「步间期」「时间序列」「纯文本」,这是最短路径,因为 UMWDB 的形态在库内少见。

反过来,从 UMWDB 出发想去别处,最常用的两个去向是多通道步态集与患者步态集。前者补波形,后者补人群。若研究设计同时需要这两者,UMWDB 更适合作为方法验证的先行小样本,而不是最终的数据主源。

6.3 与患者步态资源的分工

步态研究里最常出现的组合是「健康基线加患者组」。UMWDB 天然占健康基线这一格,但它占得不完整:年龄偏小、性别单一。真正的健康基线应当分层覆盖,UMWDB 只能代表其中一个很窄的切片。

这带来的实操分工是:用 UMWDB 建立分析流程与判据,用更大规模、更有层次的健康队列校准基线数值,再用患者数据做组间比较。跳过中间一步,直接从 UMWDB 的健康值推到患者,会把年龄效应混进疾病效应。

§7 质量评估与局限性

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

评估类似 UMWDB 这样的早期小数据集时,最容易发生的误判是把今天开放数据的评分尺度直接套上去,然后因为「十个人」「没有元数据文件」「没有划分」而打低分。这种打分方式测的是完备性,不是适用性。一个只有十个人但条件设计严密的包,可能比一个有三千人但标签混乱的包更有用。

第二个常见误判是把「未修订」当成「已废弃」。UMWDB 从 2001 年起没有改版,是因为记录本身没有变化,而不是因为平台放弃维护。它的静态性恰恰保证了二十年间的可比性:任何人今天下载的内容与当年论文使用的数据一致。

第三个误判是把页面上的群体汇总值当作逐人真值。十名受试者的年龄只有一个均值与一个范围,若把它写进方法学的协变量表,就是在用群体值冒充个体值。这一条在审稿中很容易被指出,且无法补救。

7.1 五维评分

下面按 DAIMS 框架的五个维度给出判断。评分只针对「作为步间期方法学基准」这一用途,换成别的用途,各维度权重会完全不同。

维度 评分 依据 主要扣分项
数据完整性 中上 每人六条件齐全,文件齐全,校验和可核 缺逐人人口学表,缺采集参数表
可用性 高 纯文本、无门槛、体积极小、许可宽松 无官方读取脚本,无语义清单
可解释性 高 单一标量通道,物理含义清楚 数值精度与单位未写入文件
可维护性 低 首发后未修订,无勘误机制 格式未向新封装迁移
可扩展性 低 十人固定,无新增受试者路径 无法按需扩样

五维里可维护性与可扩展性偏低,是这类「一次性提交」数据集的共同特征。它们的命运是成为被引用的历史基准,而不是持续生长的平台。评估时应把这当作既定属性,而不是缺陷。

7.2 与原文结论的一致性

如果用公开发布的序列重做原文的分析,方向上的结论应当可以复现:自由行走三条件呈现正长程相关,节拍条件呈现反相关或近似无相关。绝对值不必一致,因为原文的窗口设置、去趋势阶数、以及序列截断方式都可能与后来者不同。

值得注意的是 2009 年的重分析给出的不同读法。它没有否定数据本身,而是质疑「相关消失」这一表述。这类分歧对使用者是好事:它说明发布原始序列比发布结论更有长期价值。引用 UMWDB 时若只引用 1996 年的结论,会漏掉这层后续讨论。

7.3 已知的、可枚举的偏差

偏差 具体表现 对分析的影响 可缓解程度
性别单一是最硬的偏差 十人全部男性 无法讨论性别差异,不能外推到女性 不可缓解,需换数据
年龄区间狭窄 集中在十八到二十九岁 无法拟合年龄效应,不能代表老年步态 不可缓解
健康状况全为健康 无病史、无用药 无患者对照,不能做诊断 需配合其他数据集
场地长度存在两个取值 225 米或 400 米,逐人归属未公布 转弯密度不可控,局部结构受影响 只能声明,无法校正
条件时长可能不等 页面称约一小时,无逐文件时长 长尺度估计的有效样本不同 可逐文件核实行数后截断
无逐人人口学 仅有群体均值与标准差 无法做个体层面的协变量调整 不可缓解
静态未修订 无勘误、无版本迭代 已知问题不会修复 不可缓解

这些偏差里,前三条属于抽样层面的限制,无法通过分析技巧弥补;中间两条属于设计层面的不确定性,可以通过显式声明与敏感性分析处理;最后一条属于维护层面的属性,只能接受。

7.4 外部验证矩阵

判断一份数据是否值得用,除了看它自己,还要看别人用它做了什么。下表按用途归纳 UMWDB 在文献中的实际角色:

用途方向 典型使用方式 证据强度 备注
标度方法学比较 作为标准输入比较不同标度估计器 强 同一批序列被多种方法反复分析
序列长度效应研究 截取不同长度子段看指数如何漂移 中上 后续文献明确指出长度影响显著
分形动力学模型检验 检验生成模型能否复现长程相关 中 多用于模型评价而非临床
节律耦合研究 讨论外部节律是否真正覆盖内在节律 中 存在相互矛盾的解读
教学演示 用作时间序列分析课程的真数据 强 体积极小,易分发
临床诊断 未见于以诊断为目的的验证 无 数据本身不支持

矩阵的最后一行是关键:没有证据表明它被用于临床诊断验证,这既不是它的问题,也不是它应当承担的角色。把它放进诊断流程,属于误用。

7.5 它为何能持续:极小体量与完整条件的组合难以被替代

二十年过去,步态数据集的规模从十人涨到数千人,通道从一路涨到几十路,UMWDB 却没有被替代。原因不在规模,而在两个别人很难同时满足的条件:一是体积极小,任何人都能在几秒内取得全量并在本地跑通;二是同一批人提供六种条件的对照,且其中既有自由节律又有外部节律。

后者尤其稀缺。大样本数据集通常按场景或疾病分组,很难让同一批人反复回到实验室做六种条件的一小时行走。成本决定了这种设计只可能出现在早期的小规模研究里。因此 UMWDB 的位置不是被取代,而是被固化:它成了这类设计的唯一公开样本之一。

§8 生态位与历史

8.1 从生理复杂性到开放数据

UMWDB 的源头是二十世纪九十年代波士顿的生理复杂性研究圈。那一批研究者关注的是健康生理信号中的非线性结构,方法上大量借用统计物理。步态只是他们研究的多个节律之一,同期还有心跳间期、呼吸、以及血压的标度分析。

把原始数据而非仅结论公开,在当时不是惯例。多数论文只发布图表与统计量。UMWDB 选择公开六十条完整序列,使得方法学争论有了共同的事实基础。这一做法后来成为 PhysioNet 的核心主张之一。

8.2 PhysioNet 早期的托管模式

2001 年的 PhysioNet 还不是今天这样的大型平台,数据集由作者提交、由平台做基本托管。没有统一的数据字典规范,没有强制的伦理文件,没有版本化的勘误流程。UMWDB 的形态正是那个阶段的直接产物:平铺文件、无元数据、无脚本。

理解这段历史,可以解释很多今天看来不合理的细节。比如为什么单位没有写进文件,为什么没有受试者表,为什么示意图要用 PostScript 与 PNG 两种格式各存一份。这些都是那个年代的实际做法。

8.3 它在步态数据谱系中的位置

步态数据的公开史大致可以分成三代。第一代是事件级,只留间隔,UMWDB 是代表。第二代是波形级,随惯性传感器普及而出现,通道数从一路涨到九路,采样率固定在几十到几百赫兹。第三代是场景级,数据在真实环境中长时间采集,附带视频、位置与活动标签。

三代的差别不只是技术,也是研究问题的差别。第一代问「节律本身有什么结构」,第二代问「这个结构如何在信号中体现」,第三代问「这个结构在生活里有什么用」。UMWDB 只回答第一个问题,且回答得很完整。

8.4 后来的同类资源与它没覆盖的空白

后续出现的同类资源大多补上了 UMWDB 的短板:受试者数量增加、年龄跨度扩大、加入患者组、并入惯性传感器通道、附带临床量表。这些资源在规模上远超 UMWDB,但在条件设计的严密程度上未必超过它。

真正没被补上的是「同一批人的多条件重复测量」这一模式。它成本高、样本少,不符合大数据的叙事,因此在近十年的公开数据里反而少见。UMWDB 因此成为一个时间胶囊:它保存了一种在大样本时代不再流行、但依然有方法学价值的研究设计。

§9 使用指引

9.1 三种角色的路径

方法学研究者关心的是估计器与判据。最短路径是直接取几条序列,用自建的标度估计器做条件内与条件间对比,重点看自由与节拍的分叉是否稳定。这条路径不需要任何预处理,也不需要关心受试者人口学。

运动控制研究者关心的是节律机制。最短路径是先复现原文的群体结论,再读 2009 年的重分析,理解两种读法的分歧点在哪里,然后决定自己的分析站在哪一边。这条路径需要读两篇论文,但不需要写太多代码。

教学者关心的是让学生第一次接触分形时间序列。最短路径是把六十个文件发给学生,让他们自己发现自由条件与节拍条件的差别。这条路径不需要任何背景知识,只需要一个能画图的工具。

角色 最短路径 需要预先读的材料 常见卡点
方法学研究者 取序列,跑标度估计,比较条件 原文方法与 2009 年重分析 窗口长度设置不统一导致结论不稳
运动控制研究者 复现群体结论,辨析两种读法 两篇论文的讨论部分 把节拍条件的反相关误读为无相关
教学者 分发文件,让学生自己画图 无需 学生默认所有条件等长
数据工程 整理成长表,建立读取管线 文件命名规则 扩展名与条件映射靠猜
临床研究者 借用方法,不借用数值 需先了解健康参照的年龄性别局限 误把健康年轻人的值当通用基线

9.2 一条最短的可用流程

若只想要一个能跑通的最小闭环,下面四步足够,全部在一分钟内完成:

#-- 第一步:取一个文件,确认能读
mkdir -p ~/umwdb_demo && cd ~/umwdb_demo
curl -s -o si01.norm https://physionet.org/files/umwdb/1.0.0/si01.norm
curl -s -o si01.metnrm https://physionet.org/files/umwdb/1.0.0/si01.metnrm

#-- 第二步:确认行数与数值范围,判断是否能直接用
wc -l si01.norm si01.metnrm
awk 'BEGIN{mn=999;mx=0}{if($1<mn)mn=$1;if($1>mx)mx=$1}END{print mn, mx}' si01.norm
import numpy as np

def read_series(path):
    with open(path, encoding="utf-8") as fh:
        return np.array([float(x) for x in fh.read().split()])

free = read_series("si01.norm")
met = read_series("si01.metnrm")

#-- 先做一件最便宜的事:看两个条件的一阶差分方差比,判断平滑程度是否不同
print("free  n=%d  mean=%.3f  lag1corr=%.3f" % (len(free), free.mean(), np.corrcoef(free[:-1], free[1:])[0, 1]))
print("met   n=%d  mean=%.3f  lag1corr=%.3f" % (len(met), met.mean(), np.corrcoef(met[:-1], met[1:])[0, 1]))

这段代码只算一阶自相关,是一个粗筛而不是结论。它能立刻显示两个条件的相邻步依赖方向是否不同,若自由条件为正、节拍条件接近零或为负,就与原文的定性描述一致。确认这一步之后,再上完整的标度估计。

9.3 引用方式

引用这份数据应当同时给出两条:数据集本身的 DOI,以及原始论文。只引论文会让数据来源不可追溯,只引数据集会让方法学依据缺失。组织名写 PhysioNet,版本号写 1.0.0,访问日期写明。

Hausdorff JM. Long-term Recordings of Gait Dynamics (version 1.0.0).
PhysioNet. 2001. doi:10.13026/C28679.
Available from: https://physionet.org/content/umwdb/1.0.0/

Hausdorff JM, Purdon PL, Peng CK, Ladin Z, Wei JY, Goldberger AL.
Fractal dynamics of human gait: stability of long-range correlations
in stride interval fluctuations. J Appl Physiol. 1996;80(5):1448-1457.
doi:10.1152/jappl.1996.80.5.1448

PhysioNet 另有平台层面的统一引用要求,多数期刊在方法学部分会要求同时标注平台。具体格式以投稿期刊的要求为准,上面两条是最小充分集。许可为 ODC-By 1.0,署名即可使用,包括商用;但署名不等于背书,不得暗示原作者认可你的结论。

9.4 数据处理的三个约定

第一个约定是关于缺失值。文件里没有缺失标记,但这不代表没有异常步。实际序列中可能出现明显偏离的极值,通常是受试者调整、避让或记录错误。是否剔除、如何剔除,必须在方法里写明,不能默认「干净」。

第二个约定是关于长度。六个条件不等长,跨条件比较时应先决定是对齐到共同长度,还是保留全长但改用对长度不敏感的统计量。两种做法都会影响结论,不能含糊带过。

第三个约定是关于单位。文件里是秒,但没有任何声明。若与其他以毫秒为单位的数据合并,必须先统一,否则会出现量级错误。这类错误在合并多源数据时很常见,且一眼看不出来。

§10 AI 使用声明

项目 声明内容
本页信息来源 PhysioNet 数据集主页与文件页、Europe PMC 收录的两篇论文摘要
是否下载全量数据做统计 否,规模与结构数字取自官方页面表述
数字口径 受试者数、条件数、文件数、体积为官方页面原值;步数为推断,已在正文标明
推测部分标注 场地长度两个取值的原因、节拍条件步数偏少的原因均为推断,未核实
未使用的手段 未使用生成式模型补全数据,未做任何数据增强
可能的错误类型 版本差异、页面表述更新、以及在推断处过度具体化
复现建议 引用前请对照官方页面与 DOI 页面,确认版本与许可未变
免责 本页不构成临床使用建议,数据本身不含任何诊断信息

常见误读(避坑清单)

说法 实际 证据
这是一个大规模步态数据集 只有十名受试者,六十条序列 官方页面列出的受试者与文件数量
它包含原始开关信号 只发布切分后的步间期数值 文件内容为每行一个浮点数
六个条件都是一小时等长 页面写约一小时,且文件体积差异明显 文件大小与页面「约 1 小时」的表述
节拍条件只是速度不同的自由行走 外部节律改变的是动力学性质,不是速度标签 原文对两种条件相关性的对比结论
可以直接拿来做跌倒预测 无跌倒记录、无随访、无老年受试者 受试者条件与数据字段
有现成的训练测试划分 没有任何划分文件或划分说明 文件清单只有数据与校验和
数据已经过预处理与去噪 是原始步间期,未做去趋势 页面未提及任何预处理步骤
许可限制商用 ODC-By 1.0 允许商用,仅要求署名 官方许可标注
节拍条件的序列可以当自由条件的补充样本 两类条件在设计上对立,混用会抹平差异 原文的对比设计与结论
平均 21.7 岁可以当每个人的年龄 只有群体均值与范围,无逐人值 页面仅给汇总统计

FAQ

Q1:这套数据和常见的步态惯性传感器数据集有什么本质差别?
常见数据集给的是连续波形,采样率几十到几百赫兹,可以重建步态周期;UMWDB 给的是已经切好的步间隔,每个步只留一个标量。前者能回答「这一步的姿态如何变化」,后者只能回答「这一步比上一步慢了多少」。两者不可互相替代,选型时应先确认研究问题落在哪一层。

Q2:十个人的数据能用来训练深度模型吗?
不能用于以人为单位的监督学习,因为跨人样本只有个位数。它的合理用法是把每条序列内部的上千个步当作时间轴样本,做标度分析、变点检测或序列生成。若一定要训练,只能做单人单条件的自回归或扩散建模演示,不能声称具备人群泛化能力。

Q3:为什么文件里没有时间戳?
因为记录单位本身就是时间,每行数值就是相邻两次落足之间的秒数,行号即时间顺序。需要绝对时刻时自行累加前缀和即可,但累加会放大取整误差。页面没有声明数值精度,所以累加得到的绝对时刻只宜在秒级使用。

Q4:节拍条件的序列能当作慢速或快速行走的例子吗?
形式上速度相近,但动力学性质相反。自由行走呈长程正相关,节拍行走呈反相关或近似无相关。把两类混在一起做统计,会把设计上刻意制造的对立抹平,得到一组既不像自由也不像节拍的平均结果。

Q5:可以直接用于临床辅助诊断吗?
不可以。全部受试者是无病史的健康年轻男性,数据集中不含患者、诊断或严重度标签。它适合做健康基线的参照,不适合作为诊断模型的标签来源,也不构成任何医疗器械软件的证据链。

Q6:数据量这么小,还有必要用吗?
当需要一份干净、无争议、许可宽松的健康步态基准时仍然值得用。它的价值不在规模,而在条件设计完整:同一批人同时提供三种自由步速与三种节拍步速,这种受试者内对照在后续公开数据里并不多见。

Q7:数值单位是什么,为什么文件里没写?
单位是秒,来自网页正文的描述,文件本身不含单位声明。使用前应把它写进自己的数据字典,避免与毫秒级数据合并时出现量级错误。这个缺陷在 2001 年的托管模式下很常见,不是个别现象。

Q8:为什么同一个人的六个文件大小差这么多?
自由条件的文件普遍更大,节拍条件约小一半。体积差主要来自步数差,而步数差可能来自记录时长不同,也可能来自有效步的筛选。页面没有逐文件说明原因,因此只能作为结构提示,不能当作结论。

Q9:原文说节拍行走时相关消失,这个结论现在还有效吗?
作为原文的表述仍然有效,但它不是唯一读法。后续有研究用不同模型重新分析同一批数据,认为相关没有消失而是转为反持续。两种读法共享同一批序列,分歧在方法与解释层面。引用时最好同时提及。

Q10:怎么判断我的标度估计器写得对不对?
先在一个已知性质的人工序列上验证,例如生成一个已知指数的分数高斯噪声,看估计器能否还原。再把 UMWDB 的自由与节拍条件跑一遍,看是否出现方向一致的分叉。两步都通过,才谈得上对真实数据的结论。

Q11:有没有官方的读取代码或基线模型?
没有。发布包里只有数据文件、校验和与示意图,没有脚本。读取逻辑非常简单,任何语言三行就能完成,因此缺少官方代码并不会造成实际障碍,但也没有现成的基准结果可比对。

Q12:如果我要引用它,最少需要写什么?
数据集 DOI、版本号 1.0.0、平台名 PhysioNet、访问日期,以及 1996 年原始论文。四者缺一都会让溯源链断裂。许可为 ODC-By 1.0,署名即可,但署名不表示原作者认可你的结论。

术语表

术语 英文 含义
步间期 stride interval 相邻两次同侧足跟着地之间的时间,本数据的基本单位
步周期 gait cycle 一个完整步态循环,与步间期在时长上对应
力敏开关 force sensitive switch 受压时通断的薄膜开关,贴于鞋内用于检测落足
自由行走 self-paced walking 由受试者自行决定步速,无外部节律
节拍器行走 metronomic walking 按外部设定频率行走,节律由设备决定
长程相关 long-range correlation 相隔很远的样本之间仍有统计依赖
反相关 anti-correlation 相邻或近邻样本倾向于反向变化
幂律衰减 power-law decay 相关随间隔以幂函数速度缓慢下降
自相似 self-similarity 不同时间尺度上的统计形态相似
分形 fractal 具有自相似结构的几何或统计对象
去趋势波动分析 detrended fluctuation analysis 去除局部趋势后计算涨落随尺度变化的斜率
标度指数 scaling exponent 涨落与尺度在对数坐标下的斜率
Hurst 指数 Hurst exponent 衡量长程记忆强度的指标,与标度指数相关但不等同
分形维数 fractal dimension 描述结构复杂度的维度度量
Higuchi 维数 Higuchi dimension 一种基于序列路径长度的分形维数估计
白噪声 white noise 样本间完全无相关的随机序列
分数高斯噪声 fractional Gaussian noise 带长程相关的平稳高斯过程
自回归分数整合滑动平均 ARFIMA 兼顾短程与长程相关的线性模型
传输量 increment 相邻样本之差,常用来判断平稳性
受试者内设计 within-subject design 同一受试者在多种条件下重复测量
外部效度 external validity 结论能推广到研究条件之外的程度
开放数据共用许可 ODC-By 要求署名的开放数据许可,允许商用
数字对象标识符 DOI 数据或文献的持久标识
波形级数据 waveform-level data 按固定采样率记录的连续信号
事件级数据 event-level data 只记录事件发生时刻或间隔的数据

附录 A:核心数字核对表

项 值 来源 来源层级
受试者人数 10 名健康男性 数据集页面正文 官方页面
年龄段 18–29 岁,均值 21.7 数据集页面正文 官方页面
身高体重 1.77 ± 0.08 米;71.8 ± 10.7 千克 数据集页面正文 官方页面
行走条件数 6 种 数据集页面正文 官方页面
数据文件数 60 个 文件清单 官方页面
辅助文件数 3 个 文件清单 官方页面
未压缩体积 1.1 MB 数据集页面正文 官方页面
每条件时长 约 1 小时 数据集页面正文 官方页面
步道长度 225 米或 400 米 数据集页面正文 官方页面
首发日期 2001-08-16 数据集页面版本信息 官方页面
当前版本 1.0.0 数据集页面版本信息 官方页面
数据集 DOI 10.13026/C28679 数据集页面 官方页面
许可 ODC-By 1.0 数据集页面许可区 官方页面
论文期刊卷页 J Appl Physiol 80:1448-1457 论文摘要元数据 论文摘要
论文发表年 1996 论文摘要元数据 论文摘要
长程相关可持续步数 约 1000 步 数据集页面正文与论文摘要 官方页面
节拍条件相关性质 反相关,相关消失 数据集页面正文 官方页面
重分析年份 2009 论文摘要元数据 论文摘要
单个文件步数 未逐文件公布 无 未核实
数值精度 未声明 无 未核实

附录 B:数字的来源分层

第一层是官方页面可直接引用的数字:受试者人数、年龄段、身高体重汇总、条件数、文件数、总体积、时长、场地长度、版本日期、DOI、许可。这些数字在页面上一一对应,引用时不需要任何推断,出错概率最低。

第二层来自论文摘要:期刊卷页、发表年份、作者名单、实验结论的定性表述、长程相关持续约一千步的量级。摘要可公开获取,但摘要之外的图表与逐人结果需要订阅或原文,本页未采用。

第三层是未核实或推断的部分:逐文件步数、文件内数值精度、225 米与 400 米两个长度的逐人归属、节拍条件体积偏小的具体原因。这些内容在正文中已明确标注为推断,不应作为事实引用。

层级 内容类别 可信度 使用建议
官方页面 规模、结构、许可、版本 高 可直接引用,注明访问日期
官方页面 场地两个长度未逐人说明 中 引用时保留「两个取值」原话
论文摘要 结论定性、卷页年份 高 可引用,需与全文核对细节
论文摘要 逐人标度数值 低 摘要未给出,不采用
推断 逐文件步数、时长差异原因 低 只作结构提示,不作结论
未核实 数值精度、缺失约定 低 使用前自行检查文件

附录 C:完整参考文献

Hausdorff JM, Purdon PL, Peng CK, Ladin Z, Wei JY, Goldberger AL. Fractal dynamics of human gait: stability of long-range correlations in stride interval fluctuations. Journal of Applied Physiology. 1996;80(5):1448-1457. doi:10.1152/jappl.1996.80.5.1448. PMID 8727526.

Hausdorff JM. Long-term Recordings of Gait Dynamics (version 1.0.0). PhysioNet. 2001. doi:10.13026/C28679. Available from: https://physionet.org/content/umwdb/1.0.0/

Delignières D, Torre K. Fractal dynamics of human gait: a reassessment of the 1996 data of Hausdorff et al. Journal of Applied Physiology. 2009;106(4):1272-1279. doi:10.1152/japplphysiol.90757.2008. PMID 19228991.

Phinyomark A, Larracy R, Scheme E. Fractal analysis of human gait variability via stride interval time series. Frontiers in Physiology. 2020;11:333. doi:10.3389/fphys.2020.00333. PMID 32351405.

Goldberger AL, Amaral LAN, Glass L, Hausdorff JM, Ivanov PC, Mark RG, Mietus JE, Moody GB, Peng CK, Stanley HE. PhysioBank, PhysioToolkit, and PhysioNet: components of a new research resource for complex physiologic signals. Circulation. 2000;101(23):e215-e220. 平台层面的背景文献,说明 PhysioNet 的资源组织方式。

Peng CK, Buldyrev SV, Havlin S, Simons M, Stanley HE, Goldberger AL. Mosaic organization of DNA nucleotides. Physical Review E. 1994;49(2):1685-1689. 去趋势波动分析的方法来源,理解标度指数含义时需读。

附录 D:分析任务代码

下面给出一段完整脚本,把下载、整理、标度估计、条件对比连成一条流水线。它把前面各节的片段合并在一起,可以直接作为项目的起点:

import glob
import os
import re
import subprocess

import numpy as np
import pandas as pd

WORK = os.path.expanduser("~/umwdb_pipeline")
os.makedirs(WORK, exist_ok=True)
ROOT = os.path.join(WORK, "1.0.0")

#-- 第一步:若本地还没有数据,就取全量并解压
if not os.path.isdir(ROOT):
    zpath = os.path.join(WORK, "umwdb.zip")
    subprocess.run(["curl", "-fL", "-o", zpath,
                    "https://physionet.org/content/umwdb/get-zip/1.0.0/"], check=True)
    subprocess.run(["unzip", "-q", zpath, "-d", WORK], check=True)

COND = {"norm": "free_normal", "slow": "free_slow", "fast": "free_fast",
        "metnrm": "metronome_normal", "metslw": "metronome_slow",
        "metfst": "metronome_fast"}

def load_long(root):
    rows = []
    pat = re.compile(r"(si\d{2})\.(norm|slow|fast|metnrm|metslw|metfst)$")
    for path in sorted(glob.glob(os.path.join(root, "si*.*"))):
        m = pat.search(os.path.basename(path))
        if not m:
            continue
        with open(path, encoding="utf-8") as fh:
            vals = [float(x) for x in fh.read().split()]
        fam = "metronome" if m.group(2).startswith("met") else "free"
        for i, v in enumerate(vals, 1):
            rows.append((m.group(1), COND[m.group(2)], fam, i, v))
    return pd.DataFrame(rows, columns=["subject", "condition", "family", "step", "interval_s"])

def dfa_alpha(x, min_win=4, max_frac=0.25, n_scale=16):
    x = np.asarray(x, dtype=float)
    y = np.cumsum(x - x.mean())
    top = max(min_win * 2, int(len(x) * max_frac))
    scales = np.unique(np.round(np.logspace(np.log10(min_win), np.log10(top), n_scale)).astype(int))
    lx, ly = [], []
    for n in scales:
        k = len(y) // n
        if k < 2:
            continue
        seg = y[:k * n].reshape(k, n)
        t = np.arange(n)
        a, b = np.polyfit(t, seg.T, 1)
        trend = a[:, None] * t[None, :] + b[:, None]
        lx.append(np.log(n))
        ly.append(np.log(np.sqrt(((seg - trend) ** 2).mean())))
    return float(np.polyfit(lx, ly, 1)[0])

df = load_long(ROOT)
res = []
for (subj, cond), g in df.groupby(["subject", "condition"]):
    x = g.sort_values("step")["interval_s"].to_numpy()
    res.append((subj, cond, len(x), dfa_alpha(x)))

alpha = pd.DataFrame(res, columns=["subject", "condition", "n_steps", "alpha"])
print(alpha.pivot(index="subject", columns="condition", values="alpha").round(3))
print(alpha.groupby("condition")["alpha"].median().round(3))
alpha.to_csv(os.path.join(WORK, "alpha_by_condition.csv"), index=False)

脚本输出的第一张透视表是十个人乘六条件的标度估计,第二张是六条件的中位数。前者用来发现个别受试者是否与群体方向不一致,后者用来给出条件层面的整体判断。两张表都应保存,因为论文里通常需要同时报告个体与群体。

使用时有三点需要注意。第一,十个人乘六条件只有六十个估计值,任何「显著性」都需要谨慎解释,不宜用面向大样本的检验。第二,中位数比均值更能代表条件层面,因为个体估计的尾部可能很长。第三,若要把结果与原文比较,必须先确认窗口设置是否可比,否则数值差异无从归因。

附录 E:如果只记五件事

第一件事:它到底是什么。十名健康年轻男性、每人六种行走条件、共六十条一小时的步间期序列,纯文本,一点一兆字节,ODC-By 许可,免费下载。

第二件事:它的核心设计。同一批人在自由与节拍两种节律下各走三种速度,构成受试者内对照。这是它最不可替代的部分,也是最容易被误用的部分。

第三件事:它能回答什么。步间期序列的标度性质、自由与节拍条件的动力学差异、标度估计方法在真实数据上的表现。这些都是方法学问题,不是临床问题。

第四件事:它不能回答什么。任何涉及性别、年龄、患病状态、真实环境步态、诊断或预后的分析,都超出它的能力范围,且没有补救手段。

第五件事:怎么用最省事。直接把文本读成数组,跳过所有关于元数据的纠结;先算一阶自相关做粗筛,确认方向后再上完整标度估计;结论只说到条件层面,不说到人群层面。

编辑说明

本页核验时间为 2026 年 10 月。核验方式为访问 PhysioNet 数据集主页与文件页,读取页面正文中的受试者描述、条件定义、文件清单、体积与许可信息;另经 Europe PMC 检索接口取得 1996 年原始论文、2009 年重分析与 2020 年方法学综述的摘要元数据。未下载全量数据做逐文件统计,因此逐文件步数、数值精度、两个场地长度的逐人归属三项列为未核实。

页面正文与论文摘要之间存在一处需要保留的口径差异:页面描述节拍行走时步间期波动为反相关,摘要描述为随机无相关且非分形。本页按页面表述为主、摘要表述为辅处理,并在正文中指出这一差异,未做统一化改写。

本页所有推断均已就地标注。凡出现「推断」「可能是」「未声明」字样的句子,都不应作为事实引用。若官方页面后续更新,请以更新后的页面为准,并核对该页引用的版本号是否为 1.0.0。


相关数据集导航

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

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

返回 AI-Ready 数据集