信息速览
神经退行性疾病的步态研究长期卡在同一件事上:帕金森病在运动障碍门诊看,亨廷顿病在舞蹈症专科看,渐冻症在神经肌肉门诊看,三处各用一套量表、各有一台设备,谁也没法把三条曲线放进同一张图。要比较节律,先得让三个人群在同一条采集链上走一次。
2000 年 12 月,Hausdorff 把这件事做完了。他把帕金森病、亨廷顿病、肌萎缩侧索硬化三组患者与一组健康对照放进同一套鞋内压阻装置,每人以平时习惯的步速走五分钟,做成了六十四个人的库,取名为 Gait in Neurodegenerative Disease Database。
它的特别之处在于一次发布两份东西:未滤波的双足原始压阻波形,以及从波形推出的十三列逐拍派生量。前者让人可以推翻官方的着地判定重做一遍,后者让人打开文件就能算变异性。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 全名 | Gait in Neurodegenerative Disease Database(项目名 gaitndd) |
| 发布方 | PhysioNet(MIT 计算生理学实验室维护) |
| 署名作者 | Jeffrey Hausdorff(页面为单人署名) |
| 页面署名机构 | Beth Israel Hospital, Boston, MA, USA |
| 首次发布 | 2000 年 12 月 21 日,版本 1.0.0,此后无更新 |
| 受试者 | 64 名:帕金森病 15、亨廷顿病 20、渐冻症 13、健康对照 16 |
| 记录数 | 64 条,一人一条,无重复会话 |
| 每条记录的文件 | 4 个:.hea 头文件、.let 左足、.rit 右足、.ts 派生表 |
| 采集设备 | 鞋内压阻式力敏电阻 + 踝部便携记录器 |
| 采集参数 | 300 Hz,12 位模数转换,双通道,每通道九万点 |
| 单条时长 | 300 秒,自选步速连续行走,路线未说明 |
| 发布粒度 | 原始波形(未滤波)+ 每个步态周期一行、十三列 |
| 临床信息 | subject-description.txt,八列,一人一行 |
| 体积 | 未压缩 17.9 MB |
| 许可 | ODC 署名 1.0,免注册下载 |
| DOI | 10.13026/C27G6C |
§1 它要解决的具体麻烦
1.1 三种病要放在同一把尺子上
帕金森病、亨廷顿病、肌萎缩侧索硬化在临床上几乎不共享任何评估工具。帕金森病用 Hoehn 与 Yahr 分级和 UPDRS 运动分,亨廷顿病用总功能容量(total functional capacity,TFC)与统一量表,渐冻症用肌萎缩侧索硬化功能评分与确诊至今的月数。这三套量表的量纲、方向、取值区间都不同:H&Y 越高越重,TFC 越低越重,月数只表示时间不表示轻重。
量表不可比,但步态节律可比。步幅时长是一个以秒为单位的连续量,只要采集链路一致、着地判定一致、行走方案一致,三组人的序列就能放在同一根时间轴上。这是 gaitndd 的设计前提:它不去统一临床量表,而是绕开量表,改用一条所有组都能产出的物理量。
绕开量表要付代价。病程、功能与整体状态原本由量表承载,换成步幅时长后全部消失,只剩一串描述节律的数字。想知道"这一组的病有多重",只能回到那张八列的临床表,而表里三种病各用各的尺子。这个矛盾贯穿全库,也是后面所有边界问题的源头。
把四种可用于节律研究的采集路线并排看,能看清它为什么选了最朴素的那一条。
| 路线 | 典型设备 | 能给出什么 | 连续行走的成本 |
|---|---|---|---|
| 光学运动捕捉 | 多台红外相机 + 反光标记 | 关节三维坐标、步态相位 | 高,标记易松,场地受限 |
| 测力台 | 埋入地面的力台 | 单步三维力与力矩波形 | 很高,只能测几步 |
| 阵列压力鞋垫 | 鞋内多分区传感器 | 足底压力分布图 | 中,长时间记录数据量陡增 |
| 便携压阻 + 事件判定 | 鞋内薄膜 + 踝部记录器 | 每次着地时刻与间隔 | 低,受试者可自由连续行走 |
gaitndd 走的是第四条。它的取舍与同门的 gaitdb 完全一致:牺牲形态,换连续性。差别在于它没有把形态全部丢掉——原始双足波形随派生表一起发布,形态信息还在文件里,只是不在主表里。
1.2 三条常见的错误期待
第一条,期待它是帕金森病专用库。六十四人里只有十五例帕金森病,占不到四分之一。它真正的主体是亨廷顿病,二十例,也是四组中人数最多的一组。想研究帕金森病步态,同门的 gaitpdb 有九十三例患者与七十三名对照,规模大得多;gaitndd 的价值在于"同一方案下的跨病种对照",不在于单病种的样本量。
第二条,期待它能做临床回归。它确实带一张临床表,八列,看起来足够做协变量调整。但三种病的严重度列不是同一个量:帕金森病填 H&Y 分级,亨廷顿病填 TFC,渐冻症填确诊月数,健康对照填占位用的 0。把这四列拼成一列数值送进模型,等于把三种单位不同的尺子接成一根。
第三条,期待它是标定过的信号库。官方只说输出"大致与足下受力成正比",没给电压到力的换算,也没说明滤波——派生表那句"未经滤波"反而明确了没有平滑。把它当已标定的力平台数据用,会在幅值上出错。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 在统一方案下比较四种人群的步态节律 | 四条记录组、同一设备、同一五分钟方案 | 够,这是它唯一的原始设计目的 |
| 验证自己写的着地检测或步态切分算法 | 双足原始波形 + 官方派生结果作为对照 | 够,公开库里少见的双份结构 |
| 算步幅变异性、摆动相占比、双支撑占比 | 十三列现成数值,无需自己切分 | 够,打开文件即可 |
| 研究帕金森病一个病种的步态 | 15 例,无用药状态 | 不够,样本与协变量都不足 |
| 做疾病三分类或四分类基准 | 64 人、四类标签 | 不够,一人一条记录,无法划分出独立测试集 |
| 分析疾病严重度与节律的关系 | 三套不同量纲的严重度列 | 勉强,只能在组内做,跨组不可比 |
| 做纵向随访或干预效果评估 | 每人一次记录,无重复 | 不够,结构上不支持 |
| 需要已标定的力值 | 仅相对受力的电压序列 | 不够,官方未给换算 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 你在做步态事件检测,手上只有自己采的数据,缺公开对照 | 双足原始波形与官方派生表并存,可逐拍比对 | 先用 §4.2 的案例跑通一条,再扩到六十四条 |
| 你想验证一个变异性指标在病理人群中是否稳定 | 三组病理 + 一组对照,同一方案 | 先按组内做,再报告组间效应量而非显著性 |
| 你在写神经退行性疾病步态的方法学综述 | 有 DOI、有原始论文、有明确的采集参数 | 按 §9.3 同时引数据与两篇论文 |
| 你需要一个教学用的多列时序样本 | 十三列、语义清晰、几百行、体积小 | 用 §5.3 的读法,先讲清每列的单位 |
| 你想研究摆动相与支撑相的比例关系 | 四个占比列直接给出,且可互相校验 | 先用"摆动 + 支撑 = 步幅"验一遍数据 |
| 你要做疾病分类的预实验 | 四类标签现成 | 只能做留一人交叉验证,且结论不外推 |
1.5 一句话判断
它是一份把三种病拴在同一根时间轴上的样本:临床信息薄到只剩一张八列表,信号却厚到连未滤波的原始波形都留着。
1.6 不适合谁:四条边界
不适合做单病种的临床研究。 帕金森病十五例、渐冻症十三例,任何按病种分层的分析都会落进个位数到十几例的区间。这类规模只够报告个体曲线与效应量,不够支撑组间显著性,更不够支撑亚组分析。
不适合做机器学习基准。 六十四人、四类、一人一条记录。任何按记录随机划分训练与测试的做法,都会让同一个人的数据只出现在一边,看似没有泄漏;但六十四这个量级意味着测试集只有十几条,指标方差大到无法比较模型。更麻烦的是没有第二个中心的数据可做外部验证。
不适合当已标定的力学数据。 压阻薄膜的输出与受力只是"大致成正比",官方未给换算系数,也未给薄膜的规格与贴附位置。需要牛顿值的研究应该去找测力台或已标定的鞋垫库。
不适合研究时间上的变化。 每人一次、每次五分钟、无重复会话。日内波动、用药周期、疾病进展这三类问题,在这份数据上都无法提出,更无法回答。
§2 数据构成与规格
2.1 一条记录四个文件
整个库是平铺的,没有子目录。六十四条记录,每条四个文件,再加四个全局文件,构成全部内容。命名规则极简单:组别前缀加一个序号,前缀有四种——park、hunt、als、control。
四种前缀对应四个组:park 是帕金森病,十五例,序号 1 到 15;hunt 是亨廷顿病,二十例,序号到 20;als 是肌萎缩侧索硬化,十三例,序号到 13;control 是健康对照,十六名,序号到 16。四个数加起来是六十四,与 RECORDS 的行数一致;临床表的数据行同样是六十四,另有一行残留杂物(§5.5)。
序号是官方所说的"任意编号",与年龄、性别、病情都不对应。park1 是一名七十七岁男性,park2 与他在任何维度上都没有先后关系。这一点与 gaitdb 不同:那边的文件名里嵌了年龄,o1-76 一眼能看出七十六岁;这边必须去查临床表。
| 文件 | 内容 | 格式 | 是否必需 |
|---|---|---|---|
<记录名>.hea |
头文件,声明通道数、采样率、采样点数与两路信号的增益 | 纯文本,三行 | 读原始波形时必需 |
<记录名>.let |
左足压阻信号 | 二进制,WFDB 格式 212 | 重做事件检测时必需 |
<记录名>.rit |
右足压阻信号 | 二进制,WFDB 格式 212 | 同上 |
<记录名>.ts |
十三列逐拍派生量 | 制表符分隔文本,无表头 | 做节律分析时必需 |
subject-description.txt |
六十四人的临床与人口学信息 | 制表符分隔文本,CRLF 换行 | 分组与分析时必需 |
RECORDS |
六十四个记录名,一行一个 | 纯文本 | 遍历时用 |
SHA256SUMS.txt |
每个文件的校验和 | 纯文本 | 校验完整性时用 |
TEST.shtml |
页面遗留的测试文件 | HTML | 与数据无关,可忽略 |
同一份数据有两种封装,这是它区别于同期多数步态库的地方:.ts 给人看、给 pandas 读,.let 与 .rit 给 WFDB 工具链读。两种封装覆盖的时间范围不同,§2.3 会展开。
2.2 字段与记录的完整字典
派生表十三列,无表头,全部是浮点。列的顺序固定,语义按官方页面逐条给出。
| 列序 | 名称 | 单位 | 含义 |
|---|---|---|---|
| 1 | 经过时间 | 秒 | 本次左足着地距记录开始的时刻 |
| 2 | 左足步幅 | 秒 | 左足相邻两次着地之间的时间 |
| 3 | 右足步幅 | 秒 | 右足相邻两次着地之间的时间 |
| 4 | 左足摆动相 | 秒 | 左足离地到再次着地的时间 |
| 5 | 右足摆动相 | 秒 | 右足离地到再次着地的时间 |
| 6 | 左足摆动相占比 | % | 第四列除以第二列 |
| 7 | 右足摆动相占比 | % | 第五列除以第三列 |
| 8 | 左足支撑相 | 秒 | 左足着地到离地的时间 |
| 9 | 右足支撑相 | 秒 | 右足着地到离地的时间 |
| 10 | 左足支撑相占比 | % | 第八列除以第二列 |
| 11 | 右足支撑相占比 | % | 第九列除以第三列 |
| 12 | 双支撑 | 秒 | 两足同时触地的时间 |
| 13 | 双支撑占比 | % | 第十二列相对步幅的百分比 |
十三列可以按语义分成三族,这个分法比按列序记更实用。
十三列可以按语义分成三族。第一族只有第一列,是时间轴,回答"这一步发生在记录的哪一刻",它能自校验:相邻两行的差值应当等于下一行的左步幅。第二族是第二与第三列,是周期总量,回答"两侧各走一拍用了多久",它无法自校验,只能与时间列对照。第三族是第四到第十三列,是相位切分,回答"一拍之内怎么分配",这一族内部关系最紧密:同侧摆动相加同侧支撑相等于同侧步幅,四个占比列等于各自的秒数除以同侧步幅。三族的分法比按列序硬记更实用,因为它直接告诉你哪些列可以互相验算、哪些不能。
临床表八列,制表符分隔,第一列没有列名。
| 列序 | 名称 | 单位 | 说明 |
|---|---|---|---|
| 1 | 记录名 | 无 | 与文件名前缀一致,用于关联 |
| 2 | GROUP | 无 | 组别标签,写作 park、hunt、control 或 subjects |
| 3 | AGE(YRS) | 岁 | 整数 |
| 4 | HEIGHT(meters) | 米 | 小数 |
| 5 | Weight(kg) | 千克 | 小数,个别写作 MISSING |
| 6 | gender | 无 | m 或 f |
| 7 | GaitSpeed(m/sec) | 米每秒 | 自选步速 |
| 8 | Duration/Severity | 视组别而定 | 见下表 |
第八列是三种量表的拼盘,各自的方向不同,这是全库最容易被误读的一列。
| 组别 | 第八列的含义 | 方向 | 取值范围 |
|---|---|---|---|
| 帕金森病 | Hoehn 与 Yahr 分级 | 越高越重 | 分级序号 |
| 亨廷顿病 | 总功能容量 TFC | 越低越重 | 功能容量分数 |
| 渐冻症 | 确诊至今的月数 | 越长越久,不表示轻重 | 月 |
| 健康对照 | 占位符 | 无方向 | 固定为 0 |
官方页面把 Hoehn 与 Yahr 写作 Hohn and Yahr,通行拼法是 Hoehn and Yahr,此处按官方原文并列,不做改写。
完整性上有两处缺口。hunt20 只有七个字段,严重度整列缺席,按列读入会错位;als13 的体重写作 MISSING。两者都不是零值,应先按八列解析,再把空字段与 MISSING 统一转成缺失值。
2.3 一条记录的完整解剖
以 park1 为例,也就是 §4.2 的案例所用的那一条。它是一名七十七岁男性,身高两米,体重八十六千克,自选步速每秒零点九八米,H&Y 四级。
头文件三行,全文如下。
park1 2 300 90000
park1.let 212 1000 12 0 -96 24342 0 left-foot
park1.rit 212 1000 12 0 235 -21509 0 right-foot
第一行四个字段依次是记录名、信号通道数、采样率、每通道采样点数。两个通道、300 Hz、90,000 点,换算过来正好是三百秒。后两行是每个通道的声明,字段依次是文件名、存储格式、增益、位深、零点、首样本值、校验和、块大小、通道描述。格式 212 是 WFDB 的一种打包方式,每三个字节存两个 12 位样本,这解释了为什么一路信号的体积是十三万五千字节而不是九万点。
派生表无表头,前四行原文如下。
21.7700 1.1333 1.0933 0.3700 0.3300 32.65 30.18 0.7633 0.7633 67.35 69.82 0.4333 38.24
22.8767 1.1067 1.1200 0.3800 0.3500 34.34 31.25 0.7267 0.7700 65.66 68.75 0.3767 34.04
24.0833 1.2067 1.1467 0.4467 0.3800 37.02 33.14 0.7600 0.7667 62.98 66.86 0.3800 31.49
25.1667 1.0833 1.1200 0.3567 0.3133 32.92 27.98 0.7267 0.8067 67.08 72.02 0.4133 38.15
临床表对应的一行,制表符分隔,如下。
park1 park 77 2 86 m 0.98 4
把三份文件对起来,能读出四件事。
第一,一行对应一次左足着地,不是一个步态周期里的任意时刻。验算方法很直接:第二行时间 22.8767 减第一行 21.7700 得 1.1067,正好等于第二行的左步幅;第三行减第二行得 1.2067,等于第三行的左步幅。整张表可以用同样的差分逐行复核。
第二,两条算术关系可以用来验证文件是否被改过。同侧摆动相加同侧支撑相等于同侧步幅:第一行 0.3700 加 0.7633 得 1.1333,与左步幅一致;右侧 0.3300 加 0.7633 得 1.0933,与右步幅一致。占比列等于秒数除以同侧步幅:0.3700 除以 1.1333 得 32.65,与第六列一致。
第三,双支撑那一列不服从上面的关系。第一行 0.4333 秒,若用两侧支撑相之和减去步幅,得 0.7633 加 0.7633 减 1.1333,等于 0.3933 秒,与 0.4333 不等。这说明该列不是由同行其他列推出的,而是另有判定口径。官方页面没有给出公式。
第四,派生表与原始波形覆盖的时间范围不同。派生表首行是 21.77 秒,原始波形从 0 秒开始、到 300 秒结束。前二十余秒在派生表里不存在,在波形里还在。这个差别的实际意义是:想改着地判定,可以从头重做;想接受官方口径,直接用 .ts。
| 观察项 | 派生表 .ts |
原始波形 .let/.rit |
|---|---|---|
| 时间范围 | 约 21.8 秒至 298.5 秒 | 0 秒至 300 秒 |
| 时间分辨率 | 每个步态周期一行 | 每 1/300 秒一点 |
| 是否滤波 | 官方明示未滤波 | 官方未说明 |
| 是否可改判定 | 不可,只能整体重算 | 可,阈值由使用者定 |
| 体积 | 二十余 KB | 每路 135,000 字节 |
| 适合的任务 | 变异性、相位占比、组间比较 | 事件检测、波形形态、算法验证 |
2.4 四组与同一个五分钟
四组的差别主要在疾病与人数,行走方案是一致的。这一点与 gaitdb 相反:那边健康组绕圈十五分钟、患者组走廊六分钟,跨组比较天然混着协议差;这边所有组都走五分钟,方案差被消掉了。
| 组别 | 人数 | 记录名前缀 | 行走方案 | 严重度指标 |
|---|---|---|---|---|
| 帕金森病 | 15 | park |
五分钟,自选步速 | H&Y 分级 |
| 亨廷顿病 | 20 | hunt |
五分钟,自选步速 | 总功能容量 TFC |
| 肌萎缩侧索硬化 | 13 | als |
五分钟,自选步速 | 确诊月数 |
| 健康对照 | 16 | control |
五分钟,自选步速 | 占位 0 |
记录数与人数的一致性可以三处交叉核对:RECORDS 文件六十四行;临床表六十四行数据(另有一行表头、一行杂物);页面声明的人数之和是十五加二十加十三加十六。三处都对得上,说明没有隐藏的重复会话,也没有被排除却仍留在清单里的记录。
五分钟这个数字有三个来源互相支持:派生表的末行时间接近三百秒(park1 是 298.5 秒)、头文件声明九万点除以 300 Hz 得三百秒、原始论文摘要写明受试者以平时步速行走五分钟。三者一致。真正需要留意的是被丢掉的那一段:六十四条记录的首行时间并不相同,最早 21.5 秒,最晚 63.9 秒。起算点逐条判定,官方没给规则。
2.5 与同类资源的字段差异
把 gaitndd 放进公开步态资源的谱系,它的位置不在"最瘦"那一端,也不在"最全"那一端,而在中间偏薄的地方:有原始波形,但只有两路;有相位切分,但只有时长没有角度。
| 资源类型 | 典型字段 | 采样粒度 | 与本库的差异 |
|---|---|---|---|
| 测力台步态库 | 三维力与力矩、压力中心 | 数百至上千赫兹 | 本库只有一维压阻,无力的方向 |
| 垂直地反力库 | 多分区垂直力波形 | 100 Hz 上下 | 本库两路整足,不分分区 |
| 惯性传感器库 | 三轴加速度、角速度 | 数十至数百赫兹 | 本库无肢体运动学 |
| 光学动捕库 | 关节三维坐标、步长步宽 | 每秒上百帧 | 本库无空间信息 |
| 临床步态评分库 | 量表分、计时起立行走 | 每次评估一个分数 | 本库有连续序列,量表只有一列 |
| gaitndd | 双足压阻波形 + 十三列节律量 | 300 Hz / 每周期一行 | 时序最完整,维度最窄 |
窄有明确的好处:十三列里没有一列需要模态对齐或坐标变换,任何两组数字放在一起,单位都是秒或百分比。坏处同样明确:它答不了"怎么走",只能答"走了多久、怎么分配"。
与同门两个库的字段差异更值得单独说,因为它们的名字太像。gaitdb 是十五人三组,受试者是健康青年、健康老年与帕金森病各五名,没有原始波形,只发两列;gaitndd 是六十四人四组,疾病谱换成帕金森病、亨廷顿病、渐冻症加对照,波形与十三列并存。gaitpdb 则是另一个量级:一百六十六人两组,只有帕金森病与对照,发布的是十六个分区的垂直地反力,采样率降到 100 Hz,单条时长约两分钟,派生列十九列。三个库分别对应"最小信息量的时间轴"“跨病种的相位切分”"分区力信号的细粒度"三种需求,彼此不构成替代关系。
2.6 体积与"够不够算"
官方标注未压缩合计 17.9 MB。这个数字几乎全部由原始波形贡献:单条记录两路各十三万五千字节,六十四条加起来就是十七兆出头,剩下的空间属于派生表(十余至二十余 KB)、三行头文件(约一百二十字节)以及清单、校验和、测试页这几个全局文件(合计三十余 KB)。换句话说,这份数据的体积由采样率决定,不由人数决定:把人数翻一倍只多一倍波形,把采样率降到 100 Hz 则会直接砍到三分之一。
够不够算,标准不是体积,而是序列长度。六十四条记录的行数从二百零三到三百一十不等;够算均值、标准差、变异系数与相位占比,对需要上千拍才稳定的长程相关分析则偏短。想拿它做分形动力学,得先接受"每人只有二三百拍",或者把同组多条接起来——后者会引入个体间差异,属于方法选择而非数据能力。
§3 它是谁的数据:一间波士顿实验室与三篇论文
3.1 一个署名与六个名字
PhysioNet 页面上这条资源的作者只有一位:Jeffrey Hausdorff。署名机构写作 Beth Israel Hospital, Boston, MA, USA。同门的 gaitdb 沿用了完全相同的署名,两者在这个字段上无法区分;机构后来的名称与隶属关系,页面没有交代。通讯作者的联系方式被页面隐藏,需登录才能查看。
单人署名不代表单人完成。参考文献里的六位作者——Hausdorff、Lertratanakul、Cudkowicz、Peterson、Kaliton、Goldberger——分别对应临床招募、信号处理与动力学分析,其中 Goldberger 是 PhysioNet 的创建者之一。数据页面只署第一作者,是那个年代资源页的常见做法。
3.2 时间线:论文在前,数据在后
这份数据不是先有库再有论文,而是先有论文再把数据整理上线。顺序反过来看,很多设计选择就说得通了。
| 年份 | 事件 | 与本库的关系 |
|---|---|---|
| 1996 | 分形动力学与步幅长程相关的论文发表 | 确立了步幅序列这一分析对象 |
| 1997 | 衰老与亨廷顿病的步幅相关结构论文发表 | 亨廷顿病组的方法学来源 |
| 1998 | 帕金森病与亨廷顿病的步态变异性论文发表 | 两病组的变异性口径来源 |
| 2000 | 渐冻症步态节律动力学的论文发表 | 页面指定的引用文献,写明五分钟方案 |
| 2000-12-21 | 数据以 1.0.0 版上线 | 此后未更新 |
页面的引用要求很明确:引用 2000 年那篇渐冻症论文。该论文摘要写明受试者"以平时步速行走五分钟,佩戴踝部记录器",并把渐冻症组的节律与健康对照、帕金森病、亨廷顿病三组做了比较。这就解释了为什么库里有四组而不是两组:比较框架在论文里已经定好。
3.3 采集现场:鞋里两片薄膜,踝上一个盒子
设备链与同门资源一致,四步走完。
| 步骤 | 发生什么 | 输出 |
|---|---|---|
| 1 | 压阻薄膜置于鞋内,随足底受力改变电阻 | 模拟电压 |
| 2 | 12 位模数转换,300 Hz 采样 | 数字序列 |
| 3 | 踝部便携记录器写入存储 | 单通道原始信号 |
| 4 | 事后判定着地时刻,切分相位 | 十三列派生量 |
官方对这一路的描述只有一句:输出大致与足下受力成正比。这句话的措辞很谨慎——"大致"与"成正比"并列,意味着它既不是线性标定,也不是任意单位。使用者能确定的是相对大小与时刻,不能确定的是绝对力值。
采样参数可以逐项确认,且两处来源一致:头文件声明两个通道、300 Hz、每通道九万点;通道声明里增益为 1000、位深 12 位、零点 0、存储格式为 WFDB 的 212。页面侧只给了采样率与"压阻"这一层描述,位深与格式要从文件里读。两边合起来,才够把一路波形完整解出来。
3.4 三层信息与它们的可信度
这份资源的信息分布在三个层次上,可信度并不相同,混着用会出错。
| 层次 | 内容 | 可信度 | 风险 |
|---|---|---|---|
| 官方页面 | 分组人数、文件名后缀约定、十三列语义、量表对应关系 | 高,逐条可查 | 个别拼写与列标签不一致 |
| 原始论文 | 五分钟方案、分析框架、各组比较结论 | 高,但只覆盖研究问题 | 不描述文件结构 |
| 文件本身 | 行数、时间范围、数值关系、缺失标记 | 高,可逐字节核对 | 语义需靠页面解释 |
三层要分清:页面告诉你第十三列是双支撑占比,但不告诉你它怎么算;论文告诉你受试者走了五分钟,但不告诉你派生表只保留后四分多钟;文件告诉你这里有二百四十五行,但不告诉你为什么是这个数。任何一条结论,最好同时落到两层以上。
§4 它最独特的东西:原始与派生同时在场
4.1 双份发布意味着什么
多数步态库只给一种东西:要么原始波形,要么派生指标。gaitndd 两份都给。这个选择在当时并不常见,它带来三种用法:直接用派生表算指标,与他人结果可比,省去切分环节;用自己的算法从波形重做切分,可以验证算法,也可以质疑官方口径;两份对照着看,则能定位差异究竟来自切分还是来自指标定义。
陷阱在于"两份应该一致"这个默认假设。它们覆盖的时间范围不同,波形从 0 秒开始,派生表要从二十余秒到一分钟左右才起算;原始波形未说明是否做过预处理,派生表明确写了未滤波。想逐拍对齐,必须先把时间窗裁到同一段,再确认着地判定的相位定义——是取上升沿、峰值,还是过零点。这三件事官方都没写。
于是取舍变成一道明确的选择题。信派生表的代价是放弃可复现性:口径由官方定,你无法察觉它的问题,但换来与他人结果的可比性,工作量只有一行读文件。自己重算的代价是放弃可比性:阈值、相位、滤波都得自己声明,别人拿不到同样的数字,但你能覆盖完整五分钟,也能给出与官方的逐拍差异。两条路都合理,唯一不合理的是既用派生表又声称自己重算过。
4.2 案例:park1 的二百四十五行
park1 是这份库里病情最重的一类样本:七十七岁男性,身高两米,体重八十六千克,自选步速每秒零点九八米,H&Y 四级。他的记录有四个文件,派生表二百四十五行。
| 项 | 值 | 来源 |
|---|---|---|
| 记录名 | park1 |
文件名 |
| 组别 | 帕金森病 | 临床表 GROUP 列 |
| 年龄 | 77 岁 | 临床表 |
| 身高 | 2.00 米 | 临床表 |
| 体重 | 86 千克 | 临床表 |
| 性别 | 男 | 临床表 |
| 步速 | 0.98 米每秒 | 临床表 |
| H&Y | 4 级 | 临床表第八列 |
| 派生表行数 | 245 | 文件行数 |
| 首行时间 | 21.77 秒 | 派生表第一列 |
| 末行时间 | 298.50 秒 | 派生表第一列 |
二百四十五行,二百七十六点七三秒的跨度,平均每行一点一三秒。这个数字与临床表里的步速零点九八米每秒大致自洽:步幅约一点一米,步速约一米每秒,两者相除得到每秒不到一步。行数不是样本量,是这个人五分钟里走过的周期数——这是 §4.2 的案例最容易被误读的一处。
再看他的节律形态。第一行的左步幅 1.1333 秒、右步幅 1.0933 秒,双侧相差四十毫秒;摆动相占比分别是 32.65% 与 30.18%,支撑相占比 67.35% 与 69.82%,双支撑占 38.24%。四个百分比加起来超过一百,因为它们不是互斥的切分,而是各自相对同侧步幅的归一化。把双支撑当成"额外的一段"去和摆动相加,会得到错误的合计。
这条记录的用法可分三步:用官方口径算步幅变异系数作组内基线;回到原始波形,用自己的阈值重算一遍,看差多少;再把同组十五条放在一起,看 H&Y 四级的人处在什么位置。三步都不跨组,因此绕开了量表不可比的问题。
4.3 四组之间的可比与不可比
行走方案统一了,剩下的差异集中在三处:年龄、步速、疾病。这三处都不受控。
受控的部分很实在:同一套压阻薄膜与记录器、同样的 300 Hz 与 12 位、全部五分钟。不受控的部分同样实在:步速自选,各组均值不同;年龄不匹配,患者多为中老年;用药状态未记录,帕金森病的开期关期不可辨;行走路线页面完全没写——是直线还是绕圈、有没有转弯,都不清楚,而转弯会在步幅序列里留下与疾病无关的结构。
步速不受控的影响最直接:步幅时长与步速强相关,走得慢的人步幅长、双支撑占比高。三组患者的步速普遍低于对照,因此任何"患者双支撑占比更高"的结论,都同时包含了"患者走得更慢"这一层。要拆开,只能用步速做协变量,或者按步速配对取子集——前者在六十四人的规模上很勉强,后者会进一步削弱样本。
年龄不受控的影响类似。神经退行性疾病的患者多为中老年,对照组若偏年轻,"衰老效应"与"疾病效应"就会叠在一起。这份数据没有做年龄匹配的说明,临床表里的年龄列是唯一可用于事后校正的信息。
严重度不可比是第三处,也是最容易被忽略的一处。三种量表的方向不同、量纲不同、取值范围不同,把它们放在一列里排序毫无意义。组内使用是安全的:H&Y 四级的帕金森病患者与二级的患者比,方向明确;TFC 低的亨廷顿病患者与高的比,方向也明确。跨组使用则必须先声明"这里比较的不是严重度,而是各自组内的相对位置"。
4.4 这份数据真正被用来回答的问题
它不是为机器学习准备的,是为节律动力学准备的。官方页面专门列了一组"待研究的问题",把研究议程写得相当直白。
| 官方提出的问题 | 需要哪些列 | 数据是否支持 |
|---|---|---|
| 步幅内部各亚相(摆动、支撑)的动力学是否与步幅本身相同 | 2 至 13 列 | 支持,十三列正是为此设计 |
| 疾病是否影响步态对称性 | 左右成对列 | 支持,左右各有完整一套 |
| 步幅动力学是否非线性 | 步幅序列 | 支持,但单条仅二三百拍 |
| 这种非线性是否随疾病改变 | 组标签 + 步幅序列 | 部分支持,样本量与随访都受限 |
四个问题里,前两个是这份数据相对稀缺的能力。多数公开步态库只给一个总步幅,无法拆亚相;这份库把摆动与支撑都拆开,还给了双支撑。第三个问题受序列长度限制:二三百拍做去趋势波动分析,可用尺度区间很窄,结论对拟合区间敏感。第四个问题受设计限制:横断面、无随访,“随疾病改变"只能读成"在病情更重的人身上不同”。
常见的分析族与它们对应的列,可以逐条对上。步幅变异性吃第二、三列,输出是标准差或变异系数,注意两侧要分开算,不要把左右合并成一个数。相位占比吃第六、七、十、十一列,输出是摆动与支撑的比例,注意它与步速强相关。双支撑分析吃第十二、十三列,常被当作稳定性的间接指标,但该列口径官方未给。对称性分析要同时吃左右成对的四列,输出是左右差或对称指数,前提是先确认两侧的时间对齐方式。长程相关吃第二或第三列,输出是标度指数,前提是接受单条长度只有二三百拍。分布形态分析同样吃步幅序列,输出偏度、峰度,但在这种样本量下估计很不稳。
4.5 边界条件:什么情况下它不再适用
有四类问题,无论怎么处理这份数据都答不了。
需要绝对力值的问题。 压阻输出只有相对大小,没有牛顿。任何涉及冲击力、负荷率、体重归一化力值的分析,都越过了这份数据的能力边界。
需要空间参数的问题。 步长、步宽、足偏角、轨迹,一个都没有。想知道"走得稳不稳"里的几何成分,必须换库。
需要时间演化的问题。 一人一次,无重复,无法回答"用药后是否改善"“一年后是否退化”。
需要人群代表性的问题。 六十四人来自同一间实验室,招募方式、入组标准、排除标准都未在页面说明。把它当作"帕金森病人群"的代表样本,是过度外推。
§5 怎么拿到:从 ZIP 到一条可分析的时间轴
5.1 目录结构与下载面
整个库没有子目录,六十四组文件平铺在同一层。取数有三条路:想看说明先去项目页 https://physionet.org/content/gaitndd/1.0.0/;想一次拿全量就点页面上的 Download ZIP;只要几条记录,直接访问文件目录 https://physionet.org/files/gaitndd/1.0.0/ 单条下载。批量与可复现的脚本走公开云端镜像 s3://physionet-open/gaitndd/1.0.0/,不需要凭据。
几种入口的许可要求一致:免注册、可商用、需署名。没有申请流程,也没有数据使用协议需要签署,这一点比多数临床队列友好得多。
5.2 批量下载
命令行两条路,任选其一。AWS 那条在没有凭据的情况下也能跑,因为桶是公开只读的。
#-- 方式一:递归镜像整个目录(约 18 MB)
mkdir -p data/gaitndd
wget -r -N -c -np -nH --cut-dirs=3 \
-P data/gaitndd \
https://physionet.org/files/gaitndd/1.0.0/
#-- 方式二:走公开 S3 桶,无需凭据
aws s3 sync --no-sign-request \
s3://physionet-open/gaitndd/1.0.0/ data/gaitndd/
#-- 校验完整性
cd data/gaitndd && sha256sum -c SHA256SUMS.txt | tail -n 3
--cut-dirs=3 是为了把 files/gaitndd/1.0.0 这三层目录从本地路径里去掉,否则文件会落在多层嵌套目录里,后续脚本的相对路径全部要改。
5.3 读派生表
派生表无表头,十三列,用 pandas 读的时候必须显式给列名,否则第一行数据会被当成表头吃掉。
import pandas as pd
COLS = [
"t", "stride_l", "stride_r",
"swing_l", "swing_r", "swing_l_pct", "swing_r_pct",
"stance_l", "stance_r", "stance_l_pct", "stance_r_pct",
"double_sup", "double_sup_pct",
]
df = pd.read_csv(
"data/gaitndd/park1.ts",
sep=r"\s+", header=None, names=COLS,
)
#-- 两条结构自检:摆动加支撑等于步幅;占比等于秒数除以步幅
assert (df.swing_l + df.stance_l - df.stride_l).abs().max() < 1e-3
assert (df.swing_l_pct - df.swing_l / df.stride_l * 100).abs().max() < 0.02
print(df.shape, df.t.iloc[0], df.t.iloc[-1])
跑完打印出的形状应当是二百四十五行十三列,时间范围 21.77 到 298.5。断言若失败,先查分隔符:这份文件用制表符,sep=r"\s+" 能兼容制表符与空格,用逗号会读成一列。
5.4 读原始波形
两路波形是 WFDB 格式 212,必须用能解析该格式的库,不能用 numpy 直接读字节,否则得到的是一串打包过的 12 位样本,字节序与位对齐都会错。
import wfdb
import numpy as np
rec = wfdb.rdrecord("data/gaitndd/park1", channels=[0, 1])
sig = rec.p_signal #-- 形状为 90000 x 2
fs = rec.fs #-- 300
print(sig.shape, fs, rec.sig_name)
#-- 用中位阈值粗判着地,只做演示,不代表官方口径
left = sig[:, 0]
thr = 0.5 * (np.nanmin(left) + np.nanmax(left))
above = left > thr
onset = np.flatnonzero(np.diff(above.astype(int)) == 1) + 1
print(len(onset), onset[:5] / fs)
wfdb 读取时会自动套用头文件里的增益与零点,p_signal 已经是换算后的物理量,d_signal 才是原始整数,fs 是 300,sig_name 是通道描述。三者的关系值得记清:d_signal 除以增益得到 p_signal,位深 12 位意味着 d_signal 的绝对值不超过 2047 附近;通道描述来自头文件,写着 left-foot 与 right-foot,但判左右仍应以文件名后缀为准,因为描述是文本,改错了不会报错。最常见的误用是把 p_signal 当牛顿值——它的单位由增益定义,而官方没有声明增益对应的物理单位是毫伏、伏还是别的量。
5.5 一条最短的检查流程
从下载到一条可分析的表,四步足够,全部在命令行里完成。
#-- 第一步:确认记录数与分组
curl -sL https://physionet.org/files/gaitndd/1.0.0/RECORDS | wc -l
curl -sL https://physionet.org/files/gaitndd/1.0.0/RECORDS | cut -c1-4 | sort | uniq -c
#-- 第二步:确认临床表行数与列数
curl -sL https://physionet.org/files/gaitndd/1.0.0/subject-description.txt | wc -l
curl -sL https://physionet.org/files/gaitndd/1.0.0/subject-description.txt | head -n 1 | tr '\t' '\n' | wc -l
#-- 第三步:确认单条记录的行数与时间范围
curl -sL https://physionet.org/files/gaitndd/1.0.0/park1.ts | wc -l
curl -sL https://physionet.org/files/gaitndd/1.0.0/park1.ts | sed -n '1p;$p' | cut -f1,2
#-- 第四步:确认头文件声明的采样参数
curl -sL https://physionet.org/files/gaitndd/1.0.0/park1.hea
第二步要记住两个数:临床表六十六行——表头一行、数据六十四行,另有一行只含制表符与一个数字,是残留杂物;列数八。行数对不上时,先看是不是把杂物行当成了一名受试者。
5.6 三类常见读取错误
| 现象 | 原因 | 改法 |
|---|---|---|
| 派生表第一行数据丢失 | 用了默认表头 | 显式 header=None 并给列名 |
| 读出只有一列 | 按逗号分隔 | 改 sep=r"\s+" 或 sep="\t" |
| 波形数值全为零或跳变 | 直接按字节读二进制 | 用 WFDB 读取器,套用增益与零点 |
| 临床表末列带异常字符 | CRLF 行尾 | 读取时指定 lineterminator 或先转码 |
| 组别统计多出一类 | GROUP 列对渐冻症写的是 subjects |
用记录名前缀判组,不要用该列 |
| 派生表行数比预期少 | 起算点被推到二十余秒至一分钟 | 属于预处理约定,不是缺数据 |
第五项是这份库特有的坑:GROUP 列在渐冻症那十三行写作 subjects,记录名前缀却是 als。按该列分组会多出一个 subjects 类、渐冻症组消失;稳妥做法是用前缀判组。
import re
def group_of(record: str) -> str:
#-- 以记录名前缀为准,避开 GROUP 列的 subjects 写法
m = re.match(r"^(park|hunt|als|control)", record)
if not m:
raise ValueError(f"未识别的记录名: {record}")
return m.group(1)
print(group_of("als7"), group_of("park1"), group_of("control16"))
§6 与库内条目的关系
6.1 关系图谱
站内与步态相关的词条已经有一族,gaitndd 在其中的位置需要说清两件事:它与 gaitdb 是什么关系,以及它与站内另一条同源词条如何分工。
先说 gaitdb。两者是同一实验室的姊妹库,不是同一个库的两个版本。共同点很硬:同一作者组、同一套鞋内压阻采集链、同在 PhysioNet 于 2000 年上线、同一份 ODC 署名 1.0 许可。不同点同样硬:受试者不同、记录数不同、发布列数不同、DOI 不同、文件名体系不同。
| 维度 | gaitdb | gaitndd |
|---|---|---|
| 全名 | Gait in Aging and Disease Database | Gait in Neurodegenerative Disease Database |
| 上线日期 | 2000 年 10 月 13 日 | 2000 年 12 月 21 日 |
| DOI | 10.13026/C2C889 | 10.13026/C27G6C |
| 受试者 | 15 人 | 64 人 |
| 分组 | 健康青年 5、健康老年 5、帕金森病 5 | 帕金森病 15、亨廷顿病 20、渐冻症 13、对照 16 |
| 记录名 | y4-21-si、o1-76-si、pd1-si |
park1、hunt1、als1、control1 |
| 每人文件 | 1 个文本 + 注释封装 | 4 个:头文件、双足波形、派生表 |
| 发布列数 | 2 | 13 |
| 原始波形 | 无 | 有,双足两路 |
| 行走方案 | 健康组绕圈约十五分钟,患者组走廊约六分钟 | 全部五分钟,自选步速 |
| 未压缩体积 | 三百余 KB | 17.9 MB |
两者的分工可以一句话说清:gaitdb 是"衰老与单病"的瘦样本,只留时间轴;gaitndd 是"三种病加对照"的厚样本,保留波形与相位。一个用来验证方法在最小信息量下是否成立,一个用来回答相位切分与跨病种比较的问题。
能不能互换使用,要分三层回答。 第一层,分析对象可以互换:两者最终都能得到一条步幅时长序列,任何只吃这条序列的方法在两个库上都能跑。第二层,记录不能互换:gaitdb 里没有亨廷顿病与渐冻症,gaitndd 里没有健康青年组,缺的组补不回来。第三层,受试者不能假定重叠:两个页面的 DOI、记录命名与行走方案都不同,官方也没有给受试者对应表,因此不能把 gaitdb 的五个帕金森病患者与 gaitndd 的十五例做去重合并,也不能假定前者是后者的子集。
| 使用场景 | 该选哪个 | 理由 |
|---|---|---|
| 验证一个只吃步幅序列的估计量 | 任一,gaitdb 更快 | 十五个文件、三百余 KB |
| 比较青年与老年的节律 | gaitdb | gaitndd 没有青年组 |
| 比较三种神经退行性疾病 | gaitndd | gaitdb 只有帕金森病 |
| 需要摆动相、支撑相、双支撑 | gaitndd | gaitdb 只有两列 |
| 需要从波形重做着地判定 | gaitndd | gaitdb 不发布波形 |
| 两组数据合并做组间比较 | 不建议 | 方案、列数、人群都不同 |
再说站内那条同源词条。以 gait-in-aging 为 slug 的旧词条,索引的正是同一个 PhysioNet 资源,标题里用了 GaitND 这个简称。它与本页指向同一批文件,区别只在叙述口径:旧词条按"神经退行性疾病步态动力学"来讲,本页按"采集链与双份发布"来讲。两页的数据事实应完全一致,若发现数字对不上,以官方页面与文件为准。
| 词条 | 关系 | 一句话区隔 |
|---|---|---|
| gaitdb | 同实验室姊妹库 | 十五人三组、只发两列,本页六十四人四组、发波形加十三列 |
| gait-in-aging | 同一资源的另一条词条 | 指向同一 DOI,叙述侧重不同 |
| gaitpdb | 同组后续的大样本 | 那边九十三例帕金森病加七十三名对照、100 Hz 垂直地反力 |
| hbedb | 同域不同任务 | 那边是静态站立的压力中心,这边是行走中的节律 |
| multimodal-gait-dataset | 模态互补 | 那边脑电肌电惯性测力四路同步,这边只有双足压阻 |
| live-gaitneurokids | 人群互补 | 那边是儿童神经发育人群,这边是成人 |
| daphnet-fog | 应用互补 | 那边面向冻结步态检测,这边面向节律结构 |
| sisfall | 应用互补 | 那边面向跌倒检测,这边面向疾病分型 |
| parkinsons-disease-smartwatch | 设备互补 | 那边是腕表在自由生活中的记录,这边是实验室五分钟 |
6.2 检索路径
gait 这个前缀在站内会命中一大片,三个库的名字又都以 gait 开头,点错是常态。
| 你想找的 | 检索词 | 会命中的词条 |
|---|---|---|
| 本页 | gaitndd |
三种病加对照的四组节律库 |
| 两列步幅的迷你库 | gaitdb |
十五人、九千余步幅 |
| 帕金森病大样本力信号 | gaitpdb |
九十三例患者加七十三名对照 |
| 静态平衡 | hbedb |
光脚站立六十秒 |
| 冻结步态 | daphnet-fog |
可穿戴加速度与标注 |
| 儿童步态 | live-gaitneurokids |
脑瘫与典型发育 |
| 智能手表 | parkinsons-disease-smartwatch |
自由生活中的腕表数据 |
实用区分法是看单位与列数:出现"两列、步幅、三百余 KB"是 gaitdb;出现"十三列、摆动相、原始波形"是 gaitndd;出现"十六分区、垂直地反力"是 gaitpdb;出现"压力中心、睁眼闭眼"是 hbedb。
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
看到"六十四人、十三列、300 Hz 原始波形"这三个数字,最容易形成两个误判。第一个是把六十四当成可用于训练的样本量,于是以为这是一份中等规模的分类数据;第二个是把"原始波形"当成已标定的力学记录,于是以为可以算出牛顿级的力。
两个误判的根子相同:把"发布了什么"与"发布的东西能支撑什么"混为一谈。六十四人对应的是一条记录一个人,没有重复测量,也没有独立测试集;原始波形对应的是相对电压,不是力。做完这两步校正,两个词就各归其位。本节评分都建立在这个校正之上。
7.1 DAIMS 五维评分
按 DAIMS 五维框架打分,每维二十分,满分一百。这个框架把可发现、可获取、可互操作、可复用、可引用分开评估,避免用一句"好不好用"笼统带过。分数是相对同类公开步态资源的水平,不是绝对结论。
| 维度 | 得分 | 依据 | 扣分点 |
|---|---|---|---|
| 可发现 | 16 | 有 DOI、有平台页、被节律研究反复引用 | 页面标题不含缩写,与 gaitdb 极易混淆 |
| 可获取 | 18 | 免注册、整包 17.9 MB、无需申请 | 无查询接口,无按组筛选的 API |
| 可互操作 | 15 | 原始波形走 WFDB 标准格式 | 派生表是自制制表符文本,临床表无受控词表 |
| 可复用 | 15 | 许可宽松、定义清晰、双份数据可交叉验证 | 无公式、无标定、无用药与随访 |
| 可引用 | 18 | DOI 稳定、两篇原始论文可引 | 平台侧无独立数据论文 |
| 合计 | 82 | — | — |
八十二分里,扣得最重的是互操作与可复用两项。互操作的问题在派生层:波形用了国际通用的 WFDB,派生表却是十三列无名制表符文本,没有列名、没有单位、没有版本号。可复用的问题在口径:十三列的定义只到语义层,没到公式层,任何想复现的人都得先从数值关系反推。
7.2 三处需要自己核对的地方
第一处是临床表的组别列。渐冻症十三行的 GROUP 写成 subjects,与记录名前缀 als 不一致。两个口径并存,官方未说明哪个是权威。按前缀读,四个组整齐;按该列读,会出现一个叫 subjects 的类,且渐冻症消失。
第二处是严重度列的语义。页面说这一列是"病情严重度或病程的度量",并逐组给出对应关系;但列名只有一个,单位随组别变化。把它当作统一数值列使用,是一种误读;把它当作四个独立的组内变量使用,才是页面本意。
第三处是派生表与波形的覆盖范围。头文件声明九万点、三百秒,派生表首行却最早落在 21.5 秒、最晚 63.9 秒。两者不是矛盾,而是两种粒度的两种预处理:波形留着全程,派生表只保留稳态段。官方没有在页面上写这条截断规则,只能从文件里读出来。
把这几个地方的两个口径放在一起看,处理原则是一样的:不判对错,只用可核对的那一侧,并把另一侧注明。渐冻症组按前缀读,临床表的写法留作备注;覆盖时长按文件读,页面的"五分钟"当作方案描述;严重度按组内用,跨组只谈方向不谈数值;力值只谈相对大小,不给单位。
7.3 已知的、可枚举的偏差
偏差可以逐条列出,每一条都能在页面、论文或文件里找到依据。
| 偏差 | 方向 | 依据 | 后果 |
|---|---|---|---|
| 单次会话 | 无重复测量 | 一人一条记录 | 无法估计测量信度 |
| 无随访 | 横断面 | 记录名无时间维度 | 无法研究进展与干预 |
| 用药未记录 | 状态不明 | 临床表八列中无用药项 | 帕金森病的开期关期不可辨 |
| 步速自选 | 组间不可比 | 各组步速不同 | 步幅差异混入步速差异 |
| 年龄未匹配 | 衰老与疾病混淆 | 临床表仅给年龄 | 无法分离两个因素 |
| 严重度量纲不一 | 跨组不可比 | 三种量表拼在一列 | 数值排序无意义 |
| 对照填占位 0 | 假零点 | 页面明示任意 0 | 回归会得到假趋势 |
| 波形未标定 | 无绝对力值 | 页面只写大致成正比 | 力学量分析不可做 |
| 派生量无公式 | 不可精确复现 | 页面只给语义 | 重算结果与官方有系统差 |
| 单中心 | 代表性未知 | 页面无招募说明 | 人群外推受限 |
其中最容易被叠加使用的是第四条与第五条。三组患者的步速普遍低于对照,年龄又普遍高于对照,于是"患者步幅更长、双支撑更多"这个观察同时包含了慢速效应与年龄效应。想把疾病效应单独拎出来,需要按步速与年龄配对取子集,而六十四人的规模经不起这样的切分。§4.2 的案例正好说明这一点:一名七十七岁、步速不到一米每秒的 H&Y 四级患者,他的节律特征无法与"高龄"和"慢速"分开。
7.4 外部验证矩阵
判断一份数据能不能支撑结论,看它被外部怎么用过,比看它自己怎么写更有说服力。
| 验证维度 | 是否有外部证据 | 说明 |
|---|---|---|
| 原始论文内的自证 | 有 | 2000 年论文用同一方案比较四组节律 |
| 同组早期论文的方法承接 | 有 | 1996 至 1998 年三篇论文奠定指标口径 |
| 跨实验室复现同一结论 | 部分有 | 多个课题组报告过患者节律变异性升高 |
| 与测力台金标准对照 | 间接有 | 着地判定法的原方法曾与力台比对 |
| WFDB 工具链读取 | 有 | 格式 212 是通用格式,工具成熟 |
| 与其他传感器同步采集 | 无 | 采集时无同期对照设备 |
| 长期稳定性 | 无 | 单次会话,无随访 |
第一行值得展开。四组结构不是事后拼的,而是 2000 年那篇论文的比较框架直接落成的数据形态:渐冻症组要和健康对照比,也要和帕金森病、亨廷顿病比。数据的设计与论文的问题是一件事的两面,这既是优点(口径统一),也是限制(只服务那一组问题)。
7.5 它为何能持续:三种病共用一条时间轴
二十六年不更新、十七兆、六十四个人。按现代数据集的标准,它早该被更大的库取代。但它仍被取用,原因不在规模,而在它是少数几份把三种神经退行性疾病放进同一套采集与同一套切分口径里的公开数据。
想再造一份,难的从来不是设备——两片压阻薄膜与一台踝部记录器并不昂贵——难的是让三个专科的门诊同意用同一个五分钟方案、同一套着地判定、同一份十三列输出。稀缺的不是人数,是一个能跨病种对齐的坐标系。
§8 生态位与历史
8.1 历史沿革
PhysioNet 在 2000 年前后上线了一批小型生理信号合集,覆盖心电、呼吸、步态等节律,定位都是"小而干净的真实序列",供方法学研究与教学使用。gaitndd 是步态这一支里人数较多的一份,也是少数同时发布原始波形与派生量的。
| 阶段 | 时间 | 发生了什么 |
|---|---|---|
| 方法奠基 | 1996 至 1998 | 三篇论文确立步幅序列与长程相关的分析框架 |
| 疾病扩展 | 2000 | 渐冻症论文把三病一对照的比较框架写定 |
| 上线 | 2000-12-21 | 1.0.0 版发布,六十四条记录 |
| 平台迁移 | 2010 年代 | 头文件与波形的修改时间均落在 2012 年 |
| 现状 | 至今 | 内容未变,仅下载入口随平台改版 |
第四行值得注意:头文件与两路波形的修改时间都落在 2012 年,而 .ts 仍是 2000 年。这说明平台在某次迁移中重新生成过原始信号与头文件,派生表保持原样。重新生成时是否改动了数值,时间戳回答不了。
8.2 与同期资源的分工
同期还有几类资源在解决相邻问题:心率变异性库做心搏间期,方法同源而生理系统不同;睡眠与呼吸节律库把尺度拉到数小时,事件定义换成呼吸与觉醒;测力台步态库精于单步力学,代价是只能测几步;惯性传感器库把场景搬到自由生活,代价是序列纯度;大规模临床队列把人数推到数百上千,代价是各家口径难统一。gaitndd 站在中间:人数不多,组别最全;维度不宽,相位最细。
8.3 生态位:跨病种的参照系
在机器学习语境里,它排不上号;在步态节律的方法学语境里,它占一个规模无法替代的位置:跨病种参照系。
一个研究者在报告"某病患者的步幅变异性升高"时,审稿人常会问:与什么比?与健康人比是一个答案,与其他神经疾病比是另一个答案。前者只能说明"病了",后者能说明"这种病与那种病不一样"。gaitndd 提供的是后一个答案所需的对照:同一设备、同一方案、同一套切分,三个病种各自一组。换成任何单病种库,对照组都只能是健康人;换成任何大规模队列,切分口径又各不相同。
8.4 谁在用它,用来做什么
从公开文献看,使用者集中在三类:做非线性时间序列方法的工程与应用数学组、做步态与运动控制的生物力学组、做神经疾病运动症状的临床研究组。三类用法的共同点是把它当对照或试验台,而不是训练素材。
拆开看,方法学研究者要全部六十四条序列,用来比较估计量在病理序列上的行为;生物力学研究者要相位列,看摆动与支撑如何分配;临床研究者只取某一病种的一组。这也解释了它的引用曲线为什么平缓而长尾:工具型资源解决的问题不会过时,但也不会成为热点。
§9 使用指引
9.1 三种角色的路径
| 角色 | 第一步 | 第二步 | 第三步 |
|---|---|---|---|
| 方法学研究者 | 读页面确认十三列语义 | 用 §5.3 的两条断言验一遍结构 | 在六十四条序列上跑你的估计量 |
| 生物力学研究者 | 先看摆动与支撑的占比列 | 用 §4.2 的案例检查单条记录 | 组内先做个体曲线,再做组间描述 |
| 临床研究者 | 明确三组严重度不可比 | 只在组内做严重度分层 | 跨组结论必须写明步速与年龄差异 |
三条路径的共同点是先看单条、再看多条。跳过第一步直接跑全量,容易在两处翻车:把 GROUP 列当分组依据会让渐冻症组消失;把双支撑占比当成与摆动并列的切分会算出超过一百的合计。
9.2 一条最短的可用流程
从下载到一张分组汇总表,两步。
#-- 第一步:取全量并校验
mkdir -p data && cd data
wget -q -r -N -c -np -nH --cut-dirs=3 \
-P gaitndd https://physionet.org/files/gaitndd/1.0.0/
cd gaitndd && sha256sum -c SHA256SUMS.txt > /dev/null && echo ok
import glob
import os
import re
import pandas as pd
COLS = ["t", "stride_l", "stride_r", "swing_l", "swing_r", "swing_l_pct",
"swing_r_pct", "stance_l", "stance_r", "stance_l_pct",
"stance_r_pct", "double_sup", "double_sup_pct"]
def group_of(name):
#-- 以记录名前缀判组,规避临床表里 als 组被写成 subjects
return re.match(r"^(park|hunt|als|control)", name).group(1)
rows = []
for path in sorted(glob.glob("data/gaitndd/*.ts")):
name = os.path.basename(path)[:-3]
df = pd.read_csv(path, sep=r"\s+", header=None, names=COLS)
rows.append({
"record": name,
"group": group_of(name),
"cycles": len(df),
"cv_stride_l": df.stride_l.std() / df.stride_l.mean(),
"double_sup_pct": df.double_sup_pct.mean(),
})
out = pd.DataFrame(rows)
print(out.groupby("group")[["cycles", "cv_stride_l", "double_sup_pct"]].median())
打印出的表只有四行。它的用途不是下结论,而是在看具体数字之前先确认三件事:每组人数对不对、行数量级是否合理、双支撑占比是否在常识范围内。任何一项异常,先回到 §5.5 的检查流程,而不是继续建模。
9.3 引用方式
| 对象 | 引用内容 |
|---|---|
| 数据 | Hausdorff J. Gait in Neurodegenerative Disease Database (version 1.0.0). PhysioNet. 2000. doi:10.13026/C27G6C |
| 指定论文 | Hausdorff JM, Lertratanakul A, Cudkowicz ME, Peterson AL, Kaliton D, Goldberger AL. Dynamic markers of altered gait rhythm in amyotrophic lateral sclerosis. J Appl Physiol. 2000;88:2045–2053 |
| 方法来源论文 | Hausdorff JM, Mitchell SL, Firtion R, Peng CK, Cudkowicz ME, Wei JY, Goldberger AL. Altered fractal dynamics of gait. J Appl Physiol. 1997;82:262–269 |
| 平台 | Goldberger A, Amaral LAN, Glass L, et al. PhysioBank, PhysioToolkit, and PhysioNet. Circulation. 2000;101(23):e215–e220 |
两件事容易漏。第一,只引平台不引指定论文,会让后来者找不到方法学依据,页面本身也明确要求引用 2000 年那篇。第二,许可是署名制,成果里必须致谢数据来源,不能只写"数据来自公开库"。
§10 AI 使用声明
| 项目 | 说明 |
|---|---|
| 写作方式 | 人工阅读官方页面与文件原文后撰写,AI 参与资料整理与文字组织 |
| 事实来源 | PhysioNet 项目页、subject-description.txt、RECORDS、park1 的四个文件 |
| 未做的事 | 未做分布统计,未训练任何模型,未计算组间显著性 |
| 数字口径 | 人数与分组以页面为准,行数与时间范围以文件为准 |
| 口径冲突 | 渐冻症组标签、严重度列语义、派生表覆盖时长三处并列 |
| 未核实项 | 招募与入组标准、用药状态、行走路线形状、设备标定细节 |
| 许可判断 | 按页面标注的 ODC 署名 1.0 表述,不代替法律意见 |
| 适用边界 | 仅描述数据资源,不构成临床诊断或康复建议 |
常见误读(避坑清单)
| 说法 | 实际 | 证据 |
|---|---|---|
| 这是帕金森病步态库 | 帕金森病只占十五例,人数最多的是亨廷顿病二十例 | 页面数据描述段与 RECORDS |
| 六十四条记录就是六十四类样本 | 一人一条,无重复会话,也没有独立测试集 | 临床表六十四行,记录名一人一个 |
| 300 Hz 就是发布粒度 | 300 Hz 描述采集端;派生表每周期一行 | 头文件与 .ts 行距 |
| 原始波形可以算出牛顿力 | 官方只说输出大致与足下受力成正比 | 页面数据描述段 |
| 对照组严重度是 0,表示没病 | 官方明示那是任意 0 占位 | 页面 subject-description 段 |
| 三种病的严重度能排成一列 | 分别是 H&Y 分级、TFC、确诊月数 | 页面第八列说明 |
| 它和 gaitdb 是同一个库的大小两版 | DOI、人群、列数、方案都不同 | 两个 DOI 与两份文件清单 |
| 十三列是互斥切分,加起来是一百 | 同侧摆动与支撑本就合成一整拍,双支撑又落在支撑相内 | 第一行四个占比合计二百 |
| 派生表覆盖完整五分钟 | 首行在 21.77 秒,前段被截 | park1.ts 首末行 |
| 渐冻症组在临床表里也叫 als | GROUP 列写的是 subjects |
subject-description.txt 对应十三行 |
FAQ
Q1:gaitndd 一共有多少名受试者?
六十四名,分四组:帕金森病十五例、亨廷顿病二十例、肌萎缩侧索硬化十三例、健康对照十六名。官方把单位写作记录,六十四条记录与临床表六十四行一一对应,一人一条,没有重复会话。
Q2:它和 gaitdb 是同一批数据吗?
不是。两者同出 Hausdorff 组、同在 PhysioNet 于 2000 年上线、共用一套压阻采集链,但受试者、记录数、列数、DOI 都不同。官方没给受试者对应表,因此不能按人合并,也不能假定那边的五个帕金森病患者是这边的子集。
Q3:十三列具体怎么算?
官方只给语义不给公式。从数值上可以核对出两条:同侧摆动相加同侧支撑相等于同侧步幅;四个占比列等于各自的秒数除以同侧步幅。双支撑那一列无法用同行时长简单相减得到,说明它另有判定口径。
Q4:原始波形能直接用来重做着地检测吗?
可以。左右足各一路 300 Hz、12 位波形,覆盖完整五分钟,包括派生表里被截掉的起始段。代价是官方没给标定与阈值口径,重算出的时刻与官方派生列之间会有系统性偏差,需要在方法里写明。
Q5:健康对照的严重度为什么是 0?
官方写明对照组这一列用任意 0 作占位。它不是量表得分,也不是病程为零,而是没有对应测量。把它当数值型协变量放进回归,会得到一条从零起步的假趋势。
Q6:能用来训练疾病分类模型吗?
不建议当作基准。六十四人、四类、一人一条记录,测试集只有十几条,指标的方差大到无法比较模型;也没有第二中心的数据可做外部验证。真要试,只能用留一人交叉验证,并明确结论不外推。
Q7:为什么派生表的起算点不在零秒?
起步阶段有加速过程,节律尚未稳定,派生表把这一段截掉了。官方页面未写这条规则;六十四条记录的首行时间从 21.5 秒到 63.9 秒不等,说明起算点是逐条判的,不是固定截掉多少秒,但也不是随机缺失。原始波形保留全程,需要时可以自己补回来。
Q8:三种病的严重度能做协变量吗?
只能在组内做。H&Y 越高越重,TFC 越低越重,确诊月数只表示时间,三者方向与量纲都不同。跨组使用时,数值排序没有意义,只能声明"比较的是各组内的相对位置"。
Q9:五分钟够做长程相关分析吗?
勉强。单条二百到三百一十拍,去趋势波动分析的可用尺度区间很窄,结论对拟合区间敏感。想稳定估计标度指数通常需要上千拍,这份数据给不了。
Q10:能把它和 gaitpdb 合并吗?
要过三关:步幅定义、着地判定、采样率与滤波。gaitpdb 是 100 Hz 分区垂直力,本库是 300 Hz 整足压阻,派生列数也不同。合并前应逐库确认定义,而不是按列名拼接。
Q11:引用时只引 PhysioNet 页面行不行?
不行。页面明确要求引用 2000 年那篇渐冻症论文,只引平台会让后来者找不到方法学依据。规范做法是数据 DOI 与论文同时给出,再按需补 1997 年那篇方法来源。
术语表
| 术语 | 英文 | 含义 |
|---|---|---|
| 步幅时长 | stride interval | 同侧足连续两次着地之间的时间 |
| 步态周期 | gait cycle | 一个完整循环,与步幅时长同义 |
| 摆动相 | swing phase | 足离地到再次着地的时段 |
| 支撑相 | stance phase | 足着地到离地的时段 |
| 双支撑 | double support | 两足同时触地的时段 |
| 着地时刻 | footfall / heel strike | 足接触地面的瞬间,本库的事件定义 |
| 压阻传感器 | force sensitive resistor | 受力改变电阻的薄膜元件 |
| 便携记录器 | ambulatory recorder | 佩戴式采集装置,本库置于踝部 |
| 模数转换 | analog-to-digital conversion | 模拟电压转数字量,本库 12 位 |
| 采样率 | sampling rate | 每秒采样次数,本库 300 Hz |
| 增益 | gain | 数字量与物理量的换算系数,本库 1000 |
| 头文件 | header file | 声明记录结构的文本,本库为 .hea |
| 派生量 | derived measure | 由原始信号算出、不能完全回溯的量 |
| 未滤波 | unfiltered | 未做平滑或带通处理,保留全部高频成分 |
| 变异系数 | coefficient of variation | 标准差除以均值,无量纲的离散度 |
| 长程相关 | long-range correlation | 相隔很远的观测之间仍有统计依赖 |
| 标度指数 | scaling exponent | 波动随窗口增长的幂律斜率 |
| 去趋势波动分析 | detrended fluctuation analysis | 分窗口去趋势后计算波动增长的方法 |
| H&Y 分级 | Hoehn and Yahr scale | 帕金森病分期,官方页面写作 Hohn |
| 总功能容量 | total functional capacity | 亨廷顿病功能量表,越低越重 |
| 确诊月数 | months since diagnosis | 渐冻症组的时间量,不表示轻重 |
| 占位值 | placeholder | 无对应测量时填入的固定值 |
| WFDB | Waveform Database | 生理信号存储与交换的通用格式族 |
| 格式 212 | format 212 | 每三字节存两个 12 位样本的打包方式 |
| ODC 署名许可 | ODC Attribution License | 要求署名、允许商用与再分发的开放许可 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 层级 |
|---|---|---|---|
| 受试者总数 | 64 | 页面、RECORDS、临床表 |
三处一致 |
| 帕金森病 | 15 例 | 页面、记录名前缀 | 一致 |
| 亨廷顿病 | 20 例 | 页面、记录名前缀 | 一致 |
| 肌萎缩侧索硬化 | 13 例 | 页面、记录名前缀 | 一致 |
| 健康对照 | 16 名 | 页面、记录名前缀 | 一致 |
| 每条记录文件数 | 4 | 文件目录 | 文件本身 |
| 采样率 | 300 Hz | 页面、头文件 | 一致 |
| 位深 | 12 位 | 头文件 | 文件本身 |
| 每通道点数 | 九万 | 头文件 | 文件本身 |
| 单条时长 | 300 秒 | 头文件换算、论文摘要 | 两处一致 |
| 派生列数 | 13 | 页面、样例文件 | 一致 |
| 临床表列数 | 8 | 文件首行 | 文件本身 |
park1 行数 |
245 | .ts 文件 |
文件本身 |
park1 首末时间 |
21.77 至 298.50 秒 | .ts 文件 |
文件本身 |
| 单路波形体积 | 135,000 字节 | 文件目录 | 文件本身 |
| 未压缩总体积 | 17.9 MB | 官方页面 | 官方页面 |
| 许可 | ODC 署名 1.0 | 官方页面 | 官方页面 |
| DOI | 10.13026/C27G6C | 官方页面 | 官方页面 |
| 上线日期 | 2000 年 12 月 21 日 | 官方页面 | 官方页面 |
| 版本 | 1.0.0 | 官方页面 | 官方页面 |
附录 B:数字的来源分层
| 层级 | 含义 | 本页涉及的项 |
|---|---|---|
| 官方页面 | PhysioNet 项目页直接给出 | 四组人数、文件名后缀约定、十三列语义、量表对应、体积、许可、DOI、日期 |
| 原始论文 | 2000 年论文摘要给出 | 五分钟方案、自选步速、踝部记录器、四组比较框架 |
| 文件本身 | 头文件、派生表、临床表可直接读出 | 采样参数、点数、行数、首末时间、缺失标记、组标签 |
附录 C:完整参考文献
- Hausdorff JM, Lertratanakul A, Cudkowicz ME, Peterson AL, Kaliton D, Goldberger AL. Dynamic markers of altered gait rhythm in amyotrophic lateral sclerosis. J Appl Physiol. 2000;88:2045–2053. doi:10.1152/jappl.2000.88.6.2045
- 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, 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, Cudkowicz ME, Firtion R, Wei JY, Goldberger AL. Gait variability and basal ganglia disorders. Mov Disord. 1998;13:428–437.
- Hausdorff J. Gait in Neurodegenerative Disease Database (version 1.0.0). PhysioNet. 2000. doi:10.13026/C27G6C
- 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 re
import pandas as pd
COLS = ["t", "stride_l", "stride_r", "swing_l", "swing_r", "swing_l_pct",
"swing_r_pct", "stance_l", "stance_r", "stance_l_pct",
"stance_r_pct", "double_sup", "double_sup_pct"]
def group_of(name):
#-- 前缀判组,避开临床表把 als 组写成 subjects
return re.match(r"^(park|hunt|als|control)", name).group(1)
rows = []
for path in sorted(glob.glob("data/gaitndd/*.ts")):
name = os.path.basename(path)[:-3]
df = pd.read_csv(path, sep=r"\s+", header=None, names=COLS)
rows.append({
"record": name,
"group": group_of(name),
"cycles": len(df),
"cv_l": df.stride_l.std() / df.stride_l.mean(),
"cv_r": df.stride_r.std() / df.stride_r.mean(),
"ds_pct": df.double_sup_pct.mean(),
})
out = pd.DataFrame(rows).set_index("record")
summary = out.groupby("group")[["cycles", "cv_l", "cv_r", "ds_pct"]].median()
print(summary.round(3))
print(out.loc[["park1"], ["group", "cycles", "cv_l", "ds_pct"]])
两个细节值得注意。第一,两侧的变异系数分开算,因为左右步幅在多数人身上并不相等,合并会掩盖不对称。第二,输出只到组内中位数,不做组间检验——六十四人的规模下,组间检验的置信区间宽到没有解释价值,报告效应量更诚实。
附录 E:如果只记五件事
第一,它是六十四个人,不是六十四万条样本。行是步态周期,人是统计单位。
第二,它有原始波形,也有派生表,两份覆盖的时间范围不同,起始的那一段只在波形里。
第三,三种病的严重度是三套尺子,只能在组内用,跨组排序没有意义。
第四,对照组的 0 是占位符,不是测量值,也不是"没病"的编码。
第五,它和 gaitdb 是姊妹库而非同一库:同一实验室、同一采集链,人、列、DOI 都不同。
编辑说明
核验时间 2026 年 10 月 28 日。核验方式为直接抓取 PhysioNet 项目页,读取 RECORDS、subject-description.txt 与 park1 的四个文件,并逐条比对六十四条记录的头文件声明;未做任何节律分析,未计算组间差异与分布统计。官方页面与文件在渐冻症组标签(前缀 als 与 GROUP 列的 subjects)、派生表覆盖时长(五分钟方案与逐条不同的起算点)、严重度列语义(一个列名对四种量纲)三处存在并列口径,文中均按原样呈现,未作裁定。数据版本为 1.0.0,自 2000 年起未更新;若平台迁移导致路径变化,下载面与文件清单需重新核对。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- gait-pd — 共享标签:生理信号 / 步态与运动 / 神经退行性疾病 / 帕金森病
- parkinsons-disease-smartwatch — 共享标签:生理信号 / 步态与运动 / 神经退行性疾病 / 帕金森病
- cops — 共享标签:生理信号 / 步态与运动 / 神经退行性疾病 / 帕金森病
- parkinsons-voice-uci — 共享标签:生理信号 / 神经退行性疾病 / 帕金森病
- gaitdb — 共享标签:生理信号 / 步态与运动 / 帕金森病
- gait-in-aging — 共享标签:生理信号 / 步态与运动 / 神经退行性疾病
- umwdb — 共享标签:生理信号 / 步态与运动
- music-motion-2012 — 共享标签:生理信号 / 步态与运动
- ppg-dalia — 共享标签:生理信号 / 步态与运动
- torgo — 共享标签:生理信号 / 步态与运动
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

