脚下的白噪声 — NESFDB 姿势摇摆库

27 人 / 28,080 行 / 60 Hz 双列位移

来源 https://physionet.org/content/nesfdb/1.0.0/发布时间: 2026-10-28最后更新: 2026-10-28 阅读 13
脚下的白噪声 — NESFDB 姿势摇摆库

信息速览

数据集名称脚下的白噪声 — NESFDB 姿势摇摆库
数据类型时序信号,原始数据链接,元数据
规模27 名健康志愿者(15 青年 + 12 老年)/ 780 个三十秒片段
接入方式https://physionet.org/content/nesfdb/1.0.0/
AI 就绪度

这是一个被归入「生理信号」、实际上只有两列身体位移的小库。它的全名是 Noise Enhancement of Sensorimotor Function,官方挂在 PhysioNet 上,2004 年 10 月 29 日发布首版,二十余年未更版只补过一次校验和。库里没有脑电、没有心电、没有一条电生理通道:十五名健康青年与十二名健康老年人穿着内置振动元件的鞋垫站立,Vicon 系统每秒六十次记下肩部一枚反光标记在左右与前后两个方向上的位置,除以标记高度后写成两列文本。

它背后的科学问题叫随机共振。感觉系统对弱信号的响应并不随噪声强度单调变化:噪声太小时信号淹没在本底里,噪声适中时噪声反而把弱信号"托"过阈值,使可检测性上升,噪声再大则重新淹没。这套理论在物理与神经科学里讲了几十年,而它给这个理论提供了一个可操作的人工入口——把噪声直接打进脚底的触觉通道,然后看身体晃动是变大还是变小。

因此它真正的价值不在样本量。二十七个健康人、七百八十段三十秒片段、合计不到两万行数字,规模在今天的公开库里排不上号;它的位置在于把一个抽象的非单调效应做成了每个片段都能独立检验的对照实验,噪声与无噪声两两成对、顺序随机、受试者本人不知道。一屏速览见下表。

维度 内容
全名 Noise Enhancement of Sensorimotor Function
缩写 NESFDB(N + E + S + F + D,末位 D 指 Database)
发布平台 PhysioNet(MIT Laboratory for Computational Physiology 维护)
版本与日期 v1.0.0,2004 年 10 月 29 日;2019 年 2 月补录校验和
贡献者 Lewis Lipsitz,Hebrew Rehabilitation Center for Aged Research, Boston
配套论文 Priplata AA 等,Lancet 362:1123-1124(2003),PMID 14550702
受试者 15 名健康青年(均值 23 岁,标准差 2)+ 12 名健康老年(均值 73 岁,标准差 3)
片段数 780 个三十秒试次(老年 150 秒/人,青年 300 秒/人)
采样结构 每段 1800 行 × 2 列,全库两万八千余行
采样率 60 Hz(每秒六十个点)
通道 仅两路:左右位移、前后位移,均按标记高度归一化
采集设备 Vicon 运动分析系统,肩部单枚反光标记
刺激 凝胶鞋垫内 tactor,数字化均匀白噪声,100 Hz 低通,亚感觉强度
文件格式 两列纯文本(.txt),制表符分隔,科学计数法
目录层级 组(yng/eh)→ 受试者(MTxxxx)→ 条件(STIM/NULL)→ 试次文件
体积 解压后 32.2 MB;tar.gz 压缩包 6.2 MB;ZIP 32.3 MB
许可 ODC-BY 1.0,免注册、可商用,须署名
DOI 10.13026/C21S3G
缺什么 力台数据、人口学细目、官方划分、基线指标、分析脚本

§1 它要解决的具体麻烦

1.1 一个测量,两个方向,没有第三种可能

平衡控制研究的核心困难不在采集,在解释。把一个人放上测力台站三十秒,能得到一条压力中心轨迹,也能算出几十个指标——路径长度、摆动面积、均方根半径、样本熵、分形维数。指标多到成了负担:同一个受试者换个指标就换个结论,不同实验室结果互不可比。

这个库采取的路线是绕开指标,直接看两条原始位移。肩部一枚标记,两个正交方向,不滤波、不降采样、不预先算任何比值,把"晃动有多大"这个问题原样交给使用者。代价是它不能回答压力中心层面的问题(重心投影、足底压力分布、踝策略与髋策略的区分),收益是所有下游指标都由你自己定义,且定义过程完全可复现。

这种"只给原料"的做法在 2004 年并不罕见。当时的 PhysioNet 收录了大量小型专项库,各自由一到两位作者贡献,配一篇论文,格式简单到能用几行 awk 处理。二十年后回看,这批库的命运分岔:有的因为配套了标准标记与挑战赛而成为基准,有的因为没有标准标记而退为教学与复现素材。这个库属于后者,而且它对此并不掩饰——官方页面从头到尾没有一句话谈"怎么评测"。

真正让它值得单独成篇的,是它把刺激设计写进了目录结构。噪声试次进 STIM,对照试次进 NULL,试次序号留在文件名尾部。这一层标签是整个库最有信息量的部分,其余两列数字都是它的因变量。

1.2 三条常见的错误期待

第一条,期待它是一个平衡能力的常模库。 二十七个人,两个年龄段各一个,没有按性别、身高、体重、既往跌倒史分层,也没有量表分数。想拿它做"某年龄段正常值范围"的参照,样本量连一个像样的置信区间都撑不起来。官方给出的年龄均值与标准差是全库唯一的人口学数字,除此之外什么都没有。

第二条,期待它能直接检验随机共振理论本身。 这个库能检验的是"脚底亚感觉振动是否降低这一批人的晃动幅度",这是随机共振在人工触觉通道上的一个实现,不是理论的全部。理论涉及的噪声强度扫描,在这里被压缩成一个二元条件:给噪声,或不给。没有中间强度,没有剂量-反应曲线。想要曲线,得自己另找数据。

第三条,期待它有连续的、长时程的生理记录。 每段三十秒,中间还切了坐姿休息。这不是长时间监测,是一次实验室访问里的十几个短窗。用它做昼夜节律、做疲劳累积、做适应过程的长时程分析,全部超出边界。

1.3 它能给到的与给不到的

你的需求 它给的 够不够
随机共振的复制性检验 成对随机的噪声与对照试次,条件标签直接可用 够,二十七人虽小但配对设计干净
青少年与老年人的组间比较 两个年龄段各一组,年龄均值与标准差 勉强,只有两组且未分层
摆动指标的算法开发与调参 七百八十段干净的两列序列 够,段数足以覆盖多数算法边界
平衡控制与跌倒风险的临床评估 健康老年人,无跌倒史标注 不够,一组健康老人推不出风险分层
触觉刺激参数的剂量-反应研究 只有一个二元条件,强度为亚感觉 不够,没有扫描
重力中心与足底压力的力学分析 只有肩部标记,无测力台 不够,缺受力信息
步态分析(行走中的稳定性) 全部为静止站立 不够,不是步态
教学演示:噪声如何改善感觉 一个能被逐段复算的最小例子 够,且体积极小
与同类平衡库做跨库合并 字段与采样率都需转换 可做,但要写映射(§6.1)
训练深度时序模型 二十七人、每人十余段 不够,样本身份数太少

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

你的处境 它能帮你什么 下一步该做什么
你想重复一次随机共振实验,但手上没有原始数据 拿到成对设计的完整位移记录与原论文口径 先按受试者做配对比较,不要按片段做独立检验(§5.4)
你要给一套摆动指标找一个调试素材 七百八十段干净序列,格式简单到能直接喂 用 §5.3 的读取代码,注意单位是归一化量
你在做老年人平衡干预的方案设计 看到亚感觉振动这一类干预的原始证据形态 记住老年组只测了五分钟,时长效应要单独考虑
你要做一个轻量的教学案例 全库压缩后六兆余,一段三十秒,一分钟能讲完 用 §4.4 的案例数据做现场演示
你在给一个物理装置找人体验证的参照 刺激是人工白噪声,参数可复述 注意官方只给了滤波截止,没给幅度谱
你在整理公开平衡数据的清单 一个 2004 年入库、至今仍在架的小型专项库 按 §6.2 的检索路径找同类,注意区分站与走
你在核对某篇引用了本库的论文 体积极小,可一次下完并全量重算 用 SHA256SUMS.txt 先验完整性
你想做一个跨年龄段的基线对比 青年与老年各一组,条件相同 两组的测试总时长不同,合并前先对齐每人的试次数

1.5 一句话判断

它不是一个数据量的库,是一个设计的库:把一组看不见的脚底振动与一组没有振动交替摆在同一个人面前,留下的两列位移就是整个实验的全部证词。

1.6 不适合谁:四条边界

不适合做以人为单位的推断。 二十七个人。任何想回答"老年人是否比青年更依赖触觉输入"这类问题的分析,都要以受试者为统计单位,而二十七这个数字决定了置信区间会很宽。片段数再多,也只是让每个人的估计更稳,不会让群体层面的结论更强。

不适合做临床风险分层。 老年组由官方明确写作 healthy elderly,即健康老年人。没有跌倒史、没有共病、没有用药记录、没有认知评分。拿它训练一个"跌倒风险预测器",标签根本不存在。

不适合做力学机制分析。 一枚肩部标记只能刻画整体位移。踝关节力矩、髋关节策略、足底压力重分布、肌肉协同激活,这些都需要力台与肌电,而库里一个都没有。把肩部位移当成重心,是一种常见的简化,但在本库里这种简化尤其需要写明。

不适合做长时程与适应研究。 老年组每人五分钟、青年组每人十分钟,中间还有两分钟坐姿休息。总暴露时长太短,看不出习惯化或适应趋势;而两组时长本身不同,任何跨组的时间序列比较都会被时长差污染。

§2 数据构成与规格

2.1 四层目录,两层标签,一种文件

整个库从顶层看只有三样东西:eh 目录、yng 目录、以及一个校验和文件和一包 tar.gz。往下是两层标签——先分人,再分条件。人这一层用的是 MT 加四位数字的编号,老年组从 MT1502 到 MT1528,青年组从 MT1415 到 MT1439。编号不是连续的,中间有跳号,说明编号来自更大的招募名册,公开的只是其中一部分。

条件这一层只有两个子目录:STIM 与 NULL。前者是给了亚感觉振动的试次,后者是没给的对照。两个子目录的深度相同,文件名格式也相同,唯一区别是末尾两位数字所代表的试次位置。

最底层是文件本身。每个文件是一个纯文本,两列,制表符分隔,科学计数法,一千八百行。没有表头,没有时间戳列,没有单位说明。时间轴要靠约定的六十赫兹与行号推出来。

层级 取值 含义 是否可解析
第 1 层 eh / yng 老年组 / 青年组 是,目录名
第 2 层 MT1502… / MT1415… 受试者编号 是,但编号规则官方未说明
第 3 层 STIM / NULL 有振动 / 无振动 是,条件标签
第 4 层 fMT150201.txt 受试者 + 试次序号 是,序号为末两位
行 1–1800 三十秒内的采样点 是,行号即时间
列 1 科学计数法浮点 左右位移,已归一化 是,但方向正负官方未说明
列 2 科学计数法浮点 前后位移,已归一化 是,同上

这张表里有两处值得停下来看。第一处是编号跳号:老年组十二个人分布在 MT1502 到 MT1528 之间,二十六个可能的编号里只出现了十二个。第二处是列的方向符号:官方说第一列是左右、第二列是前后,但没有说正号指向哪一侧、哪一面。做方向相关的分析(例如"老年人是否更爱向某一侧偏")之前,必须先确认符号约定,而库里没有元数据能确认它。

2.2 字段与记录的完整字典

这个库的字段少到可以逐个列完。下面是完整对照,包括官方文字里提到的与只能从文件结构推出的。

项 值 / 类型 来源 备注
组别 枚举,eh 或 yng 目录名 官方写作 elderly healthy 与 young
受试者编号 字符串,MT + 四位数字 目录名 与文件名的中间段一致
条件 枚举,STIM 或 NULL 目录名 未见第三种取值
试次序号 两位整数,01 起 文件名末两位 同一受试者内连续编号
试次时长 30 秒 官方正文 与 1800 行 × 60 Hz 吻合
采样率 60 Hz 官方正文 官方写作 60 samples per second
左右位移 浮点,归一化 文件第 1 列 官方称 mediolateral
前后位移 浮点,归一化 文件第 2 列 官方称 anteroposterior
归一化基准 肩部标记高度 官方正文 原始单位应为长度
采集设备 Vicon 运动分析系统 官方正文 型号未给
标记位置 受试者肩部 官方正文 左肩或右肩未说明
刺激源 数字化均匀白噪声 官方正文 未给采样率与幅度谱
滤波 100 Hz 低通 官方正文 滤波器类型未给
刺激强度 亚感觉,先调至刚可感再降一成 官方正文 官方写作 reduced by 10%
刺激部位 前脚掌与脚跟下方的 tactor 官方正文 每只鞋内各一组
鞋垫材质 凝胶基底 官方正文 品牌未给
试次顺序 成对随机 官方正文 具体随机化实现未给
休息安排 测试中途两分钟坐姿休息 官方正文 计时起点未说明
青年测试总时长 10 分钟 官方正文 含休息
老年测试总时长 5 分钟 官方正文 含休息
青年年龄 均值 23,标准差 2 官方正文 单位岁
老年年龄 均值 73,标准差 3 官方正文 单位岁
性别 未提供 — 官方页面无相关内容
身高体重 未提供 — 官方页面无相关内容
纳入排除标准 未提供 — 官方页面无相关内容
采集年份 未提供 — 论文发表于 2003 年
站点 波士顿 作者机构 Hebrew Rehabilitation Center

这张表有一个明显特征:官方给了足够的采集细节让人能照着重做一遍实验,却没给人口学与环境细节让人做亚组分析。这个缺口是那个年代小型专项库的常态——它们默认的使用者是"想重复这个实验的人"。

2.3 一条记录的完整解剖

挑老年组第一位受试者 MT1502 的第一个试次。它落在 NULL 子目录下,说明这是一次对照试次。文件名 fMT150201.txt 可以拆成三段:f 是文件前缀,MT1502 是受试者编号,01 是该受试者序列里的第一试次。官方正文恰好用这个文件举例,说它是 MT1502 的第一次试次,因此是控制试次。

打开它,前几行长这样:

  2.9457126e+002	  1.8151676e+002	
  2.9462403e+002	  1.8138865e+002	
  2.9456761e+002	  1.8138459e+002	
  2.9456293e+002	  1.8139513e+002	
  2.9455336e+002	  1.8139059e+002	
  2.9460949e+002	  1.8131168e+002	

三件事从这六行里能直接读出来。第一,数值量级在两百九十与一百八十上下,说明它不是小数目的小数,而是归一化之后仍保留了较大绝对值的量——若以标记高度约一点五米估算,两列对应的原始位移在几百毫米量级,与肩部在三十秒内的缓慢漂移相符。第二,列间用制表符分隔,行末还有一个制表符,所以按空白切分会得到三个字段而不是两个,多出来的是空串。第三,相邻两行的差值很小(千分位变化),与六十赫兹采样下位移的逐点变化相符,没有跳变,没有缺省。

再往后看到一千八百行。一千八百除以六十等于三十,正好对上官方说的每试次三十秒。这个数字还可以反过来验证另一件事:如果某人的大文件里出现了不是一千八百的整数倍,那说明切分口径与官方说明不一致。对照抽查过的几个受试者,两个条件的片段数都严格等于除以二之后的整份数,说明切分是按时长均分,不是按事件。

校验一个片段是否完整,最省事的办法是查行数与时长的乘积:

#-- 抽查某段的完整性与行数
curl -s https://physionet.org/files/nesfdb/1.0.0/eh/MT1502/NULL/fMT150201.txt | wc -l
#-- 输出 1800,对应三十秒乘以六十赫兹

#-- 查看首行与末行,确认没有表头
curl -s https://physionet.org/files/nesfdb/1.0.0/eh/MT1502/NULL/fMT150201.txt | sed -n '1p;1800p'

2.4 规模表:三个层面的数字

规模可以从三个层面看,每个层面回答不同的问题。片段层面回答"有多少可分析的单元",行层面回答"总共有多少数字",受试者层面回答"能做多复杂的统计"。三个数字差了好几个数量级,混用是最常见的事故源。

层面 数字 官方口径 对使用者的意义
受试者 27 人 15 青年 + 12 老年 决定可做的统计上限
受试者目录 27 个 eh 12 个、yng 15 个 每人一个目录,无嵌套
条件子目录 54 个 每人 STIM 与 NULL 各一 结构完全对称
片段(试次) 780 段 老年 10 × 12 + 青年 20 × 15 决定可分析单元数量
老年组片段 120 段 每人十个 五个 STIM、五个 NULL
青年组片段 300 段 每人二十个 十个 STIM、十个 NULL
单段行数 1800 行 30 秒 × 60 Hz 一致性可直接核对
单行数字 2 个 左右 + 前后 无其他列
全库行数 两万八千余行 780 × 1800 与文件体积互相印证
全库数字 五万六千余个 行数乘以 2 一次可全部读入内存
单段时长 30 秒 官方正文 无更长记录
全库累计时长 6.5 小时 780 × 30 秒 跨全部受试者
老年组人均时长 150 秒 5 分钟的一半 含休息后的净测试
青年组人均时长 300 秒 10 分钟的一半 是老年组的两倍
解压体积 32.2 MB 官方文件页 可一次下载
压缩体积 6.2 MB tar.gz 实际大小 体积比约五比一

最后两行的体积比值得一提。两列科学计数法浮点、每行近百字节,压缩比高是意料之中。若解压后某文件异常大,多半是换行符或制表符格式不一致,而非数据本身。

2.5 与同类资源的字段差异

把本库与库内几个做"站与走"的词条并排看,能立刻看出它的定位:它是唯一一个把刺激条件做成一等公民的平衡库,也是唯一一个只有两列位移的。

维度 NESFDB 多相机步态姿势库 身体摇摆与音乐 VR gaitdb 步幅间隔库
任务 静止站立 推行走 静止站立 自由行走
受试者 27 人健康 14 人健康 28 人健康 15 人含患者
核心信号 两列肩部位移 惯性单元 + 深度相机 足底压力中心 步幅间隔时间戳
采样率 60 Hz 60 Hz / 30 fps 1000 Hz 事件级
刺激干预 脚底亚感觉振动 无 视觉与音乐 无
标签 条件 + 试次序号 动作 + 速度 + 路径 十二种条件 受试者分组
许可 ODC-BY 1.0 CC BY 4.0 随平台默认 ODC-BY 1.0
与本库的关系 — 任务不同,可做特征对照 同为站立,可交叉验证指标 场景不同,不可合并

这张表里唯一能直接做数值对照的是第三列。两个库都测静止站立,但一个用足底压力中心、一个用肩部标记。把同一套指标分别算到两边,可以检验两者在多大程度上同向变化;这种对照不能证明哪边错了,只能说明量纲不是一回事。

2.6 目录命名的两个细节

第一个细节是受试者编号的位数。MT 后面固定四位数字,前两位似为年份段或批次(老年组以 15 开头,青年组以 14 开头),后两位是序号。这个推测来自两组编号的分布重叠——老年组的 MT1502 与青年组的 MT1415 无法只靠后两位区分,必须看前两位。官方没有解释编号规则,任何依赖编号语义的分析都属推断。

第二个细节是文件名的前缀 f。每个数据文件都以 f 开头,官方举例时也写了 fMT150201.txt。它代表什么官方未说明,唯一确定的作用是把文件名与同名目录区分开。

nesfdb/1.0.0/
├── eh/                          #-- 老年健康组,12 名
│   ├── MT1502/
│   │   ├── NULL/                #-- 无振动对照,5 段
│   │   │   ├── fMT150201.txt
│   │   │   ├── fMT150203.txt
│   │   │   ├── fMT150205.txt
│   │   │   ├── fMT150207.txt
│   │   │   └── fMT150209.txt
│   │   └── STIM/                #-- 亚感觉振动,5 段
│   │       ├── fMT150202.txt
│   │       └── ... 其余 4 段
│   └── ... 其余 11 名受试者
├── yng/                         #-- 青年健康组,15 名
│   └── MT1415/
│       ├── NULL/                #-- 10 段
│       └── STIM/                #-- 10 段
├── nesfdb.tar.gz                #-- 全库打包,6.2 MB
└── SHA256SUMS.txt               #-- 2019 年补录校验和

注意对照试次的序号全是奇数、刺激试次全是偶数,这不是偶然。成对随机意味着每个相邻的一对里一个给噪声一个不给,随机的是这一对内部的先后顺序。因此试次序号本身携带了配对信息:一奇一偶为一对,谁在前谁在后就是随机化结果。

§3 它是谁的数据:一间波士顿的实验室与一位临床医生

3.1 作者、机构与那篇《柳叶刀》短文

官方页面把作者标为 Lewis Lipsitz,机构写作 Hebrew Rehabilitation Center for Aged Research, Boston, MA。同一个机构今天叫 Hebrew SeniorLife 属下的老龄研究所,是波士顿地区做老年医学研究的老牌机构。

配套论文不是一篇长文,而是一封《柳叶刀》的研究通信,两页篇幅:Priplata AA、Niemi JB、Harry JD、Lipsitz LA、Collins JJ 五人署名,题为 Vibrating insoles and balance control in elderly people,载于 2003 年第 362 卷 1123 至 1124 页,PMID 14550702。官方页面在"使用本资源请引用原始论文"一栏直接给了这篇通信的 PDF 链接。

五位作者的分工从机构能看出大概:Priplata、Niemi、Harry 与 Collins 来自波士顿大学的那间物理与生物医学工程实验室,Lipsitz 来自希伯来康复中心,负责老年受试者的招募与临床把关。这种"工程实验室出装置、老年医学中心出人"的组合,是那几年随机共振研究的标准配置。

3.2 时间线

时间 事件 来源
2003 年 《柳叶刀》362 卷发表振动鞋垫研究通信 官方引用栏、Europe PMC
2004 年 10 月 29 日 PhysioNet 发布本库 v1.0.0 官方版本页
2004 年 10 月 30 日 tar.gz 打包文件的时间戳 官方文件页
2019 年 2 月 20 日 补录 SHA256SUMS.txt,37 项校验和 官方文件页时间戳
2026 年 10 月 本文核验时的当前版本仍为 v1.0.0 官方版本页

时间线只有四个节点,其中三个来自文件时间戳。数据集本身的采集发生在论文发表之前,但官方没有给出具体采集年月,也无法从文件时间戳反推——2004 年的时间戳是入库时间,不是采集时间。

版本号停在 1.0.0 二十余年,且官方只在 2019 年补了一份校验和,说明这个库进入了"只维护不更新"的状态。对使用者来说这是好事:不会有静默改版,引用时写清版本号与访问日期就足够。

3.3 采集现场:一只鞋垫、十枚 tactor、两条光轴

官方正文把采集现场写得相当具体,按顺序读能得到一幅完整画面。每只鞋内放一块凝胶基底的鞋垫,前脚掌与脚跟下方各嵌有振动元件。振动本身不是机械抖动,而是用数字化的均匀白噪声信号驱动,这个信号经一百赫兹低通滤波后送往振动器。

正式测试前,每位受试者要把振动幅度调到"只能勉强感觉到"的水平;随后这个水平再下调约一成,使其成为亚感觉刺激。这一步是整个实验的关键设计:刺激必须存在,但不能被意识到。若受试者能明确感觉到振动,安慰剂效应与注意转移就会混进来,效应无法归因于噪声本身。

身体位移由 Vicon 运动分析系统记录。受试者肩部贴一枚反光标记,若干红外相机追踪它的三维位置,官方只取其中两轴——左右与前后——写成两列。这一取舍意味着垂直方向的起伏被丢弃,而垂直方向恰恰与呼吸、微小屈膝相关。丢弃它简化了数据,也让某些分析(比如呼吸对摆动的影响)无法开展。

试次顺序按对随机化:每一对相邻试次里,一个给噪声、一个不给,随机的是这一对内部谁先谁后。这样做的目的是让噪声与对照在时间上贴近,抵消缓慢的漂移(疲劳、注意波动、室温变化)。受试者本人不知道任何一次试次里是否有刺激。

3.4 数据来源的三个层次

读这个库时,要把三种不同性质的陈述分清楚,否则很容易把推断当成官方说法。

层次 内容 可靠性 例子
官方正文 官方页面 Data Description 一节的散文 最高,直接引用 十五名青年、十二名老年、六十赫兹、三十秒
文件结构 目录名、文件名、行数可逐项核对 高,但语义需推断 780 个片段、1800 行、奇偶配对
论文摘要 Europe PMC 返回的摘要文字 中,口径可能不同 全文写作二十七名参与者
推断 编号规则、符号约定、单位换算 低,须标注 MT 前两位为批次、正号指向

第三层与第一层的一致点在于人数。官方页面说十五加十二,论文摘要说二十七名参与者,两边相加正好。这一点值得记下来:它是本文唯一能与外部文献做交叉验证的规模数字,其余数字都只有单一来源。

3.5 两个口径:测试时长与净测量时长

官方描述里有一处需要小心。它说青年受试者的测试记录十分钟、老年受试者五分钟,且所有情况下在测试中途有两分钟坐姿休息。同时它说每个测试被切成三十秒的试次,每个文件是一个试次。

这段话可以有两种读法。读法一把总时长理解为包含休息的墙上时间:青年十分钟扣掉两分钟休息剩八分钟,即十六个三十秒试次;老年五分钟扣两分钟剩三分钟,即六个。读法二把休息也算进试次序列,两分钟相当于跳过四个试次的位置。

文件结构给出的答案与两种读法都不完全一致:老年组每人十个试次(三百秒),青年组每人二十个(六百秒)。若按读法一,老年组应是六个、青年组应是十六个;若按读法二,老年组应是十个位置、青年组应是二十个位置,但其中各有若干个位置是休息,实际文件数会更少。

存在两个口径:官方文字说青年十分钟、老年五分钟;文件树给出青年每人六百秒、老年每人三百秒的净测量。差额的构成官方未说明,可能是休息时间记在测试之外,也可能是"十分钟"指整次实验室访问中的某个环节。做时长归一化时,以文件数为准更稳妥。

§4 它最独特的东西:把噪声做成了目录名

4.1 为什么随机共振需要一个人体实验

随机共振的核心反直觉之处在于:噪声通常被当作要消除的东西,而在这里它被当作资源。一个低于阈值的周期信号,单独存在时检测不到;叠加适量噪声后,信号在阈值附近被"抬高"的概率增加,检测率反而上升。这个现象最早在气候模型里被提出,后来在神经元、感知系统、乃至 crayfish 的机械感受器上被反复观察。

要把它搬到人身上,需要一个能人为控制噪声的通道。听觉与视觉太复杂,噪声易被高级认知接管。触觉的机械感受器更接近"阈值检测器",脚底又是站立时唯一与地面接触的部位——在这里加噪声若有效,效果会直接落在身体晃动上。

这个库就是这个实验的原始记录。它的独特之处不在数据本身有多干净,而在它把"给不给噪声"这件事编码进了目录结构:STIM 与 NULL 两个子目录,深度相同、命名对称、数量相等。任何使用者打开目录就能知道条件,不需要读任何元数据文件。

4.2 奇偶配对:一个写在文件名里的设计

再回看 MT1502 的文件列表:NULL 里是 01、03、05、07、09,STIM 里是 02、04、06、08、10。这不是巧合,是配对随机化在文件名上的投影。每一对(01, 02)、(03, 04)……里一个对照一个刺激,随机的是这一对内部的先后。

这个设计带来两个后果,对分析都很重要。第一,配对结构必须保留。把两组的试次各自池化再做独立样本检验,会丢掉配对带来的方差削减,白白损失统计功效,同时把个体差异混进组间差里。第二,配对结构也是可核对的结构:如果某个受试者的序号出现连续两个奇数或连续两个偶数,说明该受试者的试次有缺失或被重新编号,分析时要单独看。

反过来,这种配对设计也有一个隐含代价:噪声与对照在时间上紧邻,两者的差异里混着极短的疲劳或适应效应。好在相邻两段只隔三十秒,这个效应通常可以忽略,但它存在,且无法从数据里分离出来。

4.3 一段位移能算出什么、不能算出什么

两列、一千八百行、三十秒。从这个最小原料出发,标准做法是先整流再做积分或求均方根,然后派生出路径长度、摆动面积、均方根半径、平均速度等指标。这些都不需要额外信息,只要两列数就能算。

不能算的同样是这一类:受压中心的位移(缺受力)、关节角度(缺体段长度与标记集)、肌电协同(缺肌电)、足底压力重分布(缺压力传感)。官方在正文里没有一句提到这些,也没有暗示数据能支持它们。

有一点容易被忽略:肩部标记测的是上半身的位移,而站立时的晃动主要由踝策略主导,上半身的位移是踝关节转动被放大后的结果。放大倍率取决于身高与体段质量分布,而这个库既没有身高也没有体重。因此严格来说,肩部位移是一个"未经标定的整体晃动代理量",横向比较时必须假定两组的身高分布接近,而这个假定无法验证。

4.4 案例:MT1502 的第一对试次

选 MT1502 是因为官方正文正好拿它举例,而且它位于目录开头,任何人都能三步走到。

第一步,进 eh/MT1502,看到 NULL 与 STIM 两个子目录。第二步,进 NULL,看到五个文件,序号为 01、03、05、07、09。第三步,进 STIM,看到五个文件,序号为 02、04、06、08、10。这个受试者总共十个试次,净测量三百秒。

现在把 01 与 02 这一对拿出来。它们是相邻的两段,一段是受试者站着没被振动的三十秒,另一段是站着被振动的三十秒。按官方的设计意图,这两段之间唯一的系统差异就是鞋垫是否在振动。若振动有效,02 的摆动幅度应当小于 01;若无效,两者应当相近。

这个"一对"的对照方式,正是全文反复回到的那个结构的最小单位。§4.2 的奇偶配对讲的是它在文件名上的形态,§5.2 的取数路径讲的是怎么把这一对完整取到本地,§7.2 的解读边界讲的是为什么一对的差异不能直接当成效应存在。

有一点必须先说清楚:仅凭这一对,什么结论也得不出。一个受试者的两次三十秒,个体内的自然波动远大于刺激的效应,官方用的统计是在组层面做的。选 MT1502 作案例,是因为它把设计讲得最直白,不是因为它特别有说服力。

4.5 边界条件:什么情况下这套设计不再成立

第一种情况是刺激被意识到。官方用"先调至刚可感、再降一成"保证亚感觉,但依赖主观报告;"一成"官方写的是 amplitude of the vibrations,应指振幅。若某人的触觉阈值漂移(如脚底温度变化),刺激可能在部分试次里越过阈值,效应里就会混入注意成分,而数据无法区分。

第二种情况是站立策略改变。三十秒的静止站立里人并非完全不动,而是在缓慢摆动中不断微调。若某段里策略变了(如从踝策略换成髋策略),位移的统计特征会突变。官方没有任何策略标注,段内突变要自己检测。

第三种情况是分组本身的异质性。老年组的年龄标准差为三岁,跨度可能从六十几到八十几。这个区间里前庭功能、本体感觉、肌力的变化都很快,把它们压成一个"老年组"是一种粗粒度处理。官方没有按年龄再分层,也没有逐人报告年龄。

§5 怎么拿到:从 curl 到一张摆动指标表

5.1 下载面的三条路

官方给了三种取数方式,差别只在体积与可控性上。第一种是逐文件下载,适合只取某一两个受试者做试验;第二种是整包 tar.gz,六兆余,适合全量;第三种是网页上的 ZIP 打包,三十二兆余,适合不想用命令行的场景。

三者内容一致,差别是压缩方式与是否保留目录结构。逐文件下载最灵活,但七百八十个文件需要脚本循环。整包最省事,解压后目录树完整。

#-- 整包下载并校验,注意这是六兆余的小包
wget https://physionet.org/files/nesfdb/1.0.0/nesfdb.tar.gz
tar -xzf nesfdb.tar.gz
du -sh nesfdb/

#-- 校验:官方在 2019 年补录了 SHA256SUMS.txt
wget https://physionet.org/files/nesfdb/1.0.0/SHA256SUMS.txt
sha256sum -c SHA256SUMS.txt --ignore-missing

第二段命令在解压目录里跑才有意义。校验和不匹配时先别急着怀疑文件损坏,先确认解压出来的目录层级与校验和里写的相对路径一致——这是最常见的假警报来源。

5.2 只取一个受试者

多数初次接触只需要看一个人。这时逐文件下载比整包快,也更利于理解目录结构。

#-- 递归取一名老年受试者的全部十个片段,不取上级目录
wget -r -np -nH --cut-dirs=4 \
  -A 'fMT1502*.txt' \
  https://physionet.org/files/nesfdb/1.0.0/eh/MT1502/

#-- 结果落在 MT1502/NULL 与 MT1502/STIM 两个子目录
find MT1502 -name '*.txt' | sort

--cut-dirs=4 是关键:它把前面四层路径裁掉,让文件直接落在当前目录下的 MT1502 里。层数数错会得到一层套一层的空目录。

5.3 读成表并做基本检查

读这个库不需要专门的库。两列空白分隔的浮点,numpy 一行就能吃下去。真正需要检查的是三件事:行数、列数、有没有空行。

#-- 把一段三十秒读成 1800 行 2 列,先做三项完整性检查
import glob
import numpy as np

def load_trial(path):
    a = np.loadtxt(path, dtype=float)
    assert a.shape == (1800, 2), f"{path} 形状为 {a.shape},应为 (1800, 2)"
    t = np.arange(a.shape[0]) / 60.0
    return t, a[:, 0], a[:, 1]

for p in sorted(glob.glob("MT1502/*/fMT1502*.txt"))[:3]:
    t, ml, ap = load_trial(p)
    print(p, f"时长 {t[-1] + 1/60:.1f} 秒",
          f"左右范围 {ml.min():.1f}~{ml.max():.1f}",
          f"前后范围 {ap.min():.1f}~{ap.max():.1f}")

断言里的形状是这个库唯一的硬约束。若某个文件报形状错误,先看是不是 wget 把错误页存成了 txt——这类文件往往是几十字节的 HTML,读进来会是零维数组而不是报形状问题,所以断言之外还要看文件大小。

5.4 算指标与配对比较

指标不需要复杂。下面这段把每个片段压成一个均方根幅度,然后按受试者做配对差值。

#-- 每个片段压成一个数,然后按受试者算配对差值
import os
import numpy as np

def rms_radius(ml, ap):
    ml = ml - np.nanmean(ml)
    ap = ap - np.nanmean(ap)
    return float(np.sqrt(np.mean(ml ** 2 + ap ** 2)))

rows = []
for subj in sorted(os.listdir("eh")):
    d = os.path.join("eh", subj)
    if not os.path.isdir(d):
        continue
    for cond in ("NULL", "STIM"):
        for p in sorted(os.listdir(os.path.join(d, cond))):
            if not p.endswith(".txt"):
                continue
            a = np.loadtxt(os.path.join(d, cond, p), dtype=float)
            rows.append((subj, cond, rms_radius(a[:, 0], a[:, 1])))

import collections
by = collections.defaultdict(lambda: {"NULL": [], "STIM": []})
for subj, cond, v in rows:
    by[subj][cond].append(v)

diff = [np.mean(v["NULL"]) - np.mean(v["STIM"]) for v in by.values()]
print(f"受试者 {len(diff)} 人,平均差值 {np.mean(diff):.4f},标准差 {np.std(diff, ddof=1):.4f}")

输出的差值是"对照均值减刺激均值"。若噪声降低摆动,这个数应为正。要注意的是,这里对每个受试者先做片段平均再求差,而不是先把全部片段混在一起——前者保留配对,后者丢掉配对。

5.5 与青年组对齐

青年组每人二十个片段,老年组每人十个。直接把人混在一起会让人数加权偏向青年组,正确的做法是每组内先求受试者级均值,再做组间比较;或者分析每个受试者前五个片段,让两组在片段数上对齐。

#-- 组间比较:先到受试者层,再到组层,避免片段数不等带来的加权偏差
import os
import numpy as np

def subject_means(group):
    out = {}
    for subj in sorted(os.listdir(group)):
        d = os.path.join(group, subj)
        if not os.path.isdir(d):
            continue
        vals = {"NULL": [], "STIM": []}
        for cond in vals:
            for p in sorted(os.listdir(os.path.join(d, cond))):
                if p.endswith(".txt"):
                    a = np.loadtxt(os.path.join(d, cond, p), dtype=float)
                    a = a - a.mean(axis=0)
                    vals[cond].append(np.sqrt(np.mean((a ** 2).sum(axis=1))))
        out[subj] = float(np.mean(vals["STIM"]) - np.mean(vals["NULL"]))
    return np.array(list(out.values()))

eh = subject_means("eh")
yng = subject_means("yng")
print(f"老年 {len(eh)} 人 效应 {eh.mean():.4f}±{eh.std(ddof=1):.4f}")
print(f"青年 {len(yng)} 人 效应 {yng.mean():.4f}±{yng.std(ddof=1):.4f}")

这段代码返回的是"刺激减对照"的受试者级效应量,两组各一个数组。下一步用哪个检验由你定,但统计单位必须是受试者,这一点在这个库里没有商量余地。

5.6 五个最容易出错的地方

第一个,把行末的空制表符当成第三列。 用 np.loadtxt 没问题,它按空白切分后自动忽略空串;但用 pandas.read_csv(sep='\t') 会多出一列全空。写 sep=r'\s+' 或显式指定两列最稳。

第二个,把片段当独立样本。 七百八十个片段听起来不少,但真正独立的是二十七个人。按片段做 t 检验会得到极小的 p 值,那是伪重复造成的。§4.4 的案例只是一个人的两段,把它当成“两个样本”正是这种错误的雏形。

第三个,假定正号有统一含义。 官方没说第一列正号指向左侧还是右侧,也没说第二列正号指向前还是后。做方向性结论前,必须先在同一受试者内确认符号惯例,而库里没有任何元数据能帮你确认,只能靠段内统计的对称性猜。

第四个,把归一化单位当成无量纲。 归一化只是除掉了标记高度,量级仍在。若要把本库的位移与其他库的绝对位移比较,必须先找回身高——而身高没有。

第五个,忽略老年组与青年组的试次数差。 老年组五个噪声片段、青年组十个。若噪声效应在试次序列上有适应趋势(前几段效应大、后面变小),那么组间差异里就混入了"平均到第几个试次"的差异。稳妥的做法是只取每组的前五个片段做对照。

§6 与库内记录的关系

6.1 关系图谱

这个库在同一批"站与走"的词条里位置很清楚:它是唯一一个把外部刺激作为实验变量的,也是信号维度最低的。

词条 与 NESFDB 的关系 能不能合并 关键差异
多相机步态姿势库 同为运动学信号,同为健康人 不能,任务不同 它测行走,本库测静止站立
身体摇摆与音乐 VR 同为静止站立的摆动测量 可做指标层面的交叉检验 它用压力中心一千赫兹,本库用肩部标记六十赫兹
gaitdb 步幅间隔库 同平台同年代的小型专项库 不能 它只发布步幅间隔时间戳,无连续波形
步态与衰老相关词条 主题同为年龄与运动控制 可做文献层面的旁证 都以老年人为主,但本库无患者分组
康复运动捕捉相关词条 同为动作捕捉流程的产物 不能 设备与标记集完全不同
随机共振类物理与听觉研究 理论同源 不适用 那类研究不在本库范围内

6.2 检索路径

在本站找同类资源,有三条稳定的路径。

第一条按任务找:本库属于静止站立(quiet stance),与行走、起坐、转身并列。做静止站立的词条远少于做行走的,这是公开数据生态的普遍现象——行走更接近日常功能,站立更接近实验室范式。

第二条按信号找:两列位移是最低配的运动学信号。若你的流程需要更高维的运动学(关节角度、节段姿态),就要往惯性单元或光学标记集的词条找;若只需要整体晃动的一个代理量,本库够用。

第三条按干预找:本库属于"外部刺激改变感觉输入"这一类。这一类的共同点是都有一个可控的物理量作为自变量,而因变量是人体的输出。找同类时,关键词不是疾病名,而是刺激方式。

6.3 三张对照表:谁能替代它

你的需求 本库能满足吗 更好的选择 理由
大样本的老年人平衡常模 否 大型队列研究中的平衡子集 二十七人撑不起常模
站立摆动的力学机制 否 带测力台的平衡库 缺受力信息
随机共振的人体复制 是 本库即为首选之一 配对设计加原始波形
深度时序模型训练 否 大规模可穿戴或惯性数据 身份数太少
振动触觉刺激的参数扫描 否 专门的触觉心理物理实验 本库只有一个强度
指标算法的快速调试 是 本库足够 体积极小、格式最简
年龄相关的运动控制研究 部分 带多年龄段分层的步态库 本库只有两端两个组
临床干预效果验证 否 随机对照试验的公开数据 本库是实验室单次测量

三张表合起来说一件事:这个库的适用范围窄但明确——验证一个具体效应时它几乎无可替代,其余方向上都不是首选。

§7 质量评估与局限性

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

在看任何评分之前,先把一个容易发生的误判摆正:这是一个二〇〇四年入库、二十四位编号、两列数字的小库,用今天的"数据集质量"尺子去量它,会把设计上的讲究误读成数据上的贫乏。今天的公开数据集普遍追求规模、划分、基准;这个库三样都没有,当年入库的理由也不是这三样,是"这个效应值得被独立复现"。

因此下面的评分不是"它够不够现代",而是"它作为一次实验的档案,保真度有多高"。评的是档案的完整性与可解析性,不是样本量。把这两件事分开,才不会得出"二十七个人所以一文不值"这种被尺子误导的判断。

还有一处校正关于统计单位。容易犯的一个错误是把七百八十个片段当成七百八十个样本,那会让所有结论都虚高。真正的样本单位是二十七个人,片段只是每个人的重复测量。带着这个校正往下读,后面的数字才有意义。

7.1 五维评分

评分沿用 DAIMS 框架的五个维度,每一维给出分数与依据。分数是编辑口径下的相对判断,不是官方评价。

维度 分数 依据 主要扣分点
数据可用性 5 / 5 免注册、六兆余、纯文本、校验和齐备 无
标注充分性 4 / 5 条件与试次序号直接编码在目录与文件名 无人口学、无逐人年龄
可解释性 4 / 5 官方正文把设备、刺激、协议写得具体 缺单位与符号约定
可维护性 4 / 5 版本冻结二十余年、有校验和 无元数据更新、无 errata
可扩展性 2 / 5 只有两列、只有两个条件 无法支撑复杂建模
综合 3.8 / 5 小而完整,边界清楚 规模与维度是硬约束

这套分数里最值得解释的是"可扩展性"。两分不是说数据不好,是说从这两列出发能走的路很少:没有附加通道、没有干预梯度、没有随访。使用者打开文件之前,能做的事就基本确定了。这对实验档案是正常状态,对想当基准的库则是致命缺陷。

"数据可用性"满分是实至名归:七百八十个文件格式统一、行数一致、校验和完整、解压即用,中间不需要任何一步格式转换。这种"零摩擦"在今天的公开库里反而是少数。

7.2 解读边界:一对试次能说明什么

回到 §4.4 的案例。MT1502 的第一对试次,一段对照一段刺激,相邻三十秒。有人会想:直接把两段的均方根一比,差距就是效应。这个做法在个人层面不算错,但它回答的问题与官方论文回答的问题不是同一个。

官方论文的结论建立在组层面:青年组八个摆动指标里七个下降,老年组全部指标下降,其中两个指标的改善在老年组显著大于青年组。这是"二十七个人平均来看",不是"任何一个人任何一对试次"。

个人层面的差异受三件事支配:个体内的自然波动、试次估计的精度、此人是否真的对振动敏感。三十秒的估计精度有限,个体内波动远大于组均效应。所以一对试次出现"刺激段摆动更大"很正常,不构成对效应的反驳。

正确的读法:把每个受试者的配对差值当成一个观测,二十七个观测构成本库能提供的全部证据。少于这个层面的分析都只是在看噪声。

7.3 已知的、可枚举的偏差

偏差这个词在这里取"系统性地偏离某种"的意思,下面四条都是可以从官方描述与文件结构中直接指出来的。

偏差 具体表现 对分析的影响 能否校正
选择偏差 健康老年人,未纳入跌倒史或前庭疾病 组间差异被低估 不能,数据中没有这些人
时长偏差 青年十分钟、老年五分钟 跨组时间序列比较失真 部分,取前五个试次对齐
维度偏差 只有肩部两轴,无垂直与受力 上肢策略的贡献被强调 不能
编码偏差 条件靠目录、序号靠文件名 目录被压平后标签丢失 能,用完整路径作键
身份偏差 编号规则未说明,有跳号 无法判断缺号是否为剔除 不能
记录偏差 只有试次级文件,无原始连续流 无法回溯试次切分点 不能

第二行与第六行值得多说一句。时长偏差可以部分校正,办法是让两组都只取前五个试次:老年组前五个试次里含两到三个刺激段,青年组前五个同理,对齐后片段数一致。§4.4 的案例里,前五个试次正好是 01 到 05,横跨两个条件,因此能直接参与这种对齐。代价是信息量下降,好处是消除了"平均到第几个试次"的差异。记录偏差则完全无法校正:官方只发布了切好的三十秒段,原始连续记录不在库里,任何关于段边界如何确定的推断都只能停留在推断。

7.4 外部验证矩阵

这个库能与外部对上的地方不多,逐项列出来反而清楚。

验证项 本库口径 外部口径 是否一致
受试者总数 十五加十二,二十七 论文摘要写二十七名参与者 一致
年龄段 青年均值二十三、老年均值七十三 摘要写作 young and elderly participants,未给均值 不冲突,无法细化比对
刺激方式 凝胶鞋垫内振动元件 摘要写作 vibrating gel-based insoles 一致
结论方向 官方只描述数据,不下结论 摘要称多数指标下降 本库不含结论,属正常
效应组间差 官方未给具体指标 摘要点名两个指标有显著组间差 需自行复算
采集设备 Vicon 摘要未提设备型号 单一来源
年份 二〇〇三年论文,二〇〇四年入库 一致 一致
许可 ODC-BY 1.0 平台统一口径 一致

这张表里最有用的是第一行。人数是唯一一个在官方页面与论文摘要两边都能对上、且两边数字吻合的规模项。它是判断"库与论文是不是同一批数据"的关键线索;其余项要么只有单一来源,要么摘要写得太概括无法比对。

第五行是一个提醒:摘要点名了左右方向范围与临界均方位移这两个指标在老年组改善更多,但本库不含任何预先算好的指标。想核对这个结论,必须自己按摘要的方法算——而摘要没有给方法细节,得去读全文,这一步超出了本库的范围。

7.5 它为何能持续:一份关于"噪声有用"的最小档案

一个二十余年不更新的库为何还在被引用,答案不在数据规模,在它保存了一个难以重建的东西:一次完整的人体随机共振实验的原始记录。

重建它的成本很高:重新组织二十七名受试者、准备带振动元件的凝胶鞋垫、让每个人把振幅调到亚感觉水平、用运动分析系统记录、按对随机化控制顺序,任何一环没做好效应就会被混杂。而这七百多段位移让后来的人不必重做实验就能检验结论、比较指标、教学方法。这类档案的价值与大小无关,与保存的完整性有关。

另一层原因是它的格式足够笨。两列纯文本在任何年代都能读,不依赖任何专有软件,也不会因为工具链换代而失效。二〇〇四年的人能读,二〇二六年的人也能读。二十余年只有一次补录校验和,说明它没被改写过——这对需要长期引用的档案是一种优点。

§8 生态位与历史

8.1 历史沿革

这个库的来历要追到九十年代末波士顿大学那间做非线性动力学的实验室。Collins 与同事在那几年把随机共振从物理系统推进到生物感知系统,提出"给感觉通道加噪声可以改善功能"的假设,并在机械感受器与人体姿态控制上做了系列验证。振动鞋垫是这条线上最"可工程化"的一个产物:噪声源是现成的白噪声发生器,作用点是现成的压力感受器,输出是现成的身体位移。

二〇〇三年《柳叶刀》那封通信是这个方向的标志性发表。它的写法很像那个年代的临床期刊通信:短、直接、只报主要结论。全文的样本量是二十七人,与本库一致。

二〇〇四年 PhysioNet 把原始记录收进库,赋予了它一个可长期引用的入口与 DOI。此后这个库没有更新,直到二〇一九年平台统一补录校验和。

阶段 时期 特征 遗留物
方法孕育 九十年代末 随机共振从物理转向生物感知 系列论文与装置原型
标志发表 二〇〇三年 《柳叶刀》通信,二十七人 PMID 14550702
入库固化 二〇〇四年 原始记录进入 PhysioNet 本库 v1.0.0
冻结维护 二〇〇五至二〇一八年 无更版、无勘误 版本号停在 1.0.0
平台补录 二〇一九年 统一补 SHA256 校验和 SHA256SUMS.txt

8.2 与同类小型专项库的共同命运

二〇〇四年前后,PhysioNet 收录了一批这样的小库:一位或几位作者、一个明确的问题、一份原始记录、一篇配套论文、一个版本号。它们都没有标准标记、没有划分、没有榜单,因此长不成基准,但也没消失,而是转成了教学素材、方法复现与新工具的调试数据。

这类库的命运分岔点在二〇一〇年前后。那之后平台开始收编带明确评测协议的挑战赛数据,标准化程度提高,小库的数量占比下降。留下来的小库多半有一个共同点:它们保存的效应足够独特,以至于即使没有基准地位也仍会被引用。本库属于这一类,因为"给人脚底加噪声看身体晃动如何变化"这个实验,公开的原始记录极少。

8.3 生态位:两种读法

第一种读法把它当历史标本:它是随机共振进入人体实验阶段的原始见证,读它等于读二〇〇三年那封通信的数据备份。此时它的价值与今天的分析工具无关,与是否被正确保存有关。

第二种读法把它当最小可用样本。任何要开发摆动分析流程的人,都需要一个体积极小、格式最简、标签清楚的数据来跑通管线。本库在这件事上几乎完美:六兆余、两列、一行不多。这种读法下,它的价值与样本量无关,与它的"零摩擦"有关。

两种读法互补:历史标本要求它不被改动,零摩擦要求它保持简单,两条都指向同一个维护策略——冻结。

8.4 谁在用它,用来做什么

从公开引用看得到三类使用者:随机共振与触觉研究者拿它作方法参照或对照数据;平衡与步态研究者拿它作小型验证集测试摆动指标;教学者拿它讲"实验设计如何把条件编码进数据结构"。

三类使用者都没把它当基准。这不是遗憾,是它的定位:它给的是问题的原料,不是答案。做基准需要统一标记、固定划分与公开榜单,这三样在二〇〇四年都不是平台优先事项。

§9 使用指引

9.1 三种角色的路径

不同的人打开这个库的动机不同,最短路径也不同。

角色 目标 最短路径 大概耗时
复现者 检验论文结论是否成立 整包下载,按 §5.4 做受试者级配对,与摘要的指标方向比对 一小时
方法开发者 跑通摆动指标管线 只下一个受试者,用 §5.3 读表,自定义指标 二十分钟
教学者 讲清实验设计 打开 MT1502 目录,讲 §4.4 那对试次的奇偶对应 十分钟
数据整理者 并入自有目录 用完整路径作键,见 §7.3 的编码偏差 半天
模型训练者 训一个时序模型 不建议以此为主数据,见 §1.6 不适用
临床研究者 找老年人平衡的参照 不建议,见 §1.6 的第二条 不适用

9.2 一条最短的可用流程

从零到一个能说出口的结论,下面五步够用。

#-- 一、下载与解压,注意校验和要在解压目录里跑
wget -q https://physionet.org/files/nesfdb/1.0.0/nesfdb.tar.gz
tar -xzf nesfdb.tar.gz
wget -q https://physionet.org/files/nesfdb/1.0.0/SHA256SUMS.txt
sha256sum -c SHA256SUMS.txt --ignore-missing | grep -c OK
#-- 二、枚举全库,确认 780 段与每人片段数
import os

n = 0
per = {}
for g in ("eh", "yng"):
    for s in sorted(os.listdir(g)):
        d = os.path.join(g, s)
        if not os.path.isdir(d):
            continue
        c = sum(len([f for f in os.listdir(os.path.join(d, k)) if f.endswith(".txt")])
                for k in ("NULL", "STIM"))
        per[f"{g}/{s}"] = c
        n += c
print(f"片段合计 {n},受试者 {len(per)},每人片段数集合 {sorted(set(per.values()))}")
#-- 三、算受试者级效应,配对保留
import os
import numpy as np

eff = {}
for g in ("eh", "yng"):
    for s in sorted(os.listdir(g)):
        d = os.path.join(g, s)
        if not os.path.isdir(d):
            continue
        m = {}
        for k in ("NULL", "STIM"):
            vs = []
            for f in sorted(os.listdir(os.path.join(d, k))):
                if f.endswith(".txt"):
                    a = np.loadtxt(os.path.join(d, k, f))
                    a = a - a.mean(axis=0)
                    vs.append(float(np.sqrt(np.mean((a ** 2).sum(axis=1)))))
            m[k] = float(np.mean(vs))
        eff[f"{g}/{s}"] = m["NULL"] - m["STIM"]
print(f"受试者数 {len(eff)},正效应人数 {sum(v > 0 for v in eff.values())}")
#-- 四、按组汇总,别把片段当样本
import numpy as np

for g in ("eh", "yng"):
    v = np.array([x for k, x in eff.items() if k.startswith(g + "/")])
    print(f"{g}: n={len(v)} 均值={v.mean():.4f} 组内标准差={v.std(ddof=1):.4f}")
#-- 五、换一个指标复算,看结论是否稳健
#-- 这里换成路径长度(相邻采样点欧氏距离之和)
import os
import numpy as np

def path_len(a):
    return float(np.sum(np.sqrt(((a[1:] - a[:-1]) ** 2).sum(axis=1))))

alt = {}
for g in ("eh", "yng"):
    for s in sorted(os.listdir(g)):
        d = os.path.join(g, s)
        if not os.path.isdir(d):
            continue
        m = {}
        for k in ("NULL", "STIM"):
            vs = [path_len(np.loadtxt(os.path.join(d, k, f)))
                  for f in sorted(os.listdir(os.path.join(d, k))) if f.endswith(".txt")]
            m[k] = float(np.mean(vs))
        alt[f"{g}/{s}"] = m["NULL"] - m["STIM"]

agree = sum((alt[k] > 0) == (eff[k] > 0) for k in eff)
print(f"两个指标方向一致的人数 {agree} / {len(eff)}")

第五步最有价值。只用一种指标时,结论很可能是指标本身的性质——均方根半径对缓慢漂移敏感、路径长度对高频抖动敏感。两个指标方向一致的人数,比任何单指标均值都更能说明效应是否稳健。

9.3 引用方式

官方要求在引用本库时引用原始论文与平台两条。论文那一条是 Priplata AA、Niemi JB、Harry JD、Lipsitz LA、Collins JJ 发表于二〇〇三年《柳叶刀》第三六二卷第一一二三至一一二四页的通信,DOI 为 10.1016/S0140-6736(03)14470-4,PMID 14550702。平台那一条按 PhysioNet 现行建议引用其平台综述。

数据本身建议写到版本级:名称、版本号 1.0.0、DOI 10.13026/C21S3G、访问日期。ODC-BY 1.0 允许商用与再分发,义务是署名。若做过再加工(重采样、换指标、重新切段),应在方法里写明步骤,因为它们会改变他人复现的结果。

§10 AI 使用声明

项目 声明
文本生成 本文由 AI 辅助撰写,编辑负责结构与事实核对
数字来源 规模、结构、边界三类数字取自 PhysioNet 官方页面与官方文件目录
文件核验 目录树与片段数经直接访问确认;单段内容经首末行核对
口径处理 测试时长口径差异已在 §3.5 并列呈现,不作判断
论文信息 仅参考 Europe PMC 返回的摘要,未读全文
未核验内容 全部七百八十段的逐段内容、性别构成、采集年月、符号约定
图像 无配图;封面为生成式提示词,不含真实数据曲线
免责 本文不构成任何临床或工程建议;使用须遵守 ODC-BY 1.0 署名条款

常见误读(避坑清单)

说法 实际 证据
「它是一个脑电或心电数据集」 只有两列身体位移,无任何电生理通道 官方 Data Description 首段只描述位移
「它是多导联生理信号」 两列,左右与前后 文件为两列文本
「缩写 NESFDB 是六个词的首字母」 四个实词首字母加 D 标题为 Noise Enhancement of Sensorimotor Function
「它有几百名受试者」 二十七人 官方写十五加十二,摘要写二十七
「每人有几十个片段」 老年十段、青年二十段 目录计数
「每段几分钟」 三十秒 一千八百行除以六十赫兹
「它有力台与压力中心数据」 没有,只有肩部标记位移 官方正文仅描述 Vicon 标记
「它是一段长时间连续记录」 切好的三十秒试次,无原始连续流 官方说明 each file contains one trial
「刺激是强烈可感的振动」 亚感觉强度,先调至刚可感再降一成 官方写 subsensory 与 reduced by 10%
「它有官方训练测试划分」 无划分、无基线、无榜单 官方页面无相关内容

FAQ

Q1:NESFDB 的全名与缩写分别是什么?
全名是 Noise Enhancement of Sensorimotor Function,官方页面以这个全名作标题,slug 取名 nesfdb。缩写取四个实词首字母加一个 D——N 来自 Noise、E 来自 Enhancement、S 来自 Sensorimotor、F 来自 Function,末位 D 指 Database。因此它不是严格逐字母展开的缩略词:中间的 of 被省略,末位 D 也不对应标题里的任何一个词。

Q2:它记录的是脑电还是身体运动?
是身体运动。全部信号只有两列,取自置于肩部的一枚反光标记,由 Vicon 系统追踪左右与前后两个方向的位移,再除以标记高度。库里没有任何电生理通道。

Q3:一个受试者有多少个文件?
老年组每人十个,两个条件子目录各五个三十秒片段,净测量一百五十秒。青年组每人二十个,各十个,净测量三百秒。差额来自官方描述的测试总时长不同。

Q4:能不能直接训练平衡预测模型?
能,但样本单位是二十七个人,不是七百八十个片段。片段只是重复测量,不增加独立人数。现实用法是把它当小样本复现材料与流程调试素材。

Q5:许可允许商用吗?
允许。ODC-BY 1.0 允许商业使用、再分发与改编,唯一义务是署名。做了再加工应在方法里写明步骤。

Q6:文件为什么没有表头?
官方只提供纯数值,字段含义写在正文散文里。第一列是左右位移,第二列是前后位移,均按标记高度归一化。时间轴要靠六十赫兹与行号推算。

Q7:为什么对照段序号全是奇数?
因为试次按对随机化:每一对相邻试次里一个给噪声一个不给,随机的是对内的先后。所以一奇一偶为一对。若出现连续两个奇数,说明该受试者的片段有缺失或重新编号。

Q8:位移的单位是什么?
归一化后的位移量,原始应为长度除以标记高度。官方没有给出换算后的绝对单位,也没有给受试者身高,因此无法还原成厘米。

Q9:能不能把两个组混在一起做统计?
不建议直接混。两组每人片段数不同(十对二十),直接池化会让人数加权偏向青年组。正确做法是先到受试者层再到组层,或只取每组前五个片段对齐。

Q10:它和其他平衡库能合并吗?
指标层面可以对照,数据层面不能直接合并。字段、采样率、信号类型(肩部位移对压力中心)都不同,任何合并都需要先建立映射并写明假设。

Q11:为什么版本停在 1.0.0 二十多年?
因为它是实验档案而非持续生产线。格式足够简单,二十年来不需要改动;二〇一九年只补录了校验和。这对需要长期引用的数据是优点,不会出现静默改版。

Q12:论文里说的效应,我能在库里复算出来吗?
可以复算到组层面,前提是自己实现摆动指标。摘要把结论概括成了指标方向,但没给计算方法细节,所以复算结果与论文数值不会逐一相等,方向一致即可作为支持。

术语表

术语 英文 在本库中的含义
姿势摇摆 postural sway 静止站立时身体在水平方向上的缓慢摆动
左右方向 mediolateral 文件第一列,身体侧向位移
前后方向 anteroposterior 文件第二列,身体前后位移
归一化位移 normalized displacement 位移除以肩部标记高度后的量
随机共振 stochastic resonance 适量噪声使弱信号更易被检测的现象
亚感觉刺激 subsensory stimulation 低于意识觉察阈值的刺激
触觉振动器 tactor 鞋垫内驱动振动的元件
白噪声 white noise 功率谱平坦的随机信号,此处经一百赫兹低通
试次 trial 一次三十秒的静止站立记录
配对随机化 pairwise randomization 每对试次一中一照,对内顺序随机
条件子目录 STIM / NULL 有振动与无振动两个目录
采样率 sampling rate 每秒六十个采样点
反光标记 reflective marker 贴于肩部、被运动分析系统追踪的标记
运动分析系统 motion analysis system 本库使用 Vicon
均方根半径 RMS radius 常用的摆动幅度指标
路径长度 path length 相邻采样点位移累加,反映摆动总量
摆动面积 sway area 位移轨迹围出的区域面积
配对检验 paired test 保留受试者内配对结构的检验
伪重复 pseudoreplication 把重复测量当独立样本造成的夸大
效应量 effect size 刺激段与对照段的差值
实验档案 experimental archive 保存原始记录以支持长期复现的数据集
零摩擦 zero friction 下载即可用、无需转换的状态

附录 A:核心数字核对表

项 值 来源 来源层级
受试者总数 27 官方正文(十五加十二) 官方页面
青年受试者 15 官方正文 官方页面
老年受试者 12 官方正文 官方页面
青年平均年龄 23 岁 官方正文 官方页面
老年平均年龄 73 岁 官方正文 官方页面
片段总数 780 目录计数 文件结构
老年每人片段 10 目录计数 文件结构
青年每人片段 20 目录计数 文件结构
单段行数 1800 首末行核对 文件结构
单段时长 30 秒 官方正文 官方页面
采样率 60 Hz 官方正文 官方页面
全库行数 两万八千余 780 乘 1800 推算
滤波截止 100 Hz 官方正文 官方页面
青年测试时长 10 分钟 官方正文 官方页面
老年测试时长 5 分钟 官方正文 官方页面
中途休息 2 分钟 官方正文 官方页面
解压体积 32.2 MB 官方文件页 官方页面
压缩包体积 6.2 MB 文件头 文件结构
版本号 1.0.0 官方版本页 官方页面
发布日期 2004-10-29 官方版本页 官方页面
DOI 10.13026/C21S3G 官方页面 官方页面
许可 ODC-BY 1.0 官方页面 官方页面
论文 PMID 14550702 Europe PMC 论文摘要

附录 B:数字的来源分层

层级 含义 本库中的例子 可信度
官方页面 官方 Data Description 与文件页原文 二十七人、六十赫兹、三十秒、一百赫兹、亚感觉 最高
文件结构 目录名、文件名、行数可逐项核对 780 段、10 与 20、1800 行 高
推算 由前两层相乘或相除得到 全库行数、全库数字个数、累计 6.5 小时 中
论文摘要 Europe PMC 返回的摘要 二十七名参与者、七个与全部指标下降 中
未核实 官方与摘要均未提供 性别构成、身高体重、采集年月、符号约定 低

凡正文里出现"官方未说明""无法确认"的地方,都落在最后一层。这一层的空白不是缺陷,是二〇〇四年那批小型专项库的普遍形态;标出来是为了让后续使用者不必重走确认流程。

附录 C:完整参考文献

编号 文献 链接 用途
1 Noise Enhancement of Sensorimotor Function v1.0.0 https://physionet.org/content/nesfdb/1.0.0/ 全部规模、结构、边界信息
2 该库文件目录 https://physionet.org/files/nesfdb/1.0.0/ 目录树、体积、校验和
3 整包 tar.gz https://physionet.org/files/nesfdb/1.0.0/nesfdb.tar.gz 下载入口
4 Priplata AA 等,Lancet 2003;362:1123-1124 https://doi.org/10.1016/S0140-6736(03)14470-4 实验动机与结论
5 同上的 Europe PMC 记录 https://europepmc.org/article/MED/14550702 摘要层面的规模与结论
6 数据集 DOI https://doi.org/10.13026/C21S3G 引用标识
7 PhysioNet 平台综述(2026) https://doi.org/10.1038/s44360-026-00096-z 托管模式与引用规范
8 ODC-BY 1.0 许可正文 https://opendatacommons.org/licenses/by/1-0/ 署名义务

附录 D:任务代码

把全库压成一张"受试者 × 条件"的效应表,这段够用。

#-- 全库扫描,输出每个受试者的配对效应与两组的汇总
import os
import numpy as np

def rms(a):
    a = a - a.mean(axis=0)
    return float(np.sqrt(np.mean((a ** 2).sum(axis=1))))

rows = []
for g in ("eh", "yng"):
    for s in sorted(os.listdir(g)):
        d = os.path.join(g, s)
        if not os.path.isdir(d):
            continue
        for k in ("NULL", "STIM"):
            vs = [rms(np.loadtxt(os.path.join(d, k, f)))
                  for f in sorted(os.listdir(os.path.join(d, k))) if f.endswith(".txt")]
            rows.append((g, s, k, float(np.mean(vs)), len(vs)))

import collections
by = collections.defaultdict(dict)
cnt = {}
for g, s, k, v, n in rows:
    by[(g, s)][k] = v
    cnt[(g, s)] = n // 2

print(f"{'组':<5}{'受试者':<9}{'对照':>10}{'刺激':>10}{'差值':>10}")
for (g, s), v in sorted(by.items()):
    print(f"{g:<5}{s:<9}{v['NULL']:>10.3f}{v['STIM']:>10.3f}{v['NULL'] - v['STIM']:>10.3f}")

for g in ("eh", "yng"):
    d = np.array([v["NULL"] - v["STIM"] for (gg, s), v in by.items() if gg == g])
    print(f"{g} 组 n={len(d)} 平均差值={d.mean():.3f} 标准差={d.std(ddof=1):.3f}")

输出是一张二十七行的表,两列数值与一列差值,末尾两行组汇总。差值为正表示该受试者刺激段摆动更小。出现负值正常,个体层面方向不一,结论看组汇总与方向一致的人数。

附录 E:如果只记五件事

第一,它是 PhysioNet 上一个小型的姿势摇摆库,二十七名健康人,全部数据只有左右与前后两列位移。

第二,它的设计比数据更值钱:噪声与对照成对随机,条件编码进 STIM 与 NULL 两个目录,试次序号的奇偶就是配对信息。

第三,规模单位是人不是片段,七百八十段只是二十七个人的重复测量,任何统计都要先到受试者层。

第四,它没有力台、没有肌电、没有患者人群、没有官方划分,这四条边界决定了它只能用于验证一个小效应与调试一条流程。

第五,许可宽松、体积六兆余、格式最简,任何年代都能打开,§4.4 的案例那两段就是最快的入门材料,这使它在二十余年后仍被引用。

编辑说明

核验时间 2026 年 10 月 28 日。核验方式:直接访问 PhysioNet 项目页与文件目录,逐层列举 eh 与 yng 下的受试者目录并核对每个人在 STIM 与 NULL 两个子目录中的片段数;取 eh/MT1502/NULL 下的首个片段核对行数、列数、分隔符与数值量级;另抽查 eh/MT1503、eh/MT1528、yng/MT1439 的片段数,确认老年组十段、青年组二十段的口径稳定。论文信息仅取 Europe PMC 摘要。未覆盖:全部七百八十段的逐段内容、逐人年龄、性别构成、采集年月、列方向的正负约定。关于受试者编号前两位为批次的说法属推断,已在 §2.6 标注。测试时长口径的差额按官方文字与文件结构并列呈现,不作判断。


相关数据集导航

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

  • ppg-dalia — 共享标签:生理信号 / 步态与运动 / 可穿戴传感
  • culm — 共享标签:生理信号 / 步态与运动 / 可穿戴传感
  • multi-gait-posture — 共享标签:生理信号 / 步态与运动 / 可穿戴传感
  • wearable-device-dataset — 共享标签:生理信号 / 步态与运动 / 可穿戴传感
  • semg-gait-31subjects — 共享标签:生理信号 / 步态与运动 / 可穿戴传感
  • pamap2 — 共享标签:生理信号 / 步态与运动 / 可穿戴传感
  • mhealth — 共享标签:生理信号 / 步态与运动 / 可穿戴传感
  • uci-har — 共享标签:生理信号 / 步态与运动 / 可穿戴传感
  • wearable-exercise-frailty — 共享标签:生理信号 / 步态与运动 / 可穿戴传感
  • kinecal — 共享标签:生理信号 / 步态与运动 / 可穿戴传感

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

返回 AI-Ready 数据集