信息速览
步态研究里有一个反直觉的事实:一个人走路时每一步都略有不同,这种不同不是噪声。健康人的步幅时长序列在几百拍的尺度上仍然彼此相关,呈现出缓慢漂移的长程结构;这种结构在衰老与某些神经系统疾病中会变平。要观察它,不需要高精度力学,只需要一条足够长、足够干净的节拍序列。
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:完整参考文献
- 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.
- 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.
- 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.
- 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
- Hausdorff J, Purdon P, Peng CK. Gait in Aging and Disease Database (version 1.0.0). PhysioNet. 2000. doi:10.13026/C2C889
- 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 — 共享标签:生理信号 / 步态与运动 / 可穿戴传感
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

