十五个人走出的分形 — gaitdb 步幅间隔库

15 人三组 / 9,144 个步幅 / 300 Hz 鞋内压阻

来源 https://physionet.org/content/gaitdb/1.0.0/发布时间: 2026-10-28最后更新: 2026-10-28 阅读 11
十五个人走出的分形 — gaitdb 步幅间隔库

信息速览

数据集名称十五个人走出的分形 — gaitdb 步幅间隔库
数据类型时序信号,元数据,文献引用,原始数据链接
规模15 名受试者 / 15 条记录
接入方式https://physionet.org/content/gaitdb/1.0.0/
AI 就绪度

步态研究里有一个反直觉的事实:一个人走路时每一步都略有不同,这种不同不是噪声。健康人的步幅时长序列在几百拍的尺度上仍然彼此相关,呈现出缓慢漂移的长程结构;这种结构在衰老与某些神经系统疾病中会变平。要观察它,不需要高精度力学,只需要一条足够长、足够干净的节拍序列。

gaitdb 就是围绕这条序列做的。2000 年 10 月,PhysioNet 上线了这份十五人的小合集:五名健康青年、五名健康老年、五名帕金森病患者,鞋里放两片超薄压阻薄膜,踝上挂一台便携微电脑,以 300 Hz 记录足底受力,事后换算成每一次落地的时刻。公开发布的成品只有两列——时间戳与步幅时长。

它的特别之处不在于测了什么,而在于删掉了什么:没有波形、没有关节角度、没有临床量表,全部文件加起来不到四百 KB。正因为删得干净,它成了步态节律分析里被反复调用的那把小尺子。一屏速览见下表。

维度 内容
全名 Gait in Aging and Disease Database(项目名 gaitdb,页面未给通用缩写)
发布方 PhysioNet(MIT 计算生理学实验室维护)
署名作者 Jeffrey Hausdorff、Patrick Purdon、Chung-Kang Peng
页面署名机构 Beth Israel Hospital, Boston, MA, USA
首次发布 2000 年 10 月 13 日,版本 1.0.0,此后无更新
受试者 15 名:青年 5、老年 5、帕金森病 5
年龄 青年 21 至 29 岁;老年 71 至 77 岁;帕金森病 60 至 77 岁
记录数 15 条,一受试者一条,无重复会话
步幅总数 9,144 个(健康组每条 709 至 892,帕金森组 203 至 288)
采集设备 鞋内超薄压阻式力敏电阻 + 踝部便携微电脑
采集参数 300 Hz 采样,12 位模数转换
发布粒度 每次足跟着地一行,两列:时间(秒)、步幅时长(秒)
行走协议 健康组绕近似圆形路径约十五分钟;帕金森组沿长走廊往返约六分钟
文件格式 制表符分隔文本;另附 PhysioBank 注释 .str 与头文件 .hea
体积 未压缩 354.6 KB;gait-data.tar.gz 为 47 KB
许可 ODC 署名 1.0(ODC-BY 1.0),免注册下载
DOI 10.13026/C2C889

§1 它要解决的具体麻烦

1.1 步态的时间结构需要一个公共样本

二十世纪九十年代中期的步态分析有两个传统。一个是运动学传统,用摄像机与标记点算关节角度;一个是动力学传统,用测力台算地面反力。两者都昂贵、都绑在实验室里、都需要受试者按固定步速在固定长度的跑道上走。它们擅长回答"这一步的形态如何",不擅长回答"这一千步之间的节律如何演化"。

后一个问题需要的是长序列。步幅时长的长程相关性,也就是相邻几百步之间是否还保留统计依赖,只有在几百到上千拍的连续记录里才看得出来。这类分析对传感器的精度要求其实很低:只要能把每次着地的时刻定到几毫秒,就足够;而对连续性和长度要求很高:不能中断、不能换设备、不能让受试者走走停停。

gaitdb 正是为了补这个缺口。它把采集成本压到极低:两片压阻薄膜、一台踝部微电脑,受试者可以绕着一块空地一直走。代价是它放弃了所有形态信息,只留下时间。这个取舍决定了它后来的一切用途与一切局限。

把四条路线并排看,取舍很清楚。光学运动捕捉用多台红外相机与反光标记算关节角度,擅长单步之内的关节协调,却很难让受试者连续走上千步,因为标记点会松、相机会丢。测力台埋在地面,擅长单步的力与力矩波形,但受台面长度限制,只能测几步。阵列式压力鞋垫能给出足底分区受力,长时间连续记录的成本却迅速上升。便携压阻加事件检测是第四条路:精度最低,只保留时刻,但能让人自由地一直走。gaitdb 走的就是第四条,并且比同类更彻底——它连波形也不发布,只发事件序列。

1.2 三条常见的错误期待

第一条,期待它是"步态信号数据集"。它发布的是派生量,不是信号。300 Hz 这个数字只描述采集端,公开文件里没有一个采样点属于原始波形。想用它做步态周期分割、做足底压力峰值检测、做深度学习里的原始序列建模,第一步就会卡住。

第二条,期待它是一份"帕金森病对照研究"。三组各五人,且健康组与患者组的行走时长和路线都不同。它能支持"这三个小样本的节律结构看起来不一样",不能支持"帕金森病导致节律结构改变"这种因果或群体层面的结论。

第三条,期待它是"研究级数据库"。随包 README 的第一段就写明,这批数据是为 1999 年 10 月的一次课程整理的教学材料,不面向基础研究与论文发表。这句话与同一页面列出的三篇期刊论文并存,构成官方口径内部的一处张力,使用时需要自己判断(§7.2)。

1.3 它能给到的与给不到的

你的需求 它给的 够不够
验证一套步幅序列的长程相关算法 15 条长度在数百拍的连续序列,无缺失、无中断 够,这是它最本分的用途
教学演示"分形"在生理信号里长什么样 两列文本,Excel 都能打开,一分钟上手 够,且比任何合成数据更有说服力
比较青年、老年、帕金森病三组的节律 三组各五条记录,组标签写在文件名里 勉强,只能做描述与效应量估计
复现 1996 年那篇分形动力学论文的图 同一批受试者的自选步速序列 部分够,节拍器条件下的数据不在其中
训练步态识别或疾病分类模型 每组五人的标签 不够,样本量与标签粒度都不成立
从原始波形重算着地时刻 只有着地时刻本身 不够,波形未公开
研究步态对称性、关节协调、足底压力分布 只有一个标量序列 不够,维度上就不支持
分析步速对节律的影响 无步速标注,无距离标注 不够,只能假定自选步速近似恒定

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

你的处境 它能帮你什么 下一步该做什么
你写了一个新的长程相关估计量,需要一个短而干净的公开序列做对照 提供 15 条数百拍、无缺失的节律序列,任何人可复算 先用去趋势波动分析跑一遍官方口径,再报告你的估计量与它的差异
你在教时间序列课,想找一个真实又小的例子 两列文本、不到四百 KB、十五个文件,课堂上一分钟能跑完 用 §5.3 的读法,把一条序列画出来,再讲标度指数
你在设计可穿戴步态研究,想知道最低可行方案 展示了一套只用事件时刻就能做的分析 明确你的采集端采样率与着地判定阈值,这两项决定可比性
你要写方法学论文的"数据来源"一节 有 DOI、有许可、有三篇原始论文可引 按 §9.3 的格式同时引数据与论文,别只引平台
你在做康复节律刺激的预实验 提供正常与病理节律的基线参照 只把它当参照,别当疗效对照,它没有干预与随访
你想验证自己的着地检测算法 没有原始波形,无法直接验证 换用提供原始力信号的库,本库帮不上

1.5 一句话判断

它是一把只有刻度的尺子:没有波形、没有临床、没有随访,但把"每一步用了多久"这件事记得足够长、足够干净,长到能看见分形。

1.6 不适合谁:四条边界

不适合做需要原始信号的任务。 300 Hz 的力信号在采集端存在过,但没有随数据公开。任何以原始波形为输入的方法——卷积网络、峰值检测、步态相位分割——在这份数据上都无法开展。

不适合做组间统计推断。 每组五人。即便把每条记录当成一个样本,组间比较的置信区间也会宽到没有实用价值;若按步幅行数当样本量,则会把同一人的数百拍当成数百个独立个体,效应量被系统性放大。

不适合做临床或转化结论。 没有病程、无用药、无量表、无随访,连帕金森病患者的用药状态(是否处于"开期")都未记录。多巴胺能药物对步态节律的影响很大,这一项缺失使病理组的内部分布无法解释。

不适合当机器学习基准。 十五个人、三个类别、一个标量通道。任何模型都能在几轮内记住全部受试者。以它为主结果报告的准确率,测的是记忆能力。

§2 数据构成与规格

2.1 一条记录就是一个文件

整个合集没有子目录,也没有总表。十五名受试者对应十五个文本文件,文件名自带分组与年龄:o 开头是健康老年,y 开头是健康青年,pd 开头是帕金森病;o 与 y 的文件名还带年龄,例如 o1-76-si 表示老年组第一号、七十六岁,y4-21-si 表示青年组第四号、二十一岁。帕金森病组的文件名不带年龄,只有序号。

后缀 si 是 stride interval 的缩写,同时出现在文件名与注释通道名里。这个约定很省事:看文件名就知道组别,不需要另查表。

文件 内容 格式 是否必需
o1-76-si.txt 等十五个 两列:时间、步幅时长 制表符分隔文本 必需,最常用的入口
o1_76_si.hea 等十五个 注释头文件,声明时基 单行纯文本 用注释格式时必需
o1_76_si.str 等十五个 步幅注释,二进制 PhysioBank 注释 用注释格式时必需
RECORDS 十五个记录名,一行一个 纯文本 可选,脚本遍历用
ANNOTATORS 注释通道声明:str 对应步幅 纯文本 可选
README 采集说明与参考文献 纯文本 建议读,边界条件都在这里
gait-data.tar / .tar.gz 全部文件的打包 tar / gzip 可选,整包下载用
SHA256SUMS.txt 校验和 纯文本 可选,校验完整性

注意文本文件与注释文件的名字不完全一样:文本用连字符 o1-76-si.txt,注释用下划线 o1_76_si.str。批量脚本里如果按同一套命名拼接路径,会在第二个格式上全部 404。

2.2 字段与记录的完整字典

文本只有两列,没有表头。第一列是时间,单位秒,从记录开始计;第二列是步幅时长,单位秒,指同一只脚连续两次着地之间的间隔。两列的关系是累积的:下一行的时间约等于上一行时间加本行步幅时长,差额来自两侧步幅的交替。

列序 名称 单位 含义 取值示例
1 time 秒 本次着地距记录开始的时刻 30.843
2 stride_interval 秒 本次着地距同侧脚上一次着地的时间 1.123

文件层面的元信息不在文件里,而在文件名与官方页面上。把十五个文件的这一层元信息集中起来,就是下面这张清单。

记录名 组别 文件名中的年龄 步幅行数
y1_23_si 健康青年 23 730
y2_29_si 健康青年 29 806
y3_23_si 健康青年 23 816
y4_21_si 健康青年 21 709
y5_26_si 健康青年 26 752
o1_76_si 健康老年 76 815
o2_74_si 健康老年 74 720
o3_75_si 健康老年 75 892
o4_77_si 健康老年 77 877
o5_71_si 健康老年 71 806
pd1_si 帕金森病 未记录 222
pd2_si 帕金森病 未记录 263
pd3_si 帕金森病 未记录 203
pd4_si 帕金森病 未记录 288
pd5_si 帕金森病 未记录 245

这张表不是统计结果,是清单加一个可以直接数出来的量:行数。它暴露了三件事。第一,健康组的序列长度是帕金森组的三倍左右,因为走的分钟数不同。第二,十条健康记录的起始时间都落在三十点零二秒到三十点九六秒之间,说明前三十秒被当作热身截掉了;末行时间落在八百六十八点九秒到八百六十九点九秒之间,说明十五分钟的行走里最后半分钟也未纳入。第三,帕金森记录从二十一点七七秒到二十二点九八秒之间起始、在二百九十八点五秒到二百九十九点六秒之间结束,对应六分钟协议同样做了首尾截断。

字段的取值边界也要说清楚,否则容易读错。

字段 下限 上限 说明
时间 约 21.8 秒 约 869.9 秒 首值不为零,前段被截去
步幅时长 小于一秒 接近两秒 正常成人在舒适步速下约一秒出头
行数 203 892 与行走时长直接相关
小数位 三位 四位 帕金森组文件给到四位小数

2.3 一条记录的完整解剖

以青年组第四号 y4-21-si.txt 为例,也就是 §4.2 的案例所用的那一条。文件共 709 行,无表头,两列以制表符分隔,第一行的时间是 30.843 秒。下面是文件开头六行的原样内容。

30.843	1.123
31.967	1.150
33.117	1.137
34.253	1.153
35.407	1.130
36.537	1.160

读这六行能看出三件事。第一,时间差不等于上一个步幅时长:31.967 减 30.843 得 1.124,而第一行的步幅时长写作 1.123,差一毫秒,属于舍入。这说明时间列是由累积值生成后再四舍五入到毫秒,而不是逐行相加得到。第二,步幅时长在这一小段里围绕一点一秒缓慢起伏,这正是后面所有长程分析要处理的对象。第三,两列都是浮点,没有单位列,单位只能从 README 得知。

同样的数据在注释格式下是另一副样子。头文件只有一行,内容如下。

y4_21_si 0 250 0

这一行的四个字段依次是记录名、信号通道数、采样率、每通道采样点数。通道数与采样点数都是零,说明它不是信号记录,而是纯注释记录:数据体只有事件,没有波形。采样率位置写的 250 是注释的时基,按 PhysioBank 约定,注释里的时刻以采样点计数,除以 250 才是秒。用读信号的函数打开它会得到空数组,必须改用读注释的函数(§5.4)。

#-- 看一条记录的原文与前六行
curl -sL https://physionet.org/files/gaitdb/1.0.0/y4-21-si.txt | head -n 6

#-- 看它的注释头文件,注意第二个与第四个字段都是 0
curl -sL https://physionet.org/files/gaitdb/1.0.0/y4_21_si.hea

#-- 数一下这条记录有多少个步幅
curl -sL https://physionet.org/files/gaitdb/1.0.0/y4-21-si.txt | wc -l

2.4 三组与两套采集协议

三组的差别不只在疾病,还在协议。健康受试者绕近似圆形的无障碍路径连续行走约十五分钟;帕金森病受试者沿一条长走廊往返行走约六分钟。这两件事对序列的影响完全不同:绕圈意味着持续同向转弯,往返意味着周期性掉头,转弯与掉头都会在步幅序列里留下结构性的节律,而它与疾病无关。

组别 人数 年龄 路线与时长 序列长度
健康青年 5 21 至 29 岁 近似圆形路径绕圈,约十五分钟 709 至 816 拍
健康老年 5 71 至 77 岁 近似圆形路径绕圈,约十五分钟 720 至 892 拍
帕金森病 5 60 至 77 岁 长走廊往返,约六分钟 203 至 288 拍

这张表里最该被记住的是第四列与第五列。它们意味着任何跨组的节律比较都同时改变了三个变量:疾病、年龄、路线与时长。官方没有把它设计成析因实验,也没有声称过它是。使用者的正确姿势是把它当三组各自独立的样本,而不是一次对照试验。

年龄区间还有一处需要留意:老年组是 71 至 77 岁,帕金森组是 60 至 77 岁,两者大面积重叠。也就是说,"老年"与"帕金森病"在这份数据里不是正交的两个因素,无法用简单相减的方式把疾病效应从年龄效应里剥出来。

2.5 与同类资源的字段差异

把 gaitdb 放到公开步态资源的谱系里,它处在最"瘦"的一端:只有时间,没有形态。

资源类型 典型字段 采样粒度 gaitdb 的差异
原始力信号库 多通道垂直地反力波形 每毫秒一点 只给每次着地的时刻与间隔
惯性传感器库 三轴加速度、角速度 数十至数百赫兹 无波形,无 IMU
光学动捕库 关节三维坐标 每秒上百帧 无空间信息
压力鞋垫库 足底分区压力图 每帧一张图 只有单标量序列
临床步态评分库 量表与计时起立行走 每次评估一个分数 无评分、无临床变量
gaitdb 时间、步幅时长 每一步一行 维度最低、连续性最好

维度低在这里不是缺点。步幅序列的所有经典分析——去趋势波动分析、重标极差、自相关、谱估计——都只需要一个标量序列和一个可靠的时间轴。维度低反而消除了模态对齐、通道选择、预处理口径这些常见分歧,使不同课题组的数字更容易放在一起比较。

2.6 体积换算与"够不够算"

合集小到可以忽略存储,但小不等于不够用。判断标准不是文件多大,而是序列多长。按官方页面的账,整包未压缩合计三百五十四点六 KB,其中 tar 包 150 KB、gzip 包 47 KB、页面提供的 ZIP 为 363.8 KB;十五条文本各三到十二 KB,合计一百多 KB;十五条注释各数百字节,合计约二十 KB。剩下的体积来自 README、清单与校验和。

去趋势波动分析这类方法的经验要求是序列长度至少几百点,标度区间通常取四到十六分之一的全长。青年组最短的一条有七百零九拍,最长的一条有八百九十二拍,都落在可用范围内;帕金森组最短的一条只有二百零三拍,标度区间的可选范围就明显变窄。这一点在跨组比较标度指数时经常被忽略:长度不同,可用的拟合区间就不同,指数本身的可比性会打折扣(§4.3)。

§3 它是谁的数据:波士顿的一间实验室与一次课程

3.1 三个署名与一个机构

页面署名三位作者:Jeffrey Hausdorff、Patrick Purdon、Chung-Kang Peng,机构统一写作 Beth Israel Hospital, Boston, MA, USA。这个组合在九十年代的生理复杂性研究里很典型:Hausdorff 做步态与运动控制,Peng 做非线性时间序列方法,两人与 Ary Goldberger 同在波士顿的交叉学科圈子里,把心率变异性研究里的分形方法搬到了步态上。

三个人的分工在页面上没有写。从随包的三篇参考文献可以反推:方法学(分形与长程相关)由 Peng 一侧贡献,采集与临床解释由 Hausdorff 一侧贡献。这是推测,官方未作说明。能确认的只有几项:署名三人、机构写波士顿的 Beth Israel Hospital、学科背景是运动控制与非线性生理信号分析、整理动机是给 1999 年 10 月的课程准备材料、发布平台是 MIT 计算生理学实验室维护的 PhysioNet、许可为 ODC 署名 1.0。

3.2 时间线:先有论文,后有数据

这份数据的时间顺序与大多数现代数据集相反。论文先发表,数据在几年后才作为教学材料上线。

时间 事件
1996 年 《应用生理学杂志》刊出步态分形动力学论文,用同类数据
1997 年 同一团队发表衰老与亨廷顿病对步幅相关性的影响
1998 年 《运动障碍》刊出帕金森病与亨廷顿病的步态变异论文
1999 年 10 月 作为 NECSI 课程「人类衰老的现代科学」的教学材料整理
2000 年 10 月 13 日 PhysioNet 上线,版本 1.0.0
至今 无版本更新,页面与文件均未变

这个顺序解释了两件事。第一,为什么页面描述写得像论文摘要的浓缩版:它的底稿是已经发表的方法学。第二,为什么 README 会写"不面向研究发表":整理时的目标人群是上课的人,不是投稿的人。

3.3 采集现场:鞋里的两片薄膜与踝上的盒子

设备描述在页面与 README 里完全一致,只有一句话的篇幅,但信息足够复现其原理:超薄压阻式力敏电阻放在鞋内,模拟力信号以 300 Hz 采样、经 12 位模数转换,由踝部佩戴的便携微电脑记录,事后自动计算足跟着地间隔。官方特别说明,这个判定方法是此前已验证方法的改良版,而那个原方法已被证明与测力台的结果一致,测力台被称为金标准。

要素 规格 对数据的影响
传感器 超薄压阻式力敏电阻,置于鞋内 只感知足底受力,不含力矩与压力分布
采样 300 Hz 着地时刻的时间分辨率约数毫秒
量化 12 位模数转换 幅度分辨率约四千分之一满量程
记录设备 踝部便携微电脑 允许连续行走,不受线缆与场地限制
着地判定 改良的自动阈值法 判定规则决定步幅的起止定义
参考标准 已验证方法,与测力台一致 提供方法学背书,但本数据未附对照

这里有一个容易忽略的推论:着地时刻的精度并不等于采样间隔。300 Hz 意味着相邻样本相隔约三点三毫秒,而阈值法判定的是一个样本跨过阈值的位置,实际误差在采样间隔量级。这个量级相对于一秒左右的步幅时长只有千分之几,对长程相关分析几乎无影响,但对逐拍变异的高频成分会有轻微平滑。

3.4 三层信息与它们的可信度

这份数据的信息可以分成三层,越往下越薄。第一层是每次着地的时刻与间隔,由传感器自动判定并计算,可信度高,但依赖阈值法的口径。第二层是组别与年龄,编码在文件名里,可信度同样高,唯一的缺口是帕金森病组没有年龄。第三层是采集协议、设备、路线这些整批描述,来自页面与 README 的文字,可信度只能算中等。再往下是一个缺失层:病程、用药、量表、步速、身高,全部没有。

第三层之所以只能算中等,是因为它是整批描述而不是逐例记录:官方说健康组走了约十五分钟,但每条记录的实际跨度在十四分钟左右;官方说绕近似圆形路径,但没有给路径半径与圈数。这些细节只能从数据本身反推,而反推的结论无法与官方核对。

§4 它最独特的东西:把连续行走压成一维节奏

4.1 只给步幅,为什么反而是优点

把一次十五分钟的行走压缩成八百个数字,听起来像信息损失。对形态学问题确实是损失:你看不到足弓如何塌陷、看不到膝关节如何屈伸。但对节律问题恰恰相反:压缩把与研究问题无关的变异全部去掉了。

同一条步幅序列可以被十个课题组用十种方法分析,只要大家对"步幅"的定义一致,结果就可比。而如果给的是原始波形,每个组都要自己做滤波、做着地检测、做异常步剔除,这些步骤的差异足以让同一批数据的标度指数相差百分之十以上。gaitdb 把这个自由度提前收走了:着地时刻已经定好,步幅时长已经算好,使用者只能在分析方法上做选择,不能在数据定义上做选择。

分析环节 原始波形数据 gaitdb
滤波 使用者自选截止频率与阶数 无此环节
着地检测 使用者自选阈值或算法 官方已完成
异常步剔除 使用者自定规则 未做,也不可做
时间轴生成 由采样点换算 已给出秒为单位的时间列
可比性 依赖各方流程披露 定义统一,方法仍可不同

最后一行是关键:可比性提高了,但不等于结果唯一。方法学分歧依然存在,只是被推到了更靠后的一步。

4.2 案例:y4 的七百零九个步幅

青年组第四号,文件名 y4-21-si,二十一岁,是十五人里最年轻的一位。他的记录共七百零九行,时间从 30.843 秒到 869.02 秒,跨度约十四分钟;第一拍的步幅时长是一点一二三秒,最后一拍是一点二三零秒,末段整体比开头慢了一截。

这条记录值得当作标本,因为它把这份数据的几个特征同时展示了出来。第一,起点不在零:前三十秒的行走没有被纳入,使用者拿到的是"已经走热之后"的一段。第二,终点不到十五分钟:整段行走约九百秒,记录在第八百七十秒结束,尾部同样被截。第三,序列长度与年龄无关而与协议有关:他是最年轻的,却不是最长的一条,最长的是老年组的第八百九十二拍。

属性 值 读法
记录名 y4_21_si 注释格式用下划线
文本文件名 y4-21-si.txt 文本格式用连字符
组别 健康青年 首字母 y
年龄 21 岁 文件名内嵌
行数 709 即步幅数
起始时间 30.843 秒 首拍不在零时刻
结束时间 869.02 秒 约十四分半
首拍步幅 1.123 秒 舒适步速的典型值

把这条记录画出来,会看到一条在一点一秒上下缓慢游走的曲线:局部看像随机抖动,拉远看有缓慢的峰谷,再拉远看峰谷本身还在更大的尺度上起伏。这三种尺度同时存在,就是长程相关的直观来源。若把三组的序列并排画,帕金森组那五条通常更短、局部抖动更明显,但因为只有五条、长度又不同,这种视觉差异不能直接当作统计结论。

4.3 三组之间的可比与不可比

三组的设计看起来像一个经典的"青年对老年对患者"梯度,实际能比较的东西比表面少。

比较 可比性 阻碍
青年对老年 较高 协议相同,年龄区间不重叠,样本各五
青年对帕金森病 低 时长差一倍半,路线不同
老年对帕金森病 低 时长与路线不同,年龄区间重叠
组内个体之间 高 同一协议,同一设备,只是时长略有差别
与外部数据集之间 中 着地定义可能不同,需先对齐口径

真正稳的比较只有两种:组内个体之间,以及青年与老年之间。后者的价值不应被低估——它恰好对应"衰老"这个变量,且协议完全一致。而帕金森组由于协议不同,更适合被当作一组独立的病例序列来分析,而不是与健康组做直接对照。

4.4 长程相关:这份数据真正被用来回答的问题

步幅序列最著名的性质是它的自相关衰减得极慢。白噪声的自相关在一拍之内就掉到零;而健康人自选步速的步幅序列,在几百拍之后仍有可测的相关。这种性质通常用标度指数描述,指数接近一表示一除以 f 型的涨落,偏离则说明序列更接近随机游走或更接近白噪声。

概念 含义 在本数据上的操作
步幅时长 同侧足连续两次着地的时间 直接读取第二列
长程相关 相隔很远的拍之间仍有统计依赖 自相关、谱密度、波动分析
标度指数 波动随窗口增长的幂律斜率 双对数坐标下拟合直线
去趋势 消除局部均值漂移 按窗口做线性拟合再相减
交叉点 拟合直线出现折转的尺度 需足够长的序列才能定位

第三行到第五行都不需要原始波形,只需要一条干净的时间轴。这正是 gaitdb 能长期被使用的原因:它把方法学需要的输入准备到了恰好的粒度。

4.5 边界条件:什么情况下它不再适用

第一,当问题涉及波形形态时。没有波形,一切形态学指标无从谈起。

第二,当问题涉及步速、步长、支撑相占比时。这些量需要距离或时间分相信息,本数据只给一个周期总时长。

第三,当问题涉及真实世界行走时。绕圈与走廊往返都是受控路线,不含楼梯、转弯半径变化、避障、双任务。

第四,当问题涉及个体内的短期波动时。首尾各截去数十秒,且没有标注任何异常事件(咳嗽、避让、驻足),无法区分生理变异与外部干扰。

§5 怎么拿到:从 tar 包到一条可分析的时间轴

5.1 目录结构与下载面

目录是平铺的,没有层级:三份说明性文件(README、RECORDS、ANNOTATORS)、一份校验和、十五组三件套(文本、头文件、注释)、两个打包文件,外加一个页面快照。页面给出三种取数方式:点按钮下 ZIP、用 wget 递归镜像、用 AWS 命令行同步公开桶。

路径 内容 大小
https://physionet.org/files/gaitdb/1.0.0/ 项目根目录 未压缩 354.6 KB
gait-data.tar.gz 全部文件的压缩包 47 KB
gait-data.tar 同上,未压缩 150 KB
RECORDS 十五个记录名 125 B
README 说明与参考文献 2.7 KB
SHA256SUMS.txt 校验和 3.9 KB
*-si.txt 十五条两列文本 3 至 12 KB
*_si.hea / *_si.str 注释头与注释体 十余字节 / 数百字节

有一点需要提前知道:项目路径下并没有一个叫 gaitdb.zip 的文件,页面的 ZIP 按钮指向平台生成的打包地址。脚本里若照抄别的水库的命名习惯去拼 content/gaitdb/1.0.0/gaitdb.zip,会得到 404。稳妥的做法是直接用 gait-data.tar.gz。

5.2 批量下载

不需要注册,不需要令牌。整包只有四十七 KB,任何网络条件下都是瞬间完成。

#-- 方式一:整包下载并解压
mkdir -p data/gaitdb && cd data/gaitdb
curl -sL -O https://physionet.org/files/gaitdb/1.0.0/gait-data.tar.gz
tar -xzf gait-data.tar.gz

#-- 方式二:只取文本记录,逐文件下载
mkdir -p txt && cd txt
for r in o1-76 o2-74 o3-75 o4-77 o5-71 pd1 pd2 pd3 pd4 pd5 y1-23 y2-29 y3-23 y4-21 y5-26; do
  curl -sL -O "https://physionet.org/files/gaitdb/1.0.0/${r}-si.txt"
done

#-- 方式三:整目录镜像,含注释与校验和
wget -r -N -c -np https://physionet.org/files/gaitdb/1.0.0/

第一种方式最省事。解压后目录里会同时出现文本、注释与打包文件本身,注意别把 gait-data.tar 再算进记录数里。

5.3 读文本:一次读入,两列成表

文本没有表头,列名要自己给。下面的脚本把十五条记录读成一张长表,并顺手核对总行数。

import glob
import os
import pandas as pd

records = []
for path in sorted(glob.glob("data/gaitdb/txt/*-si.txt")):
    name = os.path.basename(path).replace("-si.txt", "")
    df = pd.read_csv(path, sep="\t", header=None, names=["time", "stride"])
    df["record"] = name
    df["group"] = name.split("-")[0].rstrip("0123456789")
    records.append(df)

allst = pd.concat(records, ignore_index=True)
print(allst.shape)                    #-- 9144 行,四列:两列数值加两个标识
print(allst.groupby("record").size())  #-- 每条记录的步幅数
allst.to_parquet("data/gaitdb_strides.parquet", index=False)

分组那一行有个小陷阱:pd1 去掉数字后是 pd,o1 去掉数字后是 o,y4 是 y;但如果用简单的首字母取组,pd 会被误判成 p。上面用去掉尾部数字的写法可以避开,更稳妥的是直接用文件名前缀查表。

5.4 读注释:必须用读注释的函数

注释格式的好处是与 PhysioBank 生态兼容,坏处是容易读错。头文件声明零通道,用读信号的函数打开会得到一个空记录。

import wfdb
import numpy as np

ann = wfdb.rdann("data/gaitdb/y4_21_si", "str")
print(ann.fs)                 #-- 250,注释时基
print(len(ann.sample))        #-- 709,与文本行数一致

#-- 注释时刻以采样点计数,除以时基得到秒
t = ann.sample / ann.fs
#-- 相邻注释的间隔即步幅时长
stride = np.diff(t)
print(t[0], t[-1], stride[:3])

跑完这一步应当得到三个可核对的结果:注释条数与文本行数相同、首末时刻与文本首末列在毫秒级一致、相邻间隔与文本第二列在舍入误差内一致。三项都对齐,说明两种封装确实是同一批数据;任何一项不符,先怀疑自己用错了时基。

5.5 一条最短的检查流程

拿到数据后不要急着建模,先花一分钟做五项结构核对。这五项能挡掉后面大部分的返工。

检查项 期望值 不符时的含义
记录文件数 15 下载不全或混入了打包文件
总行数 九千一百四十四 有文件被截断或重复
每条记录首行时间 二十秒至三十一秒之间 时基或起始点理解错误
时间列单调递增 恒为真 文件被改写过
步幅列与时间差一致 逐行相差不超过一毫秒 列序读反了

最后一项最值得做,因为它同时验证了列序与舍入规则。若把两列读反,时间列会变成一点几,时间差全是负数,一眼就能看出来;但如果只读一列做分析而不看另一列,这个错误会一路带到结论里。

#-- 记录数应为 15
ls data/gaitdb/*-si.txt | wc -l

#-- 总行数应为 9144
cat data/gaitdb/*-si.txt | wc -l

#-- 逐条打印记录名、首行时间与行数,用于人工比对
for f in data/gaitdb/*-si.txt; do
  echo "$(basename "$f" .txt) $(head -n 1 "$f" | cut -f1) $(wc -l < "$f")"
done

第三段输出是最好用的一项:它把十五条记录的首行时间与行数并排打出,任何一条与其他条明显不同,都能立刻看出来。

5.6 三类常见读取错误

现象 原因 处理
读注释得到空数组 用了读信号的函数 改用读注释的函数并指定通道 str
时间列出现负值 两列读反 确认列序:时间在前,步幅在后
记录数变成十六 把 tar 包也算作一条记录 按扩展名过滤
中文环境下列错位 误按逗号分隔 分隔符是制表符
分组标签出现 p 只取首字母判组 用前缀查表,pd 优先匹配

第五项是中文使用者最容易踩的,因为 pd 这个前缀在别的库里常表示 pandas 的缩写,写脚本时容易顺手按单字母切分。稳妥的写法是把判定收进一个小函数,先判 pd 再判首字母。

import glob
import os

def group_of(name):
    #-- 先判 pd,再判首字母,避免 pd 被切成 p
    return "pd" if name.startswith("pd") else name[0]

counts = {}
for path in glob.glob("data/gaitdb/*-si.txt"):
    g = group_of(os.path.basename(path))
    counts[g] = counts.get(g, 0) + 1
print(counts)   #-- 三组各五条

§6 与库内条目的关系

6.1 关系图谱

站内与步态、平衡相关的词条已有若干,gaitdb 在其中的位置很特殊:它是这一族里年代最早、体积最小、维度最低的一个。

词条 关系 一句话区隔
hbedb 同域不同任务 那边是静态站立的压力中心,这边是行走中的步幅序列
gaitpdb 同一作者脉络的后继 那边给 93 例患者与 73 例对照的原始垂直地反力,这边只给 15 人的派生节拍
gait-in-aging 同一作者的疾病谱扩展 那边覆盖帕金森、亨廷顿、渐冻症共 64 例,这边只有 5 例帕金森
multimodal-gait-dataset 模态互补 那边是脑电、肌电、惯性、测力四路同步,这边只有单标量
live-gaitneurokids 人群互补 那边是儿童神经发育人群,这边是成人
rehab-motion-capture 任务互补 那边是康复动作的光学动捕,这边是自由行走的节律
sisfall 应用互补 那边面向跌倒检测,这边面向节律结构

与 hbedb 的区隔最需要说清,因为两者都出自 PhysioNet、都用 ODC 许可、都被归入步态与运动。差别在测量对象:hbedb 测的是站着不动时压力中心的漂移,gaitdb 测的是走起来之后每一步的时长。前者关心姿势控制的稳定性,后者关心节律的时间结构;前者的分析单位是六十秒的试次,后者的分析单位是数百拍的序列。

维度 hbedb gaitdb
任务 静态站立 连续行走
受试者 163 名 15 名
信号 八通道力与压力中心 单标量步幅时长
采样 100 Hz 波形 300 Hz 采集,发布为事件
分析单位 六十秒试次 每一步
体积 三百多兆 三百多 KB

体积差三个数量级,这不是质量差,是粒度差。想研究姿势控制选前者,想研究节律结构选后者;两者唯一的共同点是都不适合做深度学习预训练。

6.2 检索路径

站内检索时,gait 这个前缀会命中一大片,容易点错。

你想找的 检索词 会命中的词条
本页 gaitdb 就是这份数据
帕金森病原始力信号 gaitpdb 九十三例患者与七十三例对照的力信号库
神经退行性疾病步态 gait-in-aging 帕金森、亨廷顿、渐冻症合集
静态平衡 hbedb 力台站立数据
多模态步态 multimodal-gait-dataset 四模态同步
儿童步态 live-gaitneurokids 儿童神经发育人群
跌倒检测 sisfall 惯性传感器跌倒数据

一个实用的区分办法是看单位:如果词条里反复出现"步幅时长、节拍、长程相关",多半是 gaitdb 这一支;如果反复出现"垂直地反力、通道、采样率",是 gaitpdb 那一支;如果出现"压力中心、睁眼闭眼",是 hbedb。

§7 质量评估与局限性

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

看到"15 人、九千余个步幅、300 Hz"这三个数字,最容易形成两个误判。第一个是把九千多当成样本量,于是以为这是一份中等规模的数据;第二个是把 300 Hz 当成发布粒度,于是以为里面有高速波形。两个误判的根子相同:没有先分清采集端与发布端。

正确的读法是先做一次换算:九千多除以十五,得到每条记录数百拍,与行走时长对应;再看文件,只有两列浮点。这一步做完,"规模"与"粒度"两个词就各归其位了。本节的所有评分都建立在这个校正之上,不建立在校正之前的印象上。

7.1 DAIMS 五维评分

按 DAIMS 五维框架打分,每维二十分,满分一百。这个框架在本站用于把数据集的可发现、可获取、可互操作、可复用、可引用五项分开评估,避免用一句"好不好用"笼统带过。分数是相对同类公开步态资源的水平,不是绝对结论。

维度 得分 依据 扣分点
可发现 17 有 DOI、有平台页、被大量论文引用 页面标题不含缩写,站内检索易与同类混
可获取 19 免注册、四十七 KB、三种取数方式 无查询接口,无按受试者筛选的 API
可互操作 12 提供两种封装,注释格式兼容 PhysioBank 无标准事件本体,无 BIDS 类规范
可复用 15 定义清晰、许可宽松、可自由再分发 无临床协变量,样本极小,缺原始波形
可引用 18 DOI 稳定、三篇原始论文可引 平台侧无独立的数据论文
合计 81 — —

八十一分里,扣得最重的是互操作。它给得出两列数字,却给不出这两列数字在标准体系里的位置:没有事件类型本体,没有统一的步态事件编码,也没有把"步幅"与"步态周期"这两个术语显式绑定。这在跨库合并时会造成实际麻烦。

7.2 三处需要自己核对的地方

第一处是青年组年龄下限。官方描述写"23 至 29 岁",但文件名里出现了 y4-21,也就是二十一岁。文本描述与文件命名构成两个口径,差额来自何处官方未说明。按文件名读,区间是二十一至二十九岁;按文字读,是二十三至二十九岁。

第二处是研究用途的表述。README 写明这批数据是教学迷你集、不面向基础研究与论文发表;同一页面的参考文献里却列了三篇基于同类数据发表的期刊论文。两个口径并列存在,官方没有解释它们如何共存。

第三处是许可。页面标注 ODC 署名 1.0,属于要求署名的开放许可,允许商用与再分发;这与 README 里"教学用"的定位不冲突,但意味着即便用于教学,署名义务依然成立。

7.3 已知的、可枚举的偏差

偏差可以逐条列出,每一条都能在页面、README 或数据本身找到依据。

偏差 方向 依据 后果
极小样本 效应量不稳 每组五人 组间差异的置信区间极宽
协议不一致 混入路线与时长效应 健康组绕圈十五分钟,患者组走廊六分钟 跨组比较无法归因于疾病
年龄重叠 疾病与年龄混淆 老年组 71 至 77,患者组 60 至 77 无法分离两个因素
无临床变量 病例定义薄 仅靠文件名标组 无法按病程或用药分层
首尾截断 丢失起始与终止段 首拍约在二十至三十一秒 起步加速段不可研究
无异常标注 干扰不可剔除 无事件标记 偶发驻足会被当成节律变异
单次会话 无重复测量 一人一条记录 无法估计测量信度
派生量发布 不可回溯 无原始波形 无法改变着地判定口径

其中最容易造成误判的是第二条与第三条的叠加。一个使用者若把患者组与老年组的标度指数相减,会同时减去年龄差、路线差、时长差,剩下的残差没有明确含义。长度差还会再叠一层:§4.2 的案例只有七百零九拍,同组的另一条有八百九十二拍,而患者组最短的一条只有二百零三拍。这不是数据错误,是设计使然:它本来就不是对照试验。

7.4 外部验证矩阵

判断一份数据能不能支撑结论,看它被外部怎么用过,比看它自己怎么写更有说服力。

验证维度 是否有外部证据 说明
同批数据的独立重分析 有 2009 年有课题组用另一套模型重析 1996 年的原始序列
跨实验室复现同一指数 部分有 多个课题组报告过相近量级的标度指数
与测力台金标准对照 间接有 着地判定法的原方法曾与测力台比对
病理组与健康组的可分性 有定性证据 多篇论文报告患者序列相关性减弱
与可穿戴设备对照 无 采集设备本身即便携式,无同期对照
长期稳定性 无 单次会话,无随访

第一行的证据值得展开。2009 年有一篇论文专门重析了 1996 年那批数据,用另一种建模方式确认自选步速条件下确实存在真实的分形相关,但对节拍器条件下的结论提出了不同看法。这个分歧对本页的直接意义有限——节拍器条件的数据不在 gaitdb 里——却提醒使用者:同一批序列换一种估计方法,结论可能改变。

7.5 它为何能持续:定义统一比数据量大更难替代

二十六年不更新、不到四百 KB、十五个人。按任何现代数据集的标准,它都该被淹没。但它仍被反复取用,原因不在规模,而在它替整个领域钉死了一个定义。

“步幅时长等于同侧足连续两次着地的时间”,这句话听起来平淡,却是所有长程相关研究的共同起点。只要大家用的是同一个量、同一种时间轴,标度指数才可能被横向比较。想重新造一份这样的数据,成本不在采集设备——两片压阻薄膜与一台微电脑并不昂贵——而在让足够多的课题组认可同一套判定口径。这份数据在 2000 年就把口径写进了文件名与文件结构里,此后不再需要解释。稀缺的不是数据量,是一个不需要再争论的定义。

§8 生态位与历史

8.1 历史沿革

PhysioNet 在 2000 年前后上线了一批"迷你合集",覆盖心率、步态、呼吸等生理节律,共同的目的是给研究者与课堂提供小而干净的真实序列。gaitdb 是其中步态这一支的代表,也是这一批里少数至今仍被引用的。

它的沿革可以压成五个阶段。1996 至 1998 年,三篇原始论文相继发表,方法与结论先立住。1999 年 10 月,同一批数据被整理成课程用的迷你合集。2000 年 10 月 13 日,版本 1.0.0 上线,此后二十余年没有任何更新,页面与文件保持原样。2000 年代中后期,同作者团队推出了规模更大的步态库,把三组各五人扩展成数十至上百例的队列。

8.2 与同期资源的分工

同一时期还有几类资源在解决相邻但不相同的问题,把它们排在一起,位置就出来了。

资源 年代 侧重 与本库的分工
早期心率变异性库 1990 年代 心搏间期序列 同一种方法学,不同的生理系统
睡眠与呼吸库 1990 至 2000 年代 长时程生理节律 时间尺度更长,事件定义不同
测力台式步态库 2000 年代 单步力学波形 形态对节律
惯性传感器步态库 2010 年代 自由场景运动 场景广度对序列纯度
大规模临床步态库 2010 年代后 数百至数千人 统计效力对定义统一
gaitdb 2000 十五人的步幅序列 最小、最早、定义最死

它在这个谱系里的位置很清楚:最窄的通道、最长的单条序列、最少的受试者。窄与少是缺点,长与统一是优点。

8.3 生态位:方法学的试验台

在机器学习语境里,数据集按规模排序,它排不上号。但在时间序列方法学语境里,它占据一个规模无法替代的位置:试验台。

一套新的长程相关估计量要发表,审稿人通常会问两个问题:在已知性质的合成序列上表现如何,在真实生理序列上表现如何。第一个问题用合成数据就能回答,第二个问题需要一份公认的真实序列。gaitdb 就是那份公认的序列:短、干净、定义明确、谁都能下载。它的作用不是证明方法有用,而是证明方法在真实数据上不会崩。

8.4 谁在用它,用来做什么

从公开文献看,使用者集中在三类:做非线性时间序列方法的工程与应用数学组、做步态与运动控制的生物力学组、以及做神经疾病运动症状的临床研究组。三类用法有一个共同点——都把它当标尺或试验台,而不是训练素材。

拆开看,方法学研究者要的是全部十五条第列,用来验证估计量在真实序列上的稳定性;生物力学研究者要的是健康两组,用来比较青年与老年的节律结构;临床研究者只需要患者那五条,用来观察帕金森病的节律改变;教师随便取一条就能在课堂上演示分形与长程相关;算法工程师往往拿两条跑通流水线就够。

这也解释了它的引用曲线为什么平缓而长尾:工具型资源解决的问题不会过时,但也不会成为热点。

§9 使用指引

9.1 三种角色的路径

角色 第一步 第二步 第三步
方法学研究者 读 README 确认步幅定义 用 §5.4 核对两种封装一致 在十五条第列上跑你的估计量
生物力学研究者 先只看健康两组 用 §4.2 的案例检查单条序列形态 组内先做个体曲线,再做组间描述
临床研究者 明确患者组协议不同 只做患者组内的序列分析 跨组结论必须写明协议差异

三条路径的共同点是先看单条、再看多条。跳过第一步直接跑全量,很容易在长度差异上翻车:七百拍的序列与二百拍的序列,可用标度区间相差一倍以上。

9.2 一条最短的可用流程

从下载到一条可分析的序列,四步足够。

#-- 第一步:取整包并解压
mkdir -p data && cd data
curl -sL -O https://physionet.org/files/gaitdb/1.0.0/gait-data.tar.gz
tar -xzf gait-data.tar.gz -C gaitdb
cd ..

#-- 第二步:确认记录数与总行数
ls data/gaitdb/*-si.txt | wc -l
cat data/gaitdb/*-si.txt | wc -l
import numpy as np

#-- 第三步:读一条序列,取第二列
vals = np.loadtxt("data/gaitdb/y4-21-si.txt", usecols=1)
print(len(vals), vals[0], vals[-1])

#-- 第四步:一阶差分后看自相关的衰减(粗看即可)
x = vals - vals.mean()
ac = np.correlate(x, x, mode="full")[len(x) - 1:]
ac = ac / ac[0]
print(ac[[1, 10, 50, 100, 200]])

第三步打印出的行数应当是七百零九。若行数不符,先检查是否用了 usecols=1:不加这一项会把时间列也读进来,得到一个二维数组。

9.3 引用方式

对象 引用内容
数据 Hausdorff J, Purdon P, Peng CK. Gait in Aging and Disease Database (version 1.0.0). PhysioNet. 2000. doi:10.13026/C2C889
原始论文一 Hausdorff JM, et al. Fractal dynamics of human gait. J Appl Physiol. 1996;80:1448–1457
原始论文二 Hausdorff JM, et al. Altered fractal dynamics of gait. J Appl Physiol. 1997;82:262–269
原始论文三 Hausdorff JM, et al. Gait variability and basal ganglia disorders. Mov Disord. 1998;13:428–437
平台 Goldberger A, et al. PhysioBank, PhysioToolkit, and PhysioNet. Circulation. 2000;101(23):e215–e220

两件事容易漏。第一,只引平台不引论文,会让后来者找不到方法学依据;第二,许可是署名制,成果里必须致谢数据来源,不能只写"数据来自公开库"。

§10 AI 使用声明

项目 说明
写作方式 人工阅读官方页面、README 与文件原文后撰写,AI 参与资料整理与文字组织
事实来源 PhysioNet 项目页、随包 README、RECORDS、样例文本与头文件
未做的事 未做分布统计,未跑任何节律分析模型,未计算标度指数
数字口径 受试者与协议以官方页面为准,行数与首末时间以文件为准
口径冲突 青年组年龄区间存在文字与文件名两个口径,文中并列
未核实项 帕金森病患者的病程与用药状态、采集的具体年份与地点细节
许可判断 按页面标注的 ODC 署名 1.0 表述,不代替法律意见
适用边界 仅描述数据资源,不构成临床或康复建议

常见误读(避坑清单)

说法 实际 证据
这是三百赫兹的步态信号库 三百赫兹只描述采集端,发布的是派生的步幅时长 文件只有两列浮点,头文件声明零通道
九千多是受试者或样本量 九千多是步幅行数,人是十五名 RECORDS 共十五行
这是一个帕金森病对照研究 三组协议不同,患者组走六分钟走廊,健康组走十五分钟绕圈 页面与 README 的采集段
老年组与患者组可以直接相减 两组年龄区间重叠,协议也不同 老年 71 至 77,患者 60 至 77
官方说不能用于研究,所以没有论文用过 README 说教学用,页面同时列了三篇期刊论文 两处表述并存
青年组最小二十三岁 文件名里有一位二十一岁 y4-21
这是原始数据,可以自己重新做着地检测 原始波形未公开,只在采集端存在过 目录中无波形文件
十五个人可以放心做分类 一人数百拍,按行划分会泄漏 同一人序列高度自相关
数据里有临床信息可以分层 没有任何人口学、病程、用药、量表字段 两列之外无元数据
许可要求可以忽略 署名制许可,再分发与商用都需署名 页面许可栏

FAQ

Q1:gaitdb 到底有多少名受试者?
十五名,三组各五名:健康青年、健康老年、帕金森病患者。页面描述、README 与文件清单三处一致,没有第二个口径。它不是逐年扩充的队列,而是一次性整理的小合集。

Q2:为什么没有三百赫兹的原始力信号?
三百赫兹是采集端采样率,不是发布端粒度。研究者用踝部微电脑记下足底受力,事后判定每次着地,再算相邻同侧着地的时间差,公开发布的正是这个时间差。波形没有随数据公开,需要波形的分析在这份数据上无法开展。

Q3:能用来训练步态识别或疾病分类模型吗?
不建议。三组各五人,同一个人贡献数百拍,按行划分训练与测试会把同一个人的步幅分到两边,准确率反映的是身份而不是疾病。它适合方法学验证与教学,不适合当分类基准。

Q4:健康组走十五分钟、患者组走六分钟,这样比较公平吗?
两个协议确实不同。绕圈走十五分钟与走廊往返六分钟,在转弯频率与序列长度上都不同。官方没有把它设计成严格对照,所以跨组比较时协议差异与疾病差异混在一起,结论里必须显式限定。

Q5:txt 版和注释版有什么区别?
内容等价,封装不同。txt 是两列浮点文本,脚本一行读入;注释版是 PhysioBank 格式,需要配合头文件与读注释的函数。头文件里通道数与采样点数都是零,说明它是纯注释记录。

Q6:官方说它不适合发表研究,还能引用吗?
那句话出自随包 README,指这份迷你集最初为课程整理,不以保证研究级完整性。同一页面又列出三篇期刊论文,两个口径并存。用于正式研究时引用原始论文并说明规模限制,用于教学时引数据 DOI 即可。

Q7:为什么每条记录不是从零秒开始?
首拍时间在二十秒到三十一秒之间,说明起步后的前一段被截掉了。官方未说明截断规则,但从十五条记录一致的首拍位置看,这是一个统一的预处理约定,不是随机缺失。

Q8:帕金森组的年龄是多少?
页面写六十至七十七岁,但文件名不带年龄,所以无法把年龄对应到具体某一条记录。这一点与健康两组不同,后者把年龄写进了文件名。

Q9:十五个人够做统计检验吗?
组内可以做,组间很勉强。每组五人的组间比较,即便用非参数方法,置信区间也会宽到难以解释。更现实的做法是报告效应量与个体曲线,而不是追求显著性。

Q10:能把它和别的步态库合并吗?
技术上可以,前提是先对齐步幅定义与着地判定口径。不同库对"步幅"的叫法有步幅时长、步态周期、同侧着地间隔等,含义接近但不总相同。合并前应逐库确认定义,而不是按列名拼接。

Q11:序列长度不一致会影响结论吗?
会。长程分析的可用标度区间与序列长度直接相关,七百拍与二百拍能覆盖的尺度不同。跨组比较指数时,若不统一截取长度或统一拟合区间,差异里会混入长度效应。

术语表

术语 英文 含义
步幅时长 stride interval / stride time 同侧足连续两次着地之间的时间
步态周期 gait cycle 一个完整步态循环,与步幅时长同义
步频 cadence 单位时间内的步数,与步幅时长互为倒数关系
足跟着地 heel strike 足跟接触地面的时刻,本库的事件定义
压阻传感器 force sensitive resistor 受力改变电阻的薄膜元件
便携微电脑 ambulatory microcomputer 佩戴式记录装置,本库置于踝部
模数转换 analog-to-digital conversion 把模拟电压转成数字量,本库为 12 位
采样率 sampling rate 每秒采样次数,本库采集端为 300 Hz
注释时基 annotation time base 注释时刻的计数单位,本库头文件写 250 Hz
注释文件 annotation file 只存事件时刻的文件,本库为 .str
头文件 header file 声明记录结构的单行文本,本库为 .hea
长程相关 long-range correlation 相隔很远的观测之间仍有统计依赖
分形 fractal 在不同尺度上呈现相似结构的性质
标度指数 scaling exponent 波动随窗口增长的幂律斜率
去趋势波动分析 detrended fluctuation analysis 分窗口去趋势后计算波动增长的常用方法
自相关 autocorrelation 序列与自身滞后版本的相关系数
幂律 power law 两个量之间呈指数关系的规律
白噪声 white noise 相邻观测互不相关的序列
随机游走 random walk 累积随机增量形成的序列
派生量 derived measure 由原始信号计算得到、不可完全回溯的量
数据泄漏 data leakage 训练与测试共享信息导致指标虚高
协议差异 protocol difference 采集条件不同带来的系统差异
ODC 署名许可 ODC Attribution License 要求署名、允许商用与再分发的开放许可

附录 A:核心数字核对表

项 值 来源 来源层级
受试者数 15 页面、README、RECORDS 三处一致
健康青年 5 名,21 至 29 岁 文件名;文字写 23 至 29 两个口径
健康老年 5 名,71 至 77 岁 页面、README、文件名 一致
帕金森病 5 名,60 至 77 岁 页面、README 无逐例年龄
记录数 15 RECORDS 文件本身
步幅总行数 九千一百四十四 逐文件相加 文件本身
单条最短 203 行 pd3_si 文件本身
单条最长 892 行 o3_75_si 文件本身
采集采样率 300 Hz 页面、README 一致
模数转换位深 12 位 页面、README 一致
注释时基 250 Hz 头文件 文件本身
健康组行走时长 约十五分钟 页面、README 一致
患者组行走时长 约六分钟 页面、README 一致
健康组路线 近似圆形无障碍路径 页面、README 一致
患者组路线 长走廊往返 页面、README 一致
未压缩体积 354.6 KB 官方页面 官方页面
压缩包 47 KB 官方页面 官方页面
许可 ODC 署名 1.0 官方页面 官方页面
DOI 10.13026/C2C889 官方页面 官方页面
上线日期 2000 年 10 月 13 日 官方页面 官方页面
版本 1.0.0 官方页面 官方页面

附录 B:数字的来源分层

层级 含义 本页涉及的项
官方页面 PhysioNet 项目页直接给出 人数与分组、年龄区间、设备、采样率、路线、时长、体积、许可、DOI、日期
随包文档 README 与 RECORDS 给出 步幅定义、两列含义、教学定位、参考文献、记录清单
文件本身 文本与头文件可直接读出 每条记录行数、首末时间、注释时基、小数位
未核实 无公开来源,本页不回填 采集年份与地点细节、患者病程与用药、十五人的身高体重

附录 C:完整参考文献

  1. 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:1448–1457.
  2. Hausdorff JM, Mitchell SL, Firtion R, Peng CK, Cudkowicz ME, Wei JY, Goldberger AL. Altered fractal dynamics of gait: reduced stride-interval correlations with aging and Huntington’s disease. J Appl Physiol. 1997;82:262–269.
  3. Hausdorff JM, Cudkowicz ME, Firtion R, Wei JY, Goldberger AL. Gait variability and basal ganglia disorders: stride-to-stride variations of gait cycle timing in Parkinson’s and Huntington’s disease. Mov Disord. 1998;13:428–437.
  4. Delignières D, Torre K. Fractal dynamics of human gait: a reassessment of the 1996 data of Hausdorff et al. J Appl Physiol. 2009;106:1272–1279. doi:10.1152/japplphysiol.90757.2008
  5. Hausdorff J, Purdon P, Peng CK. Gait in Aging and Disease Database (version 1.0.0). PhysioNet. 2000. doi:10.13026/C2C889
  6. Goldberger A, Amaral LAN, Glass L, et al. PhysioBank, PhysioToolkit, and PhysioNet: components of a new research resource for complex physiologic signals. Circulation. 2000;101(23):e215–e220.

附录 D:任务代码

把这份数据用于"青年与老年两组的标度指数对照"时,最短的一段流程如下。它只做两件事:按统一窗口做去趋势波动分析,再按统一长度截取,避免长度效应。

import glob
import os
import numpy as np
import pandas as pd

def dfa(x, scales):
    #-- 累积离差
    y = np.cumsum(x - x.mean())
    out = []
    for s in scales:
        n = len(y) // s
        if n < 2:
            continue
        seg = y[: n * s].reshape(n, s)
        t = np.arange(s)
        rms = []
        for row in seg:
            coef = np.polyfit(t, row, 1)
            rms.append(np.sqrt(np.mean((row - np.polyval(coef, t)) ** 2)))
        out.append((s, np.mean(rms)))
    return np.array(out)

rows = []
for path in sorted(glob.glob("data/gaitdb/*-si.txt")):
    name = os.path.basename(path).replace("-si.txt", "")
    if not (name.startswith("y") or name.startswith("o")):
        continue
    v = np.loadtxt(path, usecols=1)
    v = v[:700]                      #-- 统一截到七百拍,消除长度效应
    f = dfa(v, [8, 12, 16, 24, 32, 48, 64, 96])
    alpha = np.polyfit(np.log(f[:, 0]), np.log(f[:, 1]), 1)[0]
    rows.append({"record": name, "group": name[0], "alpha": alpha})

print(pd.DataFrame(rows).sort_values(["group", "record"]))

这段代码的两个要点都在数据之外。第一,截取长度必须统一,否则七百拍与二百拍的序列会落在不同的拟合区间上。第二,患者组被排除在外,因为它的协议不同,混进来会把协议差异伪装成疾病差异。

附录 E:如果只记五件事

第一,它是十五个人,不是九千多人。行是步幅,人是统计单位。

第二,它没有波形。三百赫兹是采集端,公开的只有每次着地的时刻与间隔。

第三,健康组绕圈十五分钟,患者组走廊六分钟,跨组比较混着协议差异。

第四,它的价值是定义统一:步幅时长等于同侧足连续两次着地的时间,谁也改不了。

第五,官方自己说它是教学迷你集,但同一页面列了三篇期刊论文,两个口径并存。

编辑说明

核验时间 2026 年 10 月 28 日。核验方式为直接抓取 PhysioNet 项目页、逐一下载并读取 RECORDS、README、ANNOTATORS 与十五条文本记录的首行、行数与首末时间,并核对一份注释头文件;未做任何节律分析,未计算标度指数与分布统计。官方页面与随包 README 在青年组年龄下限(文字二十三岁、文件名二十一岁)与研究用途定位(教学用、但列出三篇论文)两处存在不一致,文中均并列呈现,未作裁定。数据版本为 1.0.0,自 2000 年起未更新;若平台迁移导致路径变化,下载面与文件清单需重新核对。


相关数据集导航

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

  • gait-pd — 共享标签:生理信号 / 步态与运动 / 可穿戴传感 / 帕金森病
  • parkinsons-disease-smartwatch — 共享标签:生理信号 / 步态与运动 / 可穿戴传感 / 帕金森病
  • cops — 共享标签:生理信号 / 步态与运动 / 可穿戴传感 / 帕金森病
  • gaitndd — 共享标签:生理信号 / 步态与运动 / 帕金森病
  • nqmitcsxpd — 共享标签:生理信号 / 可穿戴传感 / 帕金森病
  • tappy — 共享标签:生理信号 / 可穿戴传感 / 帕金森病
  • ppg-dalia — 共享标签:生理信号 / 步态与运动 / 可穿戴传感
  • culm — 共享标签:生理信号 / 步态与运动 / 可穿戴传感
  • nesfdb — 共享标签:生理信号 / 步态与运动 / 可穿戴传感
  • plantar — 共享标签:生理信号 / 步态与运动 / 可穿戴传感

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

返回 AI-Ready 数据集