信息速览
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 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- music-motion-2012 — 共享标签:生理信号 / 步态与运动
- torgo — 共享标签:生理信号 / 步态与运动
- hbedb — 共享标签:生理信号 / 步态与运动
- mouse-stroke-cylinder-rearing — 共享标签:生理信号 / 步态与运动
- music-motion-2015 — 共享标签:生理信号 / 步态与运动
- ua-speech — 共享标签:生理信号 / 步态与运动
- gaitndd — 共享标签:生理信号 / 步态与运动
- minute-level-step-count-nhanes — 共享标签:生理信号 / 步态与运动
- ppg-dalia — 共享标签:生理信号 / 步态与运动
- culm — 共享标签:生理信号 / 步态与运动
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

