信息速览
PhysioNet 上的 plantar 是一个把两种测量叠在同一条腿上的小库。官方全名为 Modulation of Plantar Pressure and Muscle During Gait,收录于 2018 年 7 月 17 日,版本 1.0.0 至今未再更新,DOI 为 10.13026/C20Q1Q。它的做法不是搭一块压力平台让人走上去,而是把一张薄膜压力垫塞进鞋里,同时在小腿上贴两枚表面电极,让一个人在十米直道上走八趟——四趟在干预前,四趟在干预后。
规模小得出奇:20 名健康成年男性,两百三十二个纯文本数据文件,合计约二十兆字节。这与动辄数十 GB 的影像库不在一个量级,但它换来了别处少见的东西——同一个人的足底负荷与腓肠肌电活动,在同一个时间窗里被同时记下来,而且前面挂着一个可以对比的干预。
边界也在这里。全部是健康男性,没有患者、没有女性、没有老人;压力侧输出的是按足区汇总的区间指标而非压力分布图;肌电原始波形只覆盖部分受试者编号。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 官方全名 | Modulation of Plantar Pressure and Muscle During Gait |
| 平台编号 | plantar,版本 1.0.0 |
| 发布时间 | 2018 年 7 月 17 日 |
| DOI | 10.13026/C20Q1Q |
| 许可 | ODC Attribution 1.0(可商用,须署名) |
| 受试者 | 20 名健康成年男性 |
| 采集动作 | 平地十米步行,单人单次,无转向无变速 |
| 试次结构 | 干预前四趟 + 干预后四趟,每人八趟 |
| 干预 | 双侧胫骨前肌电刺激 30 分钟,50 Hz,脉宽 300 微秒 |
| 压力通道 | 鞋内 F-scan 薄膜垫,50 Hz |
| 压力输出 | 足区起止时刻、接触时长、峰值压力、压力时间积分 |
| 肌电通道 | 胫骨前肌与腓肠肌内侧,表面电极,1000 Hz 原始波形 |
| 同步方式 | 足跟负载开关在着地瞬间给出同步脉冲 |
| 文件规模 | 232 个文本文件,约 20 MB,平铺一层目录 |
| 配套元数据 | 一份汇总表,含人口学与步速、步幅、支撑摆动时间 |
| 一句话定位 | 二十个人的干预前后配对,压力是区间汇总,肌电是原始波形 |
§1 它要解决的具体麻烦
1.1 一个问题被拆给了两台仪器
足底压力和腓肠肌活动之间的关系,写在教科书上是一句话:支撑相踝关节的跖屈力矩过大,前掌就会承受过高的负荷;而跖屈力矩由腓肠肌与比目鱼肌提供。要把这句话变成可检验的量,必须同时知道两件事——那一步踩下去时足底各区承受了多少,以及同一时刻小腿后侧那块肌肉在以什么节奏放电。
麻烦在于这两件事由两台完全不同的仪器测量。压力垫是阵列式的,采样率受阵列扫描限制,通常是几十赫兹;表面肌电需要保住百赫兹以上的频带,采样率通常是千赫兹级。两者不同步、不同频、不同物理量纲,而且安放在身体的两个不同部位——一个在鞋里,一个在皮肤上。任何一项研究只要同时用这两样东西,第一道关就是时间对齐。
plantar 的处理办法很朴素:在足跟放一个负载开关。足跟着地的那一瞬间开关闭合,给两路记录同时打一个脉冲。此后压力垫按 50 Hz 走,肌电按 1000 Hz 走,两者各自计时,靠这个脉冲校准零点。这套办法的精度上限就是开关响应加一次采样的时间,对步态周期这种百毫秒量级的对象够用,对肌肉激活的毫秒级时序就只是勉强够用。
理解这一点,就理解了这份数据能回答什么、不能回答什么。它的价值不在样本量,而在于它是极少数把「鞋内分区的压力积分」与「两块肌肉的原始放电」放在同一批人、同一批步行里的公开数据。
1.2 三条常见的错误期待
第一条,以为它是一份足底压力图像库。不是。压力垫确实采的是整片阵列,但发布出来的文本里只有按足区汇总后的五个数:起受力时刻、止受力时刻、接触时长、峰值压力、压力时间积分。想看足底压力云图、想算压力中心轨迹、想做足弓形态与压强分布的关系,这份数据给不了原始阵列。
第二条,以为「20 名受试者」意味着 20 条独立样本。每个人有八趟步行,压力侧每人八份文件。若把一百六十份文件都当作独立样本投入训练,等于把同一个人的同一个步态重复了八次,评价指标会虚高得离谱。真正的独立单元是 20 个人,不是 160 次步行。
第三条,以为它是一份关于电刺激疗效的临床数据。电刺激在这里是造出「同一个人、两种状态」的手段,不是被研究的疗法。受试者是健康男性,刺激时长 30 分钟,观察窗口是刺激结束后立刻走的四趟。任何把它读成「电刺激治疗足底高压的临床证据」的用法,都越过了这份数据的设计边界。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 同一个人的足底压力与肌电时间对应 | 同一趟步行内两路严格同步,靠足跟开关校准 | 够,且这是它的核心卖点 |
| 干预前后的自身对照 | 每人四趟前、四趟后,配对整齐 | 够,前提是只做配对检验 |
| 足底压力分布图与压力中心轨迹 | 只有按足区汇总的标量指标 | 不够,需要阵列原始数据 |
| 肌肉激活的精确起止时刻 | 论文给了以 50 毫秒窗、峰值十分之一为阈值的判定法 | 勉强够,阈值未随数据下发,须自行复现 |
| 步态的时空参数 | 汇总表里有步速、步数、步幅、支撑与摆动时间 | 够,但只有每人一行,不分试次 |
| 病理人群的足底负荷特征 | 全部为健康男性 | 不够,没有疾病组 |
| 女性、老年人、儿童的参照 | 无 | 不够 |
| 变速、转向、上下坡、双任务 | 只有匀速平地十米 | 不够 |
| 足区划分的可复现性 | 官方四区与论文三区并存 | 需要自己定口径 |
| 大规模预训练素材 | 二十兆字节,二十人 | 不够,只适合做方法验证 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 手上有自采的鞋垫压力与肌电,两路对不齐 | 提供一个用足跟负载开关做同步的现成范例,可参照其文件组织与命名 | 先按它的三段命名(人、时相、序号)重组自己的数据,再谈对齐算法 |
| 想验证一个「压力积分与肌电幅值是否相关」的假设 | 二十人、四前四后的配对结构,足以跑出方向性结论 | 以人为单位聚合后再做相关,不要以文件为单位 |
| 做足底压力传感鞋的工程验证 | 有真实的足区峰值与积分量,可作为算法输出的对照 | 注意它的压力单位与标定方式,官方页面未逐项写明,需要回到论文 |
| 需要一个多采样率对齐的教学案例 | 50 Hz 与 1000 Hz 相差二十倍,同步信号只有一个开关,例子干净 | 直接取一个编号的 pre 与 post 各一趟,做成课堂练习 |
| 在做糖尿病足溃疡的风险建模 | 能提供健康人的基线负荷形态,作为对照侧 | 疾病侧必须另找数据,这份库没有患者 |
| 想找一份小到能在笔记本上跑完的步态数据 | 全部文件二十兆字节,解压后即可读 | 先读汇总表建立人级索引,再按编号取文件 |
| 需要肌电的原始波形做信号处理 | 部分编号有 1000 Hz 双通道原始记录 | 先确认目标编号是否在肌电覆盖范围内,再决定课题 |
1.5 一句话判断
这是一份「用二十个人把两套仪器焊在一起」的方法学数据,样本量小到不能训练模型,却刚好够回答一个具体的生理学问题:足底负荷下降时,腓肠肌的放电时序是不是变了。
1.6 不适合谁:四条边界
第一条边界是规模。二十个人,做任何需要统计功效的组间比较都会捉襟见肘;做深度学习更是完全不够。它适合验证方法与观察方向,不适合作为结论的唯一证据。
第二条边界是人群。全部健康成年男性,无神经系统与骨科疾病史。这个限制比样本量更致命:足底压力最有价值的应用场景恰恰在病理人群——糖尿病足的溃疡前兆、帕金森病的步态冻结、脑卒中的偏侧负荷。这份数据在这些方向上只能当对照。
第三条边界是测量量。鞋内压力垫测的是鞋垫与足底之间的界面压力,与测力台测的地面反作用力不是一回事。想算关节力矩、想做逆动力学,需要的是力台数据,不是这份。它的压力值还依赖鞋、依赖垫片位置、依赖标定方式,跨研究比较时必须谨慎。
第四条边界是任务。只有平地匀速直行,只有十米,只有八趟。没有转身、没有起停、没有楼梯、没有双任务。任何声称在「复杂步态」上有效的结论,都不能从这份数据里推出来。
§2 数据构成与规格
2.1 平铺一层的目录与三段式文件名
这份数据的目录结构简单到不需要画树。全部文件放在同一层,没有按人分文件夹,没有按模态分目录。文件名的构造是三段拼接:一个字母表示模态,一个三位数表示受试者编号,一个「时相加序号」表示第几趟。
模态只有两种。P_ 开头的是足底压力,每个文件一到两 KB,因为里面只有几十行乘五列。E_ 开头的是肌电,每个文件两百到四百 KB,因为里面是逐采样点的原始电压,一趟十米步行按 1000 Hz 采样,行数在万级。
时相只有两种。pre 是电刺激之前,post 是电刺激之后。序号一到四,表示该时相下的第几趟。所以一个人的完整记录是八个文件:pre1、pre2、pre3、pre4、post1、post2、post3、post4。这个命名法没有任何冗余,也没有任何容错——一旦有人把序号写错,文件就会静默地落进错误的分组,而目录里不会报错。
| 文件名示例 | 模态 | 受试者 | 时相 | 序号 | 大小量级 |
|---|---|---|---|---|---|
P_001_pre1.txt |
足底压力 | 001 | 刺激前 | 第 1 趟 | 约 1 KB |
P_001_post4.txt |
足底压力 | 001 | 刺激后 | 第 4 趟 | 约 1 KB |
P_020_post4.txt |
足底压力 | 020 | 刺激后 | 第 4 趟 | 约 1 KB |
E_001_pre1.txt |
表面肌电 | 001 | 刺激前 | 第 1 趟 | 约 240 KB |
E_017_post2.txt |
表面肌电 | 017 | 刺激后 | 第 2 趟 | 约 300 KB |
Summary-sheet.txt |
元数据 | 全体 | 不适用 | 不适用 | 约 4 KB |
Summary-sheet.xlsx |
元数据 | 全体 | 不适用 | 不适用 | 约 14 KB |
SHA256SUMS.txt |
校验 | 全体 | 不适用 | 不适用 | 约 19 KB |
两族文件的覆盖范围不对称,这是接入前必须知道的第一件事。压力族覆盖 001 至 020 全部二十个编号,每人八个文件,合计一百六十个。肌电族在本次访问的目录索引里只出现九个编号——001、005、006、014、015、016、017、019、020——每人八个,合计七十二个。官方描述没有说明为什么只保留这九人的原始肌电,也没有说明未出现的编号是未采集、未发布还是被剔除。
这个不对称直接决定了课题的可行性。如果你要做的是「压力与肌电的对应」,可用人数是九个人,不是二十个;如果你只做压力侧的分析,二十个人都在。立项之前先数一遍目录,比读完方法学再发现只有九个人要省事得多。
| 统计项 | 数值 | 口径 |
|---|---|---|
| 压力文件总数 | 160 | 20 个编号 × 8 趟 |
| 肌电文件总数 | 72 | 9 个编号 × 8 趟 |
| 数据文件合计 | 232 | 不含汇总表与校验文件 |
| 单次步行时长 | 约 10 秒量级 | 十米距离除以舒适步速推算 |
| 单份压力文件行数 | 数十行 | 步数 × 足区数 |
| 单份肌电文件行数 | 万级 | 时长 × 1000 Hz |
| 全库体积 | 约 20 MB | 按目录中各文件大小合计 |
| 肌电覆盖人数 | 9 | 目录索引所见 |
| 压力覆盖人数 | 20 | 001 至 020 连续 |
2.2 字段的完整字典
压力文件与肌电文件是两种粒度完全不同的表,必须分开看。压力文件的每一行是一个足区在一次支撑相内的受力区间,肌电文件的每一行是一个采样点。两者之间没有逐行外键,只有「人、时相、序号」三个字段可以把它们拼在一起。
压力文件的五列,官方描述给出的含义是:该足区内任一传感器开始受力的时刻、所有受力传感器停止受力的时刻、两者之差即接触时长、峰值压力、压力时间积分。第三列是前两列的派生,第五列是压力对时间的积分,都是一次触地内的单值摘要。
| 列序 | 列名(据官方描述) | 物理含义 | 单位 | 类型 | 用途 |
|---|---|---|---|---|---|
| 1 | Start | 该足区内首个感测格开始受力的时刻 | 秒 | 浮点 | 与肌电对齐的锚点 |
| 2 | End | 该足区内最后一个感测格卸力的时刻 | 秒 | 浮点 | 支撑相结束判断 |
| 3 | Contact duration | 第 2 列减第 1 列 | 秒 | 浮点 | 分区接触时长 |
| 4 | Peak pressure | 该次触地内该足区的最大压力 | 官方未在页面标注 | 浮点 | 负荷峰值 |
| 5 | Pressure-time integral | 压力对时间的积分 | 官方未在页面标注 | 浮点 | 累积负荷,比峰值更稳 |
肌电文件的三列更简单:时间轴、胫骨前肌原始幅值、腓肠肌内侧原始幅值。时间轴以秒计,步长对应 1000 Hz 采样;两路幅值是未滤波、未整流的原始电压,单位在官方页面上没有标注,需要回到论文的方法部分确认放大倍数。
| 列序 | 列名(据官方描述) | 物理含义 | 单位 | 类型 | 用途 |
|---|---|---|---|---|---|
| 1 | Time | 采样时刻 | 秒 | 浮点 | 与压力文件做时间对齐 |
| 2 | Tibialis anterior | 胫骨前肌原始表面肌电 | 未标注 | 浮点 | 主动肌放电,干预靶点 |
| 3 | Gastrocnemius medialis | 腓肠肌内侧原始表面肌电 | 未标注 | 浮点 | 拮抗肌放电,观察对象 |
汇总表是第三张表,一人一行,把人口学与步态参数集中存放。官方描述提到它包含年龄、身高、体重,以及步速、步数、步幅、支撑相与摆动相时间。它的作用是给每个编号补上人体尺度,否则峰值压力的绝对值无从解释——同样的压力读数,在体重六十公斤与九十公斤的人身上含义不同。
| 字段类 | 字段 | 粒度 | 缺失情况 |
|---|---|---|---|
| 标识 | 受试者编号 | 人 | 无 |
| 人口学 | 年龄 | 人 | 集中在汇总表 |
| 人口学 | 身高 | 人 | 集中在汇总表 |
| 人口学 | 体重 | 人 | 集中在汇总表 |
| 时空 | 步速 | 人 | 集中在汇总表 |
| 时空 | 步数 | 人 | 集中在汇总表 |
| 时空 | 步幅 | 人 | 集中在汇总表 |
| 时序 | 支撑相时间 | 人 | 集中在汇总表 |
| 时序 | 摆动相时间 | 人 | 集中在汇总表 |
| 干预 | 刺激参数 | 全库统一 | 页面文字给出,无独立字段 |
2.3 一条记录的完整解剖
取一个压力文件摊开看。下面是一次十米步行的压力记录在文本里的样子,行数以「其余略」省略,只保留结构与首尾。
#-- P_007_pre1.txt 的结构示意(非原始数值)
#-- 每行:起始秒 结束秒 接触时长 峰值压力 压力时间积分
0.412 0.598 0.186 312.4 28.71
0.598 0.744 0.146 268.9 19.02
0.744 0.902 0.158 141.6 9.35
0.902 1.048 0.146 ......
#-- 其后的行按步态周期重复,直至该次步行结束
同一趟步行的肌电文件长得多,因为它是逐采样点记录的。一行一个时刻,一千行对应一秒。
#-- E_007_pre1.txt 的结构示意(非原始数值)
#-- 每行:时刻 胫骨前肌 腓肠肌内侧
0.000 12.4 -8.1
0.001 13.0 -7.6
0.002 12.8 -8.4
0.003 12.1 -9.0
#-- 其余略:以 0.001 秒为步长续至该次步行结束
把两份文件并排放在同一条时间轴上,就能看出同步设计的意义。压力文件第一行的起始时刻,应当与肌电文件里足跟着地引起的第一个爆发大致重合;如果两者差了几十毫秒,要么是开关延迟,要么是两台设备的时钟没有真正校准。官方没有提供逐趟的同步偏差记录,这一步只能由使用者自己核对。
一个完整的分析单元因此是四层:受试者编号定位人,时相定位状态,序号定位第几趟,列定位量。缺任何一层,数据都拼不起来。
| 层级 | 键 | 取值 | 作用 |
|---|---|---|---|
| 人 | 三位编号 | 001 至 020 | 决定是否在肌电覆盖范围内 |
| 状态 | 时相 | pre / post | 决定能否做配对 |
| 趟 | 序号 | 1 至 4 | 决定同状态内的重复数 |
| 量 | 列 | 压力五列 / 肌电三列 | 决定分析对象 |
2.4 足区与指标的两套口径
足区划分是这份数据里最容易被忽略、又最容易出错的地方。官方项目页的描述是:依据 Sartor 等提出的方法分区,分为后足、中足、前足,加上全足底共四个区域。对应的方法论文摘要报告的则是三个区:前足、后足、全足底。
两个口径的差额落在中足。这不像笔误,更像是两种实践——有的分析把中足并入相邻区,有的单列。官方没有说明四区与三区之间的关系,也没有在文件里标注每行属于哪个区。若文件内部有区名标识,使用者可以自己判断;若只有固定顺序,顺序本身就成了隐含约定,必须靠行数与步数相除来反推。
| 口径 | 分区数 | 区名 | 出处 | 影响 |
|---|---|---|---|---|
| 官方项目页 | 4 | 后足、中足、前足、全足底 | PhysioNet 数据说明 | 中足单列,可单独分析 |
| 方法论文摘要 | 3 | 前足、后足、全足底 | PLOS ONE 摘要 | 中足并入,指标略高 |
| 建议做法 | 自行声明 | 与所用文件行数对齐 | 使用者 | 在方法里写明选了哪套 |
指标侧也有两套。峰值压力回答「这一步最重的地方有多重」,压力时间积分回答「这一步累积承受了多少」。两者在临床上常常不同步——峰值高但时间短,与峰值中等但时间长,积分可能相近,而组织的损伤风险未必相同。论文报告的正是这两个指标在干预后同时下降。
| 指标 | 定义 | 优点 | 局限 |
|---|---|---|---|
| 峰值压力 | 一次触地内的最大压力值 | 直观,易与阈值比较 | 对采样率敏感,50 Hz 可能漏掉真峰 |
| 压力时间积分 | 压力对时间的积分 | 反映累积负荷,抗单点噪声 | 依赖接触时长的判定边界 |
| 接触时长 | 起止时刻之差 | 反映支撑相结构 | 受阈值设定影响 |
| 起受力时刻 | 该区首个感测格受力 | 可用于分段 | 受垫片滑动干扰 |
2.5 与同类资源的字段差异
把这份数据和库里几份同样涉及步态与足部负荷的资源并排,差异立刻显现。差异不在规模,而在「量纲层」——它们各自停在了不同的物理层次上。
gaitdb 与 gaitndd 用的是鞋内压阻式足底开关,输出是力信号的时间戳,最终只发布步幅间隔;它们连分区都没有,关心的是节律。gaitpdb 用的是埋在地面的力板,输出垂直地反力波形,是地面反作用力而不是界面压力。taichidb 用足底开关加下肢肌电,肌电采样 1500 Hz,但压力侧只有开关量。multi-gait-posture 走的是惯性加深度相机,根本不测压力。kinecal 是 Kinect 骨架加平衡量表。
plantar 的位置因此很清楚:它是这批资源里唯一同时给出「分区压力积分」和「双通道原始肌电」的一份,而代价是人数最少、动作最单一。
| 资源 | 压力测量方式 | 压力输出 | 肌电 | 人数 | 动作 |
|---|---|---|---|---|---|
plantar |
鞋内薄膜压力垫 | 分区峰值与积分 | 双通道,1000 Hz | 20 | 平地十米 × 8 |
gaitdb |
鞋内压阻开关 | 事件时间戳 | 无 | 15 | 自由行走 |
gaitndd |
鞋内压阻开关 | 事件时间戳 | 无 | 64 | 五分钟连续行走 |
gaitpdb |
地面力板 | 垂直地反力波形 | 无 | 166 | 两分钟平地 |
taichidb |
足底开关 | 开关量 | 下肢多通道,1500 Hz | 87 | 十分钟 + 双任务 |
multi-gait-posture |
无 | 无 | 无 | 14 | 助行器三速三路径 |
kinecal |
无 | 无 | 无 | 90 | 十一个平衡动作 |
§3 它踩在哪一层:鞋内压力,不是地反力
3.1 三个容易混淆的物理量
足部生物力学里有三个常被混用的量。第一个是地面反作用力,由测力台测得,单位是牛顿,反映整个人体与地面之间的总作用力,可进一步分解为垂直、前后、左右三分量。第二个是鞋内界面压力,由鞋垫式传感器测得,反映足底皮肤与鞋垫之间的局部压强,单位通常是千帕或牛每平方厘米。第三个是足底接触面积与压力中心,属于分布层面的派生量。
plantar 停在第两层之间:它测的是界面压力,但发布的是分区汇总,没有保留分布。这意味着它比地反力更接近「足底某处承压多少」这个临床问题,却又不足以回答「压力集中在哪个点」。
这个定位带来两个后果。好处是它与鞋、鞋垫、矫形器的研究直接对口——评估一双鞋垫是否真的把前掌负荷降下来,需要的就是界面压力。坏处是它不能替代测力台,任何需要关节力矩、需要逆动力学的分析,都必须回到力板数据。
| 物理量 | 测量设备 | 单位 | 能回答 | 这份数据是否有 |
|---|---|---|---|---|
| 地面反作用力 | 测力台 | 牛顿 | 整体受力、关节力矩 | 无 |
| 鞋内界面压力 | 鞋垫式传感器 | 压强 | 局部承压、鞋垫效果 | 有,但为分区汇总 |
| 压力中心轨迹 | 压力阵列 | 长度 | 稳定性、重心偏移 | 无 |
| 肌肉电活动 | 表面电极 | 电压 | 激活时序与强度 | 有,原始波形 |
3.2 五十赫兹够不够
50 Hz 的采样率,对应 20 毫秒的采样间隔。足跟着地时的压力上升沿通常在几十毫秒量级,20 毫秒的间隔只能采到上升沿上的两三个点。这对峰值压力是实打实的风险——真峰可能落在两个采样点之间,被系统性低估。
对压力时间积分,风险小一些。积分是面积,个别采样点的位置偏差会被平均掉,只要接触起止判定稳定,积分值就相对可靠。这也解释了为什么论文同时报告两个指标,而不是只报峰值。
对接触时长,50 Hz 的量化误差是正负 20 毫秒。一个典型的支撑相在数百毫秒量级,相对误差在百分之几,可以接受;但如果要拿它算步态变异性,这个量化噪声就会盖住真实差异。
| 指标 | 50 Hz 下的误差来源 | 影响程度 | 缓解办法 |
|---|---|---|---|
| 峰值压力 | 真峰落在采样点之间 | 中到高,系统性低估 | 报告时说明采样率,避免与高频数据直接比较 |
| 压力时间积分 | 起止点量化误差 | 低到中 | 固定统一的起止阈值 |
| 接触时长 | ±20 毫秒量化 | 低 | 用于分组统计,不用于单步精算 |
| 起受力时刻 | ±20 毫秒量化 | 中 | 与肌电对齐时留出容差 |
3.3 标定这一环为什么关键
鞋垫式压力传感器的读数强烈依赖标定。同一张垫子,在不同体重的人脚下、在不同硬度的鞋里、在不同松紧的袜子下,同一个真实压力会给出不同的读数。官方描述提到标定方式是按受试者体重、单腿站立于传感器上完成,并用弹性胶带与袜子固定垫片以减少滑动。
这套做法在当时的条件下是标准操作,但它留下了两个不可消除的变量。第一,单腿站立标定是静态的,而步行是动态的,动态下的滞后与蠕变不会被静态标定捕捉。第二,垫片滑动无法完全消除,一旦在某趟步行中移位,该趟的分区数据就会整体偏移,而文件里没有任何标记提示这一点。
使用者能做的,是把同一个人的八趟当作一个整体来看:如果 pre1 到 pre4 的分区峰值呈现出与 post 组明显不同的离散度,那更可能是垫片问题,而不是生理差异。
| 标定环节 | 官方做法 | 残留不确定性 | 使用时的对策 |
|---|---|---|---|
| 零点 | 按体重与单腿站立标定 | 静态标定不覆盖动态滞后 | 同人内比较,避免跨人绝对值比较 |
| 固定 | 弹性胶带加袜子 | 长距离行走可能滑动 | 检查同组四趟的一致性 |
| 分区 | 按解剖标志划分 | 标志定位有主观性 | 统一由一人完成分区核对 |
| 单位 | 页面未逐项标注 | 跨研究换算易错 | 回到论文方法部分确认 |
§4 两套时钟怎么对上:同步、标定与那条 50 毫秒窗
4.1 一个开关承担的同步责任
整套同步设计只有一个物理锚点:足跟处的负载开关。它在足跟着地、负载超过阈值的瞬间闭合,同时给压力记录与肌电记录一个脉冲。此后两套设备各自按自己的时钟走。
这个设计的好处是简单、鲁棒、不需要额外授时设备。坏处是它把全部同步精度押在一个机械开关上。开关有响应时间,有回弹,有阈值设定的随意性;不同的着地方式——足跟着地、全掌着地、前掌着地——会让同一个开关在不同的时刻闭合。对于以足跟着地为主的舒适步速行走,这个偏差通常可以接受;一旦步态模式改变,偏差就会变成系统误差。
| 同步环节 | 机制 | 精度量级 | 失效条件 |
|---|---|---|---|
| 着地检测 | 足跟负载开关闭合 | 毫秒到十几毫秒 | 前掌着地、拖步 |
| 压力时钟 | 设备内部计时,50 Hz | 20 毫秒量化 | 长时间漂移 |
| 肌电时钟 | 设备内部计时,1000 Hz | 1 毫秒量化 | 长时间漂移 |
| 跨设备校准 | 依赖单次开关脉冲 | 取决于开关一致性 | 无二次校准点 |
4.2 五十毫秒窗与十分之一阈值
论文给出的肌电处理流程是两个数字:以 50 毫秒的窗口计算均方根,以该步态周期内最大幅值的十分之一作为活动判定的阈值。这两个数字决定了「肌肉什么时候开始活动」这个结论的全部精度。
50 毫秒窗意味着时间分辨率被压到 50 毫秒。用 1000 Hz 采来的数据,被降到了 20 Hz 的有效分辨率。对于判定「胫骨前肌在着地前多久开始放电」这种问题,50 毫秒的粒度可能刚好卡在结论的边缘——如果真实差异是 30 毫秒,这套流程看不见。
十分之一阈值是一个经验值,不是生理常数。阈值取高,活动区间会缩短;取低,会把基线噪声算进活动。论文选择这个值有其合理性,但官方没有随数据下发处理脚本,使用者若要复现,必须自己实现这两个步骤,而实现细节(窗函数形状、是否重叠、阈值是相对全周期还是相对单次收缩)都会影响结果。
| 处理步骤 | 参数 | 官方是否给出 | 复现风险 |
|---|---|---|---|
| 均方根 | 50 毫秒窗 | 是 | 窗是否重叠未说明 |
| 活动阈值 | 周期峰值的 10% | 是 | 峰值取自哪一段未说明 |
| 归一化 | 最大等长收缩的百分比 | 是 | 最大等长收缩本身未随数据发布 |
| 滤波 | 未在页面说明 | 否 | 带通范围需自行设定 |
| 整流 | 未在页面说明 | 否 | 影响均方根数值 |
4.3 案例:P_007 的八次步行
用一个具体编号把上面的抽象说清楚。取 007 号:压力侧有完整的八个文件,从 pre1 到 post4 一个不缺;但肌电侧的目录索引里没有 007 这个编号。也就是说,这个人只有「踩了多大力」,没有「肌肉怎么放电」。
这件事本身就是一次很好的教学。如果课题是「分析 007 号的压力与肌电对应关系」,开工第一天就会卡住,而且是卡在数据可得性上,不是卡在方法上。反过来,如果课题只做压力侧,007 号完全可用,八趟齐全,配对完整。
再看这八趟的内部结构。四趟 pre 与四趟 post 之间,唯一被系统性改变的是那条胫骨前肌在采集前接受了 30 分钟电刺激。其余条件——同一双鞋、同一张垫、同一条十米直道、同一个舒适步速——都应当保持不变。所以 pre 组内部的离散度,可以作为「测量噪声加自然变异」的估计;pre 与 post 之间的系统性偏移,才是干预效应。
这个设计有一个隐含前提:30 分钟的刺激不会引起疲劳,也不会引起学习效应。八趟步行本身就会带来适应,四趟 pre 走完之后,post 的第一趟可能已经比 pre 的第一趟更熟练。官方没有设置「无刺激的对照日」,因此适应效应与刺激效应在这份数据里是混在一起的。这一点在 §4.3 的案例里没有任何补救办法,只能在使用时于结论中限定。
关于 007 号还有一处需要说明:肌电族缺失该编号,官方未说明原因。可能是该人未采集肌电,可能是采集后未发布,也可能是编号在两族之间并未严格对应同一人。三种可能性对分析的影响不同,在没有官方说明的情况下,最稳妥的处理是把两族当作「部分重叠的两个子集」,而不是「同一批人的两种测量」。
| 007 号的检查项 | 结果 | 含义 |
|---|---|---|
| 压力文件完整性 | 8 份齐全 | 可做配对分析 |
| 肌电文件完整性 | 0 份 | 不可做肌电分析 |
| 时相配对 | pre 四趟、post 四趟 | 配对结构完整 |
| 人口学 | 汇总表内可查 | 可做体重归一化 |
| 是否在肌电覆盖内 | 否 | 需换编号或改课题 |
4.4 为什么这个案例值得反复看
因为它是这份数据全部结构性问题的缩影。一个编号就能同时暴露覆盖不对称、配对结构、干预混杂、标定不可追溯四个问题。任何打算使用这份数据的人,先花十分钟核对一个编号的完整性,比读完所有文档更快地知道自己能做什么。
§4.3 的案例在后面几节还会被引用:讨论覆盖范围时会回到它,讨论混杂时会回到它,讨论最短流程时会用它当示例输入。这不是修辞上的重复,而是同一组事实在不同问题下的不同侧面。
§5 从目录到表:把两百多个文本文件接进流水线
5.1 第一步是把目录读成索引
不要一上来就写解析器。先列出目录,把文件名解析成结构化索引,确认覆盖范围,再决定解析哪些文件。这一步能省掉后面所有的返工。
#-- 列出全部数据文件,按文件名排序,观察覆盖范围
curl -s https://physionet.org/files/plantar/1.0.0/ \
| grep -oE '(P|E)_[0-9]{3}_(pre|post)[1-4]\.txt' \
| sort -u > plantar_files.txt
#-- 分别统计两族的覆盖编号
grep '^P_' plantar_files.txt | cut -d_ -f2 | sort -u | wc -l
grep '^E_' plantar_files.txt | cut -d_ -f2 | sort -u | wc -l
上面第二、三行会分别给出压力侧与肌电侧的编号数量。两个数字不一样,这就是覆盖不对称的直接证据,也是立项前必须看到的第一个数字。§4.3 的案例就是被这条不对称挡住的典型:那个人压力侧八趟齐全,肌电侧一份都没有。
5.2 单文件下载与校验
官方提供逐文件下载,也提供校验和清单。小库不必整包拉取,按需取几个编号即可。
#-- 建目录,取一个编号的八份压力文件与一份汇总表
mkdir -p data/plantar/pressure
for phase in pre post; do
for i in 1 2 3 4; do
curl -sSL -o "data/plantar/pressure/P_007_${phase}${i}.txt" \
"https://physionet.org/files/plantar/1.0.0/P_007_${phase}${i}.txt"
done
done
curl -sSL -o data/plantar/Summary-sheet.txt \
https://physionet.org/files/plantar/1.0.0/Summary-sheet.txt
#-- 下载官方校验清单,核对已取文件的完整性
curl -sSL -o data/plantar/SHA256SUMS.txt \
https://physionet.org/files/plantar/1.0.0/SHA256SUMS.txt
5.3 把五列读成一张表
压力文件的列数固定,读起来没有歧义。关键是把文件名里的三个字段带进表里,否则后面的分组无法进行。
#-- 读入一个编号的全部压力文件,拼成一张长表
import re
from pathlib import Path
import pandas as pd
COLS = ["start_s", "end_s", "contact_s", "peak_pressure", "pti"]
rows = []
for path in sorted(Path("data/plantar/pressure").glob("P_*.txt")):
m = re.match(r"P_(\d{3})_(pre|post)(\d)\.txt", path.name)
subject, phase, trial = m.group(1), m.group(2), int(m.group(3))
df = pd.read_csv(path, sep=r"\s+", header=None, names=COLS)
df["subject"] = subject
df["phase"] = phase
df["trial"] = trial
#-- 文件名里没有足区名,按行序推断:每步依次给出各区
df["row_in_file"] = range(len(df))
rows.append(df)
press = pd.concat(rows, ignore_index=True)
print(press.groupby(["subject", "phase"]).size())
最后一行输出的是一张「人 × 时相」的行数表。如果某个人某一相的行数明显偏离其他组,那多半是某趟的步数异常,或者是文件本身有问题,值得先看一眼。
5.4 把肌电读成时间序列
肌电文件大,读的时候要注意两件事:一是列数固定为三,二是时间轴是相对时刻,每趟都从零开始。跨趟拼接之前必须先加上趟的偏移量。
#-- 读入一份肌电文件,计算 50 毫秒窗的均方根
import numpy as np
import pandas as pd
def load_emg(path):
df = pd.read_csv(path, sep=r"\s+", header=None,
names=["time_s", "ta", "gm"])
df = df.sort_values("time_s").reset_index(drop=True)
return df
def rms_window(x, fs=1000, win_ms=50):
w = int(fs * win_ms / 1000)
kernel = np.ones(w) / w
return np.sqrt(np.convolve(x ** 2, kernel, mode="same"))
emg = load_emg("data/plantar/emg/E_001_pre1.txt")
emg["ta_rms"] = rms_window(emg["ta"].to_numpy())
emg["gm_rms"] = rms_window(emg["gm"].to_numpy())
print(emg[["time_s", "ta_rms", "gm_rms"]].head())
5.5 两条不同频率的曲线怎么放一起
压力是区间,肌电是采样点。把压力区间的起点当作事件,在肌电时间轴上打标记,是最省事的对齐方式。不要试图做插值对齐——两者的物理含义不同,插值只会制造虚假的平滑。
#-- 用压力区间起点给肌电打事件标记,统计每个事件前后 200 毫秒的肌电均值
import numpy as np
import pandas as pd
def mark_events(emg_df, onsets, pre=0.2, post=0.2):
out = []
for t in onsets:
seg = emg_df[(emg_df.time_s >= t - pre) & (emg_df.time_s <= t + post)]
if len(seg) == 0:
continue
out.append({
"onset_s": round(float(t), 3),
"ta_mean": float(seg["ta"].mean()),
"gm_mean": float(seg["gm"].mean()),
"n_samples": int(len(seg)),
})
return pd.DataFrame(out)
press007 = pd.read_csv("data/plantar/pressure/P_001_pre1.txt",
sep=r"\s+", header=None,
names=["start_s", "end_s", "contact_s",
"peak_pressure", "pti"])
onsets = press007["start_s"].dropna().to_numpy()[::4]
print(mark_events(emg, onsets))
第四行的 [::4] 是取样步长,取决于每个步态周期在文件里占几行。先用行数除以步数确认,再改这个值。
5.6 入库之后的一次查询
把小库接进本地数据库之后,最常见的查询是「按人和时相聚合,看干预前后的均值差」。下面这段 SQL 假设已有一张长表 plantar_pressure。
-- 按人聚合 pre 与 post 的分区峰值均值,只保留两侧都齐全的人
WITH agg AS (
SELECT subject,
phase,
AVG(peak_pressure) AS mean_peak,
AVG(pti) AS mean_pti,
COUNT(*) AS n_rows
FROM plantar_pressure
GROUP BY subject, phase
)
SELECT pre.subject,
pre.mean_peak AS peak_pre,
post.mean_peak AS peak_post,
post.mean_peak - pre.mean_peak AS delta_peak,
pre.n_rows AS rows_pre,
post.n_rows AS rows_post
FROM agg AS pre
JOIN agg AS post
ON pre.subject = post.subject
WHERE pre.phase = 'pre'
AND post.phase = 'post'
ORDER BY delta_peak
§6 与库内词条的关系
6.1 关系图谱
库内的步态相关资源可以按「测什么」排成一条线,从最靠近地面的一端排到最远离地面的一端。plantar 站在中间偏下的位置:它测的是鞋内的压力界面,同时向上延伸到肌肉电活动。
| 关联词条 | 测量层次 | 与本文对象的关系 | 互补点 |
|---|---|---|---|
gaitpdb |
地面反作用力 | 同一物理链条的下游 | 力板给总力,本文给分区界面压力 |
gaitdb |
足底开关事件 | 同一位置的极简版本 | 开关只给时刻,本文给峰值与积分 |
gaitndd |
足底开关事件 | 同上的病理人群版 | 那面有帕金森、亨廷顿、渐冻症 |
taichidb |
足底开关 + 下肢肌电 | 结构最接近 | 那面人多、动作多,但压力只有开关量 |
multi-gait-posture |
惯性 + 深度相机 | 运动学侧 | 那面给关节角度,不给力 |
kinecal |
骨骼 + 平衡量表 | 平衡侧 | 那面有临床量表与跌倒史 |
gait-in-aging |
步态节律 | 人群侧 | 那面以年龄跨度换样本 |
multimodal-gait-dataset |
多模态 | 广度侧 | 那面模态多,压力分辨率未必更高 |
一句话概括分工:要地面反力找 gaitpdb,要病理人群的节律找 gaitndd,要运动学找 multi-gait-posture,要「足底分区负荷加肌肉放电」这对组合,只有 plantar。
6.2 检索路径
按问题找比按名字找快。下面这张表把常见问题映射到应当先看的资源。
| 你的问题 | 先看 | 再看 |
|---|---|---|
| 足底某区承压多少 | plantar |
gaitpdb(若需总力) |
| 步幅间隔的节律特征 | gaitdb |
gaitndd |
| 帕金森患者的步态变异 | gaitpdb |
gaitndd |
| 肌电与压力的时间对应 | plantar |
taichidb |
| 关节角度与骨骼轨迹 | multi-gait-posture |
kinecal |
| 平衡能力与跌倒风险 | kinecal |
gait-in-aging |
| 老年人步速的横断面 | gait-in-aging |
gaitdb |
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
评分之前必须先校正一个容易发生的误判:不要用「通用步态数据库」的尺子量它。若以样本量、人群多样性、动作复杂度为标准,这份数据在每一项上都会得到低分,但那个低分没有信息量——它本来就不是为这些目标设计的。
正确的尺子是「以它自己声称的用途衡量」:在一个受控的小样本里,能否稳定地观察到足底分区负荷与腓肠肌活动之间的对应,以及这种对应在干预后是否改变。用这把尺子,它的设计是自洽的:人少但配对整齐,动作单一但条件受控,指标少但都是积分型、抗噪声的量。
第二个误判是把「覆盖不对称」读成「数据损坏」。肌电只覆盖九个编号,这是一个结构事实,不是一个缺陷标记。它影响的是可用课题的范围,不影响已有部分的质量。
第三个误判是把「官方四区」与「论文三区」的差异读成错误。两者是不同层次的口径,官方页面描述的是分区方法,论文报告的是分析时采用的分组。使用者的责任是选一套并写明,而不是替官方裁决。
7.1 DAIMS 五维评分
DAIMS 是数据价值评估的五个维度:可得性、准确性、完整性、可解释性与可持续性。下表按这五项给分,每项后写清依据;评分只对本文所述的四类用途有效——压力与肌电的对应、干预前后配对、鞋垫与辅具的界面压力评估、多采样率对齐的方法验证。
| 维度 | 分数 | 依据 | 扣分点 |
|---|---|---|---|
| 可得性 D | 5 / 5 | 开放获取,无需申请,逐文件可下,二十兆字节 | 无 |
| 准确性 A | 3 / 5 | 有标定流程、有同步设计,但 50 Hz 对峰值偏低 | 动态标定缺失,垫片滑动无标记 |
| 完整性 I | 2 / 5 | 只有 20 人、只有健康男性、只有平地匀速 | 无患者、无女性、无老年、无复杂动作 |
| 可解释性 M | 4 / 5 | 字段含义清楚,配套论文说明处理流程 | 单位未逐项标注,足区未在文件内显式标注 |
| 可持续性 S | 3 / 5 | 有 DOI、有校验清单、平台长期维护 | 2018 年后未更新,无版本演进 |
五项合计 17 分(满分 25)。按本库惯例,17 分对应「方法学可用、规模化不可用」一档。
7.2 分数背后的取舍
可得性拿满分是有理由的。两百多个文本文件,纯 ASCII,没有专有格式,没有压缩包嵌套,没有需要登录的申请流程。这在足底压力领域并不常见——同类商业设备的数据往往锁在厂商软件里,导出需要额外授权。这份数据把「能拿到」这件事做到了极致。
准确性扣分主要扣在采样率与标定。50 Hz 对峰值压力的低估是结构性的,不是偶然误差;动态标定的缺失意味着绝对值不能跨人比较。但它的准确性在「同人内、同时相内比较」这个范围内是够的——而这恰好是它声称的用途。
完整性只有 2 分,这一项没有争辩空间。二十人、全男性、全健康、单一动作。任何需要人群多样性的应用,在这里都会撞墙。
7.3 已知的、可枚举的偏差
第一类偏差是选择偏差。受试者是健康成年男性,招募渠道与纳入标准在官方页面上没有展开。这意味着它既不能代表普通人群,也不能代表临床人群,只能代表「能顺利走完十米且无步态异常的青年男性」。
第二类偏差是干预混杂。刺激前后的对比里,混着步行本身的适应效应。八趟步行中,后四趟一定比前四趟更熟练,这个学习效应与刺激效应在数据里无法分离。官方未设置对照日,也没有做交叉设计。
第三类偏差是测量偏差。压力垫的滑动、鞋的磨损、袜子厚度、标定时的站立姿势,都会引入系统性偏移。这些偏移在文件里没有任何标记,只能通过组内离散度间接察觉。
第四类偏差是覆盖偏差。肌电只覆盖九个编号,若这九人不是随机抽取的(例如按信号质量筛选),那么基于肌电子集得出的结论就不能外推到二十人。
| 偏差类型 | 来源 | 可观测性 | 缓解方式 |
|---|---|---|---|
| 选择偏差 | 健康男性、招募未说明 | 高,官方明示 | 限定结论适用范围 |
| 干预混杂 | 无对照日、无交叉 | 中,需推理 | 在结论中声明适应效应未分离 |
| 测量偏差 | 垫片滑动、标定方式 | 低,无标记 | 看同组四趟一致性 |
| 覆盖偏差 | 肌电仅九人 | 高,数目录即知 | 明确区分压力子集与肌电子集 |
| 采样偏差 | 50 Hz 对峰值 | 中,需知道原理 | 优先用积分型指标 |
7.4 外部验证矩阵
一份小库的可信度,很大程度上取决于它的结论能否被独立复现。下表列出可以对照的外部证据源与对照方式。
| 验证对象 | 外部对照 | 对照方式 | 预期一致性 |
|---|---|---|---|
| 干预后峰值压力下降 | 方法论文报告的同向结果 | 直接比对方向与显著性 | 应一致 |
| 步态时空参数不变 | 方法论文明确报告无变化 | 比对结论 | 应一致 |
| 腓肠肌起始时间延迟 | 方法论文报告延迟 | 比对方向 | 应一致 |
| 足区划分 | Sartor 等的方法学原文 | 核对分区定义 | 部分一致,中足归属不同 |
| 肌电处理参数 | SENIAM 推荐与 Nagai 等的方法 | 核对电极位置与积分算法 | 应一致 |
| 鞋内压力的量级 | 同类 F-scan 研究 | 量级粗比 | 只能粗比,不可精比 |
需要说明的是,这张表里没有「独立重采集」这一行。截至本文核对时,未见针对同一批受试者的重复采集或第三方复现研究公开发表。这意味着所有内部一致性检验都只能在同一批数据内完成,无法排除批次效应。
7.5 它为何能持续:一个不可替代的组合
它之所以能在 PhysioNet 上长期挂着,不是因为规模,也不是因为更新,而是因为它占据了一个空位:公开可得的、同一批人的、鞋内分区压力与双通道原始肌电的配对记录,目前几乎找不到第二个。
做鞋垫的人需要界面压力,做肌电的人需要原始波形,做多模态对齐的人需要两个不同采样率的真实例子,做足部生物力学的人需要干预前后的配对。四类需求各自都不算大,但交集处只有这一份数据。它的生存逻辑不是「被广泛使用」,而是「被特定的一小撮人反复使用」——这类资源不需要流量,只需要不可替代。
§8 生态位与历史
8.1 从一篇论文到一份公开数据
这份数据的来历很清楚:先有研究,后有数据。2018 年 5 月,Moriguchi 与同事在 PLOS ONE 发表了关于胫骨前肌电刺激对足底压力与腓肠肌活动影响的论文;两个月后的 7 月 17 日,同一批数据以 plantar 的编号进入 PhysioNet。
这个顺序决定了数据的形态。它不是为共享而设计的数据库,而是一篇论文的原始记录被整理后公开。所以它保留了论文的全部结构性特征:按试次命名的文件、按分析方法汇总的指标、只覆盖论文实际用到的人群。它缺少的,恰恰是「数据库设计」才会考虑的东西——统一的模式、显式的字段说明、分层的元数据。
| 时间 | 事件 | 影响 |
|---|---|---|
| 2018 年 5 月 | PLOS ONE 论文发表 | 确立了采集方案与分析口径 |
| 2018 年 7 月 17 日 | 数据以 1.0.0 版进入 PhysioNet | 公开可得,配 DOI |
| 2019 年 2 月 20 日 | 校验清单文件生成时间 | 说明发布后做过一次完整性核对 |
| 2018 年至今 | 无新版本 | 内容冻结,无增量 |
8.2 论文与数据的分工
论文负责解释,数据负责记录。论文里有的,数据里不一定有:受试者的纳入排除标准、电刺激的电极位置、肌电的滤波参数、统计检验的具体做法,都只在论文里。数据里有的,论文里不一定细说:文件命名规则、每份文件的行数结构、汇总表的列序,都只在数据里。
这种分工对使用者的实际影响是:光看数据看不懂,光看论文也复现不了。必须两边对照。而两边之间有一处对不上——足区数量——恰好是最需要明确的地方。
| 信息项 | 论文 | 数据 | 缺口 |
|---|---|---|---|
| 受试者数量 | 有 | 可从编号数出 | 无 |
| 纳入排除标准 | 有(摘要层面) | 无 | 需读全文 |
| 刺激参数 | 有 | 无独立字段 | 需读论文 |
| 采样率 | 摘要未给 | 官方页面给出 | 需两边合看 |
| 足区数量 | 三区 | 官方页面四区 | 口径不一致 |
| 文件结构 | 无 | 有 | 需读目录 |
8.3 足底压力数据的谱系
把这份数据放进更大的谱系里看,它属于「鞋内测量」这一支。这一支的历史比「地面测量」短,但更贴近穿戴场景:鞋垫式传感器可以在任何地面上使用,不受实验室长度限制,代价是标定更麻烦、更容易滑动。
| 世代 | 代表形态 | 输出 | 典型问题 |
|---|---|---|---|
| 第一代 | 足底开关 | 事件时刻 | 只有有无,没有大小 |
| 第二代 | 电容式或压阻式鞋垫 | 分区压力 | 标定漂移,点位少 |
| 第三代 | 高密度阵列鞋垫 | 压力分布图 | 数据量大,成本高 |
| 本文对象 | 第二代与第三代的过渡 | 分区汇总指标 | 有阵列但只发汇总 |
它在谱系里的位置因此有点尴尬:设备能力上属于阵列式,发布形态上属于分区式。这让它既能被做分区分析的人直接用,又让想做分布分析的人失望。
8.4 为什么只有二十个人
这个问题没有官方答案,但可以从设计反推。这是一项自身前后对照的干预研究,每个人要完成两次采集、中间夹三十分钟刺激,单人次占用实验室时间接近一小时。二十人在这个设计下已经能给出统计显著的自身对照结果,因为配对设计消掉了大量个体间变异。
换句话说,二十人不是妥协,是这个设计下的合理规模。真正的问题不在人数,而在于它把这个规模原样搬到了公开数据里——研究够用,共享不够用。这是「论文附带数据」与「为共享而建库」之间的根本差异。
§9 使用指引
9.1 三种角色的路径
第一类是临床与康复方向的研究者。你们关心的是「足底某区负荷是否过高」,最该用的是压力侧的分区峰值与积分,二十人全部可用。路径是:先读汇总表拿到体重与步速,再按编号取压力文件,以人为单位做 pre/post 配对。注意不要跨人比较绝对值。
第二类是信号处理与多模态方向的研究者。你们关心的是「两个不同采样率的信号怎么对齐」,最该用的是那九个同时有压力与肌电的编号。路径是:取一个编号的 pre1,把压力区间起点打在肌电时间轴上,看两者是否对得上,再决定用哪种对齐策略。
第三类是工程与产品方向的使用者。你们关心的是「我的鞋垫算法输出得对不对」,最该用的是压力侧的峰值与积分作为参照。路径是:复现它的足区划分与标定假设,在自己的设备上跑同一套指标,比量级不比小数。
| 角色 | 首要文件 | 首要指标 | 常见错误 |
|---|---|---|---|
| 临床与康复 | P_* 全部 |
分区峰值、压力时间积分 | 跨人比较绝对值 |
| 信号与多模态 | P_* 与 E_* 交集 |
对齐偏差、均方根曲线 | 把插值当对齐 |
| 工程与产品 | P_* 抽样 |
峰值、积分、接触时长 | 忽略标定差异 |
9.2 一条最短的可用流程
若只想在半小时内看到这份数据长什么样,走下面这条路径:取一个人、一个时相、一趟步行,把压力与肌电画在同一张图上。
#-- 最短流程:一个人、一趟步行、两路信号并排
import re
import urllib.request
from pathlib import Path
import numpy as np
import pandas as pd
BASE = "https://physionet.org/files/plantar/1.0.0"
CACHE = Path("data/plantar")
CACHE.mkdir(parents=True, exist_ok=True)
def fetch(name):
dst = CACHE / name
if not dst.exists():
urllib.request.urlretrieve(f"{BASE}/{name}", dst)
return dst
press = pd.read_csv(fetch("P_001_pre1.txt"), sep=r"\s+", header=None,
names=["start_s", "end_s", "contact_s",
"peak_pressure", "pti"])
print("压力行数", len(press))
print(press.head())
#-- 若该编号在肌电覆盖范围内,再取肌电
try:
emg = pd.read_csv(fetch("E_001_pre1.txt"), sep=r"\s+", header=None,
names=["time_s", "ta", "gm"])
print("肌电采样点数", len(emg))
print("时长秒", round(emg["time_s"].max(), 2))
except Exception as exc:
print("该编号无肌电文件", exc)
这段代码的关键不在画图,而在两个打印:压力行数告诉你这一趟走了多少步(除以足区数),肌电时长告诉你这十米走了多久。两个数字一对,就能估算步速,与汇总表里的步速交叉验证。
9.3 引用方式
官方要求同时引用方法论文与平台。方法论文是 Moriguchi M、Maeshige N、Ueno M、Yoshikawa Y、Terashi H、Fujino H 发表在 PLOS ONE 2018 年第 13 卷第 5 期的文章,编号 e0195309,DOI 为 10.1371/journal.pone.0195309。数据本身用 DOI 10.13026/C20Q1Q 标识,版本 1.0.0。
许可为 ODC 署名 1.0。这意味着可以复制、分发、商用、二次加工,条件是署名。署名的最小做法是保留上述两条引用;若做了加工,还应在方法里写明加工步骤,因为原始数据的口径(足区数、单位)本身存在不一致。
| 引用对象 | 标识 | 是否必需 |
|---|---|---|
| 方法论文 | 10.1371/journal.pone.0195309 | 必需 |
| 数据本体 | 10.13026/C20Q1Q | 必需 |
| 平台 | PhysioNet 平台引用 | 建议 |
| 版本 | 1.0.0 | 建议写明 |
§10 AI 使用声明
| 项目 | 说明 |
|---|---|
| 内容生成 | 本页文字由 AI 辅助撰写,事实以官方页面与论文摘要为准 |
| 数字来源 | 仅取官方项目页、官方文件目录索引、方法论文摘要三处 |
| 未做统计 | 未下载全量文件逐条统计,未计算任何分布 |
| 口径冲突 | 足区数量存在官方四区与论文三区的差异,已并列呈现 |
| 未核实项 | 压力与肌电的物理单位、肌电覆盖九人的原因,均未核实 |
| 时间点 | 核对时间 2026 年 10 月 28 日,对应版本 1.0.0 |
| 责任边界 | 使用前请以官方页面与论文原文为准,本页不替代原始文档 |
| 更新策略 | 官方若发布新版本,本页需重新核对后更新 |
常见误读
| 常见说法 | 实际 | 证据 |
|---|---|---|
| 这是一份压力平台数据 | 是鞋内压力垫,测界面压力 | 官方描述写明鞋内垫片与固定方式 |
| 有一百六十个独立样本 | 独立单元是 20 个人,其余是重复测量 | 文件名中的人编号只有二十个取值 |
| 二十人都有肌电 | 只有九个编号有原始肌电 | 目录索引中 E_ 仅九个编号 |
| 压力是足底压力分布图 | 只有分区汇总的五个标量 | 官方描述列出五列而非阵列 |
| 采样率是 1000 Hz | 压力 50 Hz,肌电 1000 Hz | 官方分别标注两套设备的采样率 |
| 这是电刺激的疗效证据 | 刺激是造对照状态的手段,受试者为健康人 | 论文设计为自身前后对照 |
| 足区固定为四个 | 官方四区、论文三区,中足归属不同 | 项目页与论文摘要表述不一致 |
| 每趟步行有独立人口学记录 | 人口学集中在汇总表,一人一行 | 官方说明汇总表内容 |
| 可以直接拿来做步态识别 | 无逐帧标注,无疾病组 | 文件只有分区区间与原始波形 |
| 数据 2019 年后仍在更新 | 2018 年 7 月发布后未再更新 | 版本号仍为 1.0.0 |
FAQ
Q1:plantar 是压力鞋垫还是压力平台?
是鞋内压力垫。受试者穿着装入薄膜垫的鞋走十米直道,记录的是鞋垫与足底之间的界面压力。它与地埋式压力平台不同,也与测力台测的地面反作用力不同,三者不能互换。
Q2:采样率是多少?
压力侧 50 Hz,肌电侧 1000 Hz。两者相差二十倍,靠足跟负载开关在着地瞬间给出的同步脉冲对齐,因此只能对齐到着地事件这一级,做不到逐点对齐。
Q3:一共多少人、多少次步行?
20 名健康成年男性,每人八趟十米步行,即刺激前四趟、后四趟,合计一百六十次步行记录。但肌电原始文件只覆盖其中九个编号,压力侧才是二十人全在。
Q4:足底压力是怎么分区的?
官方描述按后足、中足、前足加全足底共四区输出;方法论文报告的是前足、后足、全足底三区。差额落在中足是否单列,官方未说明两种口径的关系。
Q5:能用来做步态识别或疾病诊断吗?
不适合。只有 20 名健康男性,没有疾病组,也没有逐帧步态事件标注。做分类任务会退化成在同一批人身上做交叉验证,指标虚高且不可外推。
Q6:为什么肌电只有九个人有?
官方页面没有说明。目录索引里 E_ 只出现九个编号,其余编号只有压力文件。可能的原因包括未采集、未发布或按质量筛选,三种可能对分析的影响不同,需自行限定。
Q7:压力值的单位是什么?
官方项目页没有逐项标注单位。峰值压力与压力时间积分的量纲需回到方法论文的方法部分确认,在确认之前不要与其它研究的绝对值直接比较。
Q8:刺激参数是什么?
双侧胫骨前肌,持续 30 分钟,频率 50 Hz,脉宽 300 微秒,通 10 秒断 10 秒,强度以引起踝关节接近全范围背屈为准。刺激在坐位完成,结束后立即进行四趟步行采集。
Q9:这份数据能算关节力矩吗?
不能。关节力矩需要地面反作用力与运动学数据,这份数据只有鞋内界面压力与肌电。若需要力矩,应改用测力台数据,或与运动捕捉数据联合使用。
Q10:许可允许商用吗?
允许。ODC 署名 1.0 允许复制、分发、商用与二次加工,条件是对数据署名。署名应包含方法论文与数据 DOI 两条。
Q11:文件有多大,能在笔记本上跑完吗?
全部数据文件合计约二十兆字节,解压后直接可读。单份肌电文件两百到四百 KB,单份压力文件一到两 KB。整个解析与统计流程在普通笔记本上几秒内完成。
术语表
| 术语 | 英文 | 含义 |
|---|---|---|
| 足底压力 | plantar pressure | 足底与支撑面之间的压强,本文特指足底与鞋垫界面 |
| 鞋内测量 | in-shoe measurement | 传感器置于鞋内的测量方式,区别于地面测力台 |
| 峰值压力 | peak pressure, PP | 一次触地内某足区的最大压力值 |
| 压力时间积分 | pressure-time integral, PTI | 压力对时间的积分,反映累积负荷 |
| 接触时长 | contact duration | 某足区从开始受力到完全卸力的时间 |
| 支撑相 | stance phase | 步态周期中足与地面接触的阶段 |
| 摆动相 | swing phase | 步态周期中足离地前摆的阶段 |
| 表面肌电 | surface EMG, sEMG | 体表电极记录到的肌肉电活动 |
| 积分肌电 | integrated EMG, iEMG | 肌电幅值对时间的积分,常以百分比表示 |
| 均方根 | root mean square, RMS | 信号幅值的有效值,肌电常用 50 毫秒窗计算 |
| 胫骨前肌 | tibialis anterior, TA | 小腿前侧肌肉,负责踝背屈,本文的刺激靶点 |
| 腓肠肌内侧 | gastrocnemius medialis, GM | 小腿后侧肌肉,负责踝跖屈,本文的观察对象 |
| 交互抑制 | reciprocal inhibition | 主动肌兴奋时拮抗肌运动神经元被抑制的现象 |
| 电刺激 | electrical stimulation, ES | 用电流引起肌肉收缩或神经兴奋的手段 |
| 脉宽 | pulse width | 单个电刺激脉冲的持续时间 |
| SENIAM | Surface ElectroMyoGraphy for the Non-Invasive Assessment of Muscles | 表面肌电电极放置位置的欧洲推荐标准 |
| 负载开关 | load switch | 受力闭合的开关,本文用于足跟着地检测 |
| 时间对齐 | temporal alignment | 把不同采样率的记录映射到同一时间轴 |
| 量化误差 | quantization error | 采样间隔带来的时间或幅值离散化误差 |
| 标定 | calibration | 用已知载荷建立传感器读数与真实量的对应 |
| 自身前后对照 | within-subject design | 同一受试者在干预前后各测一次的设计 |
| 适应效应 | adaptation effect | 重复任务导致的性能变化,与干预效应混杂 |
| ODC-By | Open Data Commons Attribution License | 要求署名的开放数据许可 |
| DAIMS | Data Availability, Accuracy, Integrity, Meaning, Sustainability | 本文使用的五维数据价值评估框架 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 官方全名 | Modulation of Plantar Pressure and Muscle During Gait | 项目页标题 | 官方页面 |
| 版本 | 1.0.0 | 项目页 | 官方页面 |
| 发布日 | 2018 年 7 月 17 日 | 项目页 | 官方页面 |
| DOI | 10.13026/C20Q1Q | 项目页 | 官方页面 |
| 许可 | ODC Attribution 1.0 | 项目页 | 官方页面 |
| 受试者数 | 20 | 项目页与方法论文 | 官方页面 |
| 性别构成 | 全部男性 | 项目页 | 官方页面 |
| 健康状态 | 无神经与骨科疾病史 | 项目页 | 官方页面 |
| 压力采样率 | 50 Hz | 项目页 | 官方页面 |
| 肌电采样率 | 1000 Hz | 项目页 | 官方页面 |
| 压力设备 | F-scan 鞋内压力垫 | 项目页 | 官方页面 |
| 足区数 | 四区(官方)/ 三区(论文) | 项目页与论文摘要 | 两个口径 |
| 每人试次 | 8 趟(前四后四) | 文件命名 | 官方文件列表 |
| 压力文件数 | 160 | 目录索引 | 官方文件列表 |
| 肌电文件数 | 72 | 目录索引 | 官方文件列表 |
| 肌电覆盖人数 | 9 | 目录索引 | 官方文件列表 |
| 全库体积 | 约 20 MB | 目录中各文件大小 | 官方文件列表 |
| 步行距离 | 10 米 | 项目页 | 官方页面 |
| 刺激时长 | 30 分钟 | 项目页 | 官方页面 |
| 刺激频率 | 50 Hz | 项目页 | 官方页面 |
| 刺激脉宽 | 300 微秒 | 项目页 | 官方页面 |
| 论文 | PLOS ONE 13(5): e0195309 | 项目页引用 | 官方页面 |
附录 B:数字的来源分层
第一层,官方页面。 受试者数量、性别、健康状态、设备型号、采样率、刺激参数、步行距离、分区方法、字段含义、许可、DOI、发布日期,全部来自 PhysioNet 项目页的数据说明。这一层的数字可以直接引用,但仍需注意页面本身可能滞后于论文。
第二层,官方文件列表。 文件数量、编号覆盖范围、单文件大小、全库体积、校验文件与汇总表的存在,来自官方目录索引。本页对「肌电只覆盖九个编号」的判断完全基于这一层,官方说明里没有对应文字,因此这是一个从目录结构推出的事实,而不是官方陈述。
第三层,方法论文摘要。 干预的生理学结论——峰值压力与压力时间积分下降、时空参数不变、腓肠肌起始与峰值时间延迟、积分肌电无显著变化——来自 PLOS ONE 论文摘要。本页没有就这些结论做任何再分析。
未核实项。 压力的物理单位、肌电幅值的单位与放大倍数、肌电为何只覆盖九个编号、四区与三区两种口径的关系、受试者招募的具体渠道与机构地址,这些在官方页面与摘要中均无明确说明,本页标为未核实,不做推断。
一处访问环境注记。 本次核对时,官方页面在部分网络环境下出现数据受地区限制的提示。该提示属于访问环境问题,不是数据本身的属性,官方仍将其标注为开放获取。此点单独列出,避免与许可条款混淆。
附录 C:完整参考文献
- Moriguchi M, Maeshige N, Ueno M, Yoshikawa Y, Terashi H, Fujino H. Modulation of plantar pressure and gastrocnemius activity during gait using electrical stimulation of the tibialis anterior in healthy adults. PLOS ONE. 2018;13(5):e0195309. DOI: 10.1371/journal.pone.0195309. PMID: 29746498. PMCID: PMC5944963.
- PhysioNet. Modulation of Plantar Pressure and Muscle During Gait (plantar), version 1.0.0. 2018-07-17. DOI: 10.13026/C20Q1Q.
- Sartor CD, Hasue RH, Cacciari LP, et al. 足底分区方法(官方描述中引用的分区依据)。
- Nagai K, et al. 最大等长收缩与积分肌电的计算方法(官方描述中引用的方法依据)。
- Hermens HJ, Freriks B, Disselhorst-Klug C, Rau G. SENIAM:表面肌电电极放置的欧洲推荐标准。
- Pollard T, Moody BE, Lehman L, et al. PhysioNet as a global platform for biomedical research. Nature Health. 2026. DOI: 10.1038/s44360-026-00096-z.
附录 D:任务代码
下面这段代码把「按人聚合、按相位配对、输出差值」三件事走完,可直接改路径复用。
#-- 从平铺目录直接算 pre/post 配对差值
import re
from pathlib import Path
import pandas as pd
COLS = ["start_s", "end_s", "contact_s", "peak_pressure", "pti"]
records = []
for path in sorted(Path("data/plantar/pressure").glob("P_*.txt")):
m = re.match(r"P_(\d{3})_(pre|post)(\d)\.txt", path.name)
if not m:
continue
df = pd.read_csv(path, sep=r"\s+", header=None, names=COLS)
df["subject"] = m.group(1)
df["phase"] = m.group(2)
df["trial"] = int(m.group(3))
records.append(df)
press = pd.concat(records, ignore_index=True)
press = press.dropna(subset=["peak_pressure", "pti"])
per_trial = (press.groupby(["subject", "phase", "trial"])
.agg(peak=("peak_pressure", "mean"),
pti=("pti", "mean"),
n=("peak_pressure", "size"))
.reset_index())
per_phase = (per_trial.groupby(["subject", "phase"])
.agg(peak=("peak", "mean"),
pti=("pti", "mean"),
trials=("trial", "nunique"))
.reset_index())
wide = per_phase.pivot(index="subject", columns="phase",
values=["peak", "pti", "trials"])
wide.columns = [f"{a}_{b}" for a, b in wide.columns]
wide = wide.dropna()
wide["d_peak"] = wide["peak_post"] - wide["peak_pre"]
wide["d_pti"] = wide["pti_post"] - wide["pti_pre"]
print(wide[["d_peak", "d_pti"]].describe())
print(wide.sort_values("d_peak").head(5))
两点使用提醒。第一,聚合前必须剔除空行,否则均值会被零值拉低。第二,dropna() 会丢掉缺任何一相的人,如果只想看压力侧,二十人都会保留;若同时要求肌电,只剩九个。
附录 E:如果只记五件事
一,它是鞋内压力垫加双通道表面肌电,不是压力平台,不是测力台。两个物理量不能互换。
二,20 名健康成年男性,每人八趟十米,刺激前四趟后四趟。独立样本是 20,不是 160。
三,压力 50 Hz、肌电 1000 Hz,靠足跟负载开关对齐。压力侧是分区汇总指标,没有压力分布图。
四,肌电原始波形只覆盖九个编号,压力侧二十人齐全。立项前先数目录。
五,足区存在官方四区与论文三区两个口径,中足是否单列不明。用之前自己定一套并写明。
编辑说明
本页的事实核对集中在三处:PhysioNet 项目页的数据说明、官方文件目录索引、PLOS ONE 论文摘要。没有下载全量文件做逐条统计,因此不含任何分布类数字。文件数量与覆盖范围由目录索引推出,官方文字未逐条列出,属于结构性观察而非官方陈述。
足区数量存在两个口径,本页并列呈现,未做取舍判断。压力与肌电的单位、肌电只覆盖九个编号的原因,均标为未核实。若官方发布新版本,第七节的评分与附录 A 的核对表需重新过一遍。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- ppg-dalia — 共享标签:生理信号 / 步态与运动 / 可穿戴传感
- culm — 共享标签:生理信号 / 步态与运动 / 可穿戴传感
- nesfdb — 共享标签:生理信号 / 步态与运动 / 可穿戴传感
- wearable-device-dataset — 共享标签:生理信号 / 步态与运动 / 可穿戴传感
- semg-gait-31subjects — 共享标签:生理信号 / 步态与运动 / 可穿戴传感
- pamap2 — 共享标签:生理信号 / 步态与运动 / 可穿戴传感
- mhealth — 共享标签:生理信号 / 步态与运动 / 可穿戴传感
- uci-har — 共享标签:生理信号 / 步态与运动 / 可穿戴传感
- wearable-exercise-frailty — 共享标签:生理信号 / 步态与运动 / 可穿戴传感
- body-sway-music-vr — 共享标签:生理信号 / 步态与运动 / 可穿戴传感
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

