信息速览
站着不动,在生理学上不是一件安静的事。重力把血液往下肢推,回心血量在几秒内下降,动脉压出现一个短暂的低谷,压力反射随即收紧血管、加快心率;与此同时,脑循环要靠自动调节把血流速度稳住,呼吸也会跟着改变深度与节律。一次主动起身,等于同时给心血管、呼吸、脑血管三个系统发了一张同一时刻的考卷。
这份数据把四张考卷收在同一条时间轴上:连续动脉血压、呼吸波形、双侧大脑中动脉血流速度、前额叶十六通道近红外光强。它的做法不是比较一群人的静息基线,而是让同一个人在三十多分钟里完成「静息—起身—坐下」,看四路信号之间的耦合关系在体位改变的那一刻如何重排。
它很小,小到只有九个人;但它把「同步」这件事做得很彻底,也因此能回答大样本静息库回答不了的问题。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 官方全名 | Two-tiered response of cardiorespiratory-cerebrovascular networks to orthostatic challenge |
| 发布方 | PhysioNet(数据来自塞梅尔维斯大学医学院) |
| 首次发布 | 2021 年 5 月 17 日,版本 1.0 |
| DOI | 10.13026/73w7-x881(最新版 10.13026/ehkk-8y70) |
| 招募人数 | 10 名健康青年(5 女、5 男) |
| 分析人数 | 9 名(1 名男性因颞窗不足排除) |
| 年龄 | 官方页面写 26.3±3.7 岁;论文分性别给 26.2±4.6 与 26.6±3.8 岁 |
| 每名受试者文件 | 1 个数据 CSV + 1 个标记 CSV |
| 记录时长 | 约 33 分钟(静息 30 分钟 + 起身 1 分钟 + 坐下 1 分钟) |
| 采样率 | 约 3 Hz(原始模拟信号先以 100 Hz 数字化) |
| 列数 | 53 列:2 路脑血流、1 路血压、1 路呼吸、48 路近红外、1 列时间戳 |
| 近红外通道 | 16 通道 × 3 波长(730、805、850 nm) |
| 设备 | Colin BP-508 张力计、DWL Multidop-T 经颅多普勒、DT9816 采集卡 |
| 体积 | 未压缩 17.8 MB,压缩包 6.6 MB |
| 许可 | 页面标注 PhysioNet Contributor Review Health Data License 1.5.0 |
| 典型用途 | 直立应激下的耦合分析、脑自动调节、压力反射、近红外运动伪迹方法 |
§1 它要解决的具体麻烦
1.1 体位改变是一个「过程」,不是两个「状态」
绝大多数生理信号库比较的是状态:睡眠与清醒、运动与静息、给药前与给药后。状态比较的前提是每段记录内部足够平稳,可以把几分钟甚至几小时压成一个特征。直立应激偏偏不是这样。起身后的头几十秒里,血压、心率、脑血流速度都在快速变化,系统从一个平衡点被推到另一个平衡点,真正有信息的是这段过渡本身。
这也解释了为什么这份数据的协议看起来「短得奇怪」:三十分钟静息只为了建立一个稳定基线,起身与坐下各一分钟只够捕捉最剧烈的重排。官方在局限性里写得很直白:坐下后的一分钟不足以达到新的稳态,因此最后的恢复过程无法完整评估。它不是一份用来描述「站着的时候是什么样」的数据,而是一份用来描述「从坐到站的那一下发生了什么」的数据。
四套系统被同一事件触发,但响应的时间尺度并不相同。血压的下降以秒计,脑血流速度的恢复以十秒计,近红外的血红蛋白变化则更慢,还混着皮肤血流与全身成分。这份数据的价值,正在于它把这几个不同尺度的响应放在同一时钟上,允许研究者去问「谁先动、谁跟着动、谁只是被动传导」。
1.2 三条常见的错误期待
第一条,把它当成倾斜台试验库。 倾斜台是电动床被动改变角度,通常分五度、十度、十五度多级,每级维持数分钟到十几分钟,用来诱发血管迷走性晕厥。这份数据是受试者自己迅速站起、自己迅速坐下,没有倾斜床,没有多级负荷,也没有晕厥诱发流程。两者的姿势终点相似,时间结构与临床用途完全不同。
第二条,把它当成现成的心率变异性与压力反射指标库。 官方只发布四路原始序列的重采样版本,没有发布逐搏间期、没有发布呼吸间期、没有发布任何频域指标。论文里用到的间期序列是在 100 Hz 原始波形上算好再降采样的,这一步没有随数据一起放出。想要心率变异性,得先解决「三赫兹的血压序列能不能可靠还原逐搏时刻」这个问题(§7.2)。
第三条,把它当成健康青年的正常参考值。 九个人、平均二十六岁、匈牙利一所医学院的学生与雇员,全部自报无神经、精神、心血管疾病,也没有直立性低血压。这是一个经过筛选的窄人群,不是人群抽样的正常参考。它的九个人更适合用来做「机制存在性」的证明,而不是用来定正常范围。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 观察起身瞬间多系统耦合如何重排 | 四路同步信号,逐人标记时刻,三十三分钟连续覆盖 | 够,而且这是它最核心的用途 |
| 研究脑自动调节的动态响应 | 双侧大脑中动脉血流速度与连续血压同步 | 可做探索,但起身伪迹段须剔除,官方也承认动态自动调节难以可靠评估 |
| 研究压力反射 | 连续血压可导出心搏间期 | 受限,CSV 无逐搏列,三赫兹分辨率偏粗 |
| 做近红外运动伪迹去除方法 | 起身与坐下带来天然的大幅运动伪迹,且有三波长 | 够,这是一个被低估的用法 |
| 训练一个多模态生理信号模型 | 九人、每人约六千余行、五十三列 | 不够做训练,够做外部验证或机制演示 |
| 估计正常人群的基线分布 | 九名健康青年,单中心 | 不够,样本量与抽样方式都不支持 |
| 复现论文里的线性与非线性耦合结果 | 原始序列齐全,方法在论文中有描述 | 部分够,预处理细节需自行补齐 |
| 做直立性低血压的筛查或诊断 | 无连续逐搏血压、无临床结局 | 不够,这不是临床筛查数据 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 你在做脑血流自动调节,手里只有静息态数据 | 提供一次真实的体位扰动,能看到血流速度与血压的相位关系在事件前后怎么变 | 先按标记文件切段,剔除起身后头几十秒的伪迹,再做传递函数估计 |
| 你在开发近红外运动伪迹去除算法,缺带真值的事件 | 起身与坐下是天然的事件标记,三波长与十六通道足以检验多通道方法 | 用短时傅里叶或小波定位伪迹,比较去除前后耦合强度的变化 |
| 你在做网络生理学的方法学验证 | 四路信号、三十三分钟、事件清晰,适合演示相关与互信息的差异 | 用替代数据做显著性检验,别把有限样本的互信息偏高当成真实耦合 |
| 你在教自主神经生理,需要一个可讲的故事 | 一次起身把压力反射、脑自动调节、神经血管耦合串在同一条时间轴上 | 用 §4.3 的案例做课堂演示,注意先讲清楚三赫兹的局限 |
| 你在找一个小而完整的多模态数据集做管线联调 | 十七点八兆、十个人、格式就是纯 CSV,半小时能跑通 | 先跑 §5.2 的读取脚本,再决定是否值得深入 |
| 你已有大样本静息库,想补一个扰动条件 | 九个人的事件响应可以作为机制补充,而不是规模补充 | 把它当案例研究,不要与静息库混在一起做总体估计 |
1.5 一句话判断
它不是一份用来「多训几个样本」的数据,而是一把用来「看清一次体位改变如何拆开线性与非线性耦合」的窄口钳;口径很窄,但夹得住别处夹不住的那一下。
1.6 不适合谁:四条边界
不适合拿来做规模训练。 九个人、每人约六千余行,且行与行高度自相关。任何以受试者为独立样本的模型,在这里最多只有九个独立观测。深度模型会在几分钟内记住全部个体。
不适合拿来做临床诊断或筛查。 没有患者、没有结局、没有随访、没有用药记录(仅提到两名女性规律服用口服避孕药)。它的受试者是筛选过的健康青年,连直立性低血压都被排除在外。
不适合拿来做高频心率变异性。 CSV 的时间分辨率约三分之一秒,逐搏间期的量化步长太大,高频段的短时程波动会被量化噪声淹没。要算频域指标,必须回到原始一百赫兹波形,而那份波形没有公开。
不适合拿来做近红外浓度的绝对定量。 官方给的是原始光强,没有差分路径因子。不同受试者、不同通道的光强绝对值不可直接比较,跨人平均必须先做个体内标准化。
§2 数据构成与规格
2.1 一个人的数据装进两个文件
整个数据包是扁平的,没有受试者子目录,也没有 WFDB 那套头文件与二进制分离的结构。根目录下是十个数据 CSV(subj01.csv 至 subj10.csv)、十个同名标记 CSV(subj01.marker.csv 至 subj10.marker.csv),外加 README.txt、LICENSE.txt、SHA256SUMS.txt 与一张通道布局图 channel_layout.png。合计未压缩十七点八兆,压缩包六点六兆。
数据 CSV 的第一行是列名,但列名被三重引号包着,且行尾带若干空列。用常见的 CSV 读取器直接读,会得到六十三列而不是五十三列,多出来的十列全是空字符串。这不是数据错误,是导出时行尾多写了逗号。标记 CSV 则没有表头,每行两个整数或浮点数:第一个是标记码,第二个是秒数。
官方在两个位置都写明「Subject 05 was excluded due to inadequate transtemporal window」,但 1.0 版目录里仍然保留了 subj05.csv 与 subj05.marker.csv。核对文件本身可以看到,subj05.csv 的时间戳从约 36.5 秒延伸到约 1990 秒,共六千四百余行,长度与其余受试者相当;它是一份完整记录,不是空壳。比较稳妥的理解是:文件随包发布,但这名受试者没有进入论文分析。做汇总统计时,应按官方口径排除,或至少单独标注。
| 文件 | 内容 | 行数或大小 | 是否必需 |
|---|---|---|---|
subj01.csv 至 subj10.csv |
五十三列重采样信号 | 每个约一点七至一点九兆 | 是 |
subj01.marker.csv 至 subj10.marker.csv |
标记码与秒数 | 每个数十至三百余字节 | 是,切段必需 |
README.txt |
列定义、标记含义、通道说明 | 一点九千字节 | 是,先读 |
LICENSE.txt |
许可全文 | 十四点四千字节 | 是,用前读 |
SHA256SUMS.txt |
校验和 | 一点八千字节 | 建议 |
channel_layout.png |
近红外光极排布 | 二百三十五点一千字节 | 可选 |
2.2 五十三列的完整字典
列的顺序是固定的:先四路生理信号,再四十八路近红外,最后时间戳。四十八路近红外的排列不是「通道优先」,而是「通道内波长优先」:通道一的三个波长占第 5 至 7 列,通道二的三个波长占第 8 至 10 列,依此类推。波长顺序恒为 850、730、805 纳米。这个顺序在官方说明与 README 里都写了,但实际表头从第 16 列起出现错位与重复:第 16 列标成 i5_805,按位置应是通道四的 805 列;第 22 列又出现一次 i6_805。数值仍按位置排列,错的是表头。读取时不能只信列名,要按列位置与官方说明对齐;本页代码一律按位置取值。
| 列号 | 名称 | 单位 | 校准状态 | 说明 |
|---|---|---|---|---|
| 1 | right_MCA_BFV |
cm/s | 已校准 | 右侧大脑中动脉血流速度 |
| 2 | left_MCA_BFV |
cm/s | 已校准 | 左侧大脑中动脉血流速度 |
| 3 | Blood_pressure |
mmHg | 已校准 | 张力计法连续动脉血压 |
| 4 | resp_uncalibrated |
无 | 未校准 | 呼吸波形,仅保留相对形态 |
| 5、8、11 … 50 | iN_850 |
光强计数值 | 原始 | 第 N 通道 850 纳米 |
| 6、9、12 … 51 | iN_730 |
光强计数值 | 原始 | 第 N 通道 730 纳米 |
| 7、10、13 … 52 | iN_805 |
光强计数值 | 原始 | 第 N 通道 805 纳米 |
| 53 | Time |
秒 | 已对齐 | 相对记录起点的采样时刻 |
近红外的十六个通道由四个光源与十个探测器组成一个方形阵列,覆盖前额叶。论文进一步把十六个通道聚成五个感兴趣区,用于网络分析;官方数据页没有给出这五个区的具体映射,只指向通道布局图与一篇 2017 年的方法学论文。这意味着「十六通道」是发布粒度,「五区」是论文分析粒度,两者不可混用。
2.3 一条记录的完整解剖
以 subj01.csv 为例。文件共六千五百七十五行数据,第一行时间戳是 36.492 秒,最后一行是 2020.756 秒,跨度约一千九百八十四秒,也就是三十三分钟出头。标记文件里的四个零号码是 3.335、18.106、21.721、36.492,前三个落在数据开始之前,最后一个与数据首行时间戳重合,对应近红外校准阶段的四个事件;官方说浓度序列从校准完成后开始,约在第三十七秒。
标记文件里还有三个非零标记:1632.678、1920.492、1981.499,分别对应码 1、2、3。README 给出的名义时刻是一千八百秒、一千八百六十秒、一千九百二十秒、一千九百八十秒,共四个标记。两者并不一致:subj01 只有三个非零标记,且第一个比名义值早了近三分钟。这个差异不是错误,而是协议执行的自然结果——静息时长由操作者掌握,标记由人在现场按下。因此切段必须以逐人标记文件为准。
#-- 读取单个受试者,按标记切出静息、起身、坐下三段
import csv
import numpy as np
path = "subj01.csv"
with open(path, encoding="latin-1", newline="") as fh:
rows = list(csv.reader(fh))
header = [c.strip('"') for c in rows[0][:53]]
data = np.array([[float(v) for v in r[:53]] for r in rows[1:] if r[0]])
time_s = data[:, 52]
bfv_r = data[:, 0]
bfv_l = data[:, 1]
abp = data[:, 2]
resp = data[:, 3]
nirs = data[:, 4:52].reshape(len(data), 16, 3)
print(header[:4], len(data), time_s[0], time_s[-1])
markers = []
with open("subj01.marker.csv", encoding="latin-1") as fh:
for line in fh:
if line.strip():
code, sec = line.split(",")
markers.append((int(code), float(sec)))
print(markers)
#-- 依据标记码取段:非零标记之后为事件段
event_start = min(sec for code, sec in markers if code >= 2)
rest = time_s < event_start
stand = (time_s >= event_start) & (time_s < event_start + 60)
sit = time_s >= event_start + 60
print(rest.sum(), stand.sum(), sit.sum())
这段代码里有三个容易踩的点。第一,文件不是 UTF-8,列名里的特殊符号会让默认解码失败,用 Latin-1 最稳。第二,列名带三重引号,直接按字符串比较会匹配不上,要先剥引号。第三,行尾的空列必须切掉,否则整行长度对不上五十三。
2.4 协议时间轴与标记语义
协议本身只有四句话:静息三十分钟,起身一分钟,坐下再一分钟,结束。真正的复杂处在于「起身」与「坐下」都是主动动作,受试者被要求「abruptly」改变体位。主动动作带来两个后果:一是动作时刻由人控制,存在数秒抖动;二是动作本身产生肌电、电极位移与光极位移,形成大幅运动伪迹。官方在局限性里明确说,正因为如此,分析时不得不排除体位挑战的最早阶段。
| 阶段 | 名义时长 | README 名义标记 | 生理状态 | 数据可用性 |
|---|---|---|---|---|
| 近红外校准 | 约 37 秒 | 零号码若干 | 静息、设备调试 | 浓度序列尚未开始 |
| 静息 | 30 分钟 | 约 1800 秒结束 | 静息稳定状态 | 主体分析窗口 |
| 起身 | 1 分钟 | 约 1860 秒 | 主动迅速站起并维持站立 | 起始段伪迹重 |
| 坐下 | 1 分钟 | 约 1920 秒 | 主动迅速坐下并维持坐位 | 起始段伪迹重 |
| 结束 | — | 约 1980 秒 | 记录终止 | 不足以达到新稳态 |
标记码的语义在 README 里没有逐码定义,只给了四个「常规设置」的时刻。实际文件里出现的码值是 0 到 3,其中 0 用于校准与伪迹,1 至 3 对应协议节点。不同受试者的码值数量并不一致:有的只有三个非零标记,有的更多。稳妥的做法是把标记文件当作「事件候选表」,结合时间戳与信号本身判断哪一个是起身、哪一个是坐下,而不是假定码值与阶段一一对应。
2.5 与同类资源的字段差异
把这份数据放进「带脑血流的多模态生理信号」这一类,最直接的对照是同在 PhysioNet 的 mental-fnirs:同样是经颅多普勒加近红外,同样是健康青年,但那边做的是 n-back 认知任务,这边做的是体位改变;那边的近红外有四十八通道,这边只有十六通道;那边的多普勒采样率是四百赫兹,这边全部重采样到三赫兹。两者共享「神经血管耦合」这个科学主题,但一个看认知负荷,一个看直立应激。
| 维度 | 本数据 | mental-fnirs |
autonomic-aging-cardiovascular |
|---|---|---|---|
| 扰动类型 | 主动起身与坐下 | n-back 认知任务 | 无扰动,静息 |
| 受试者数 | 10 招 / 9 分析 | 14 | 1,121 |
| 近红外通道 | 16 | 48 | 无 |
| 经颅多普勒 | 双侧大脑中动脉 | 单侧或双侧,四百赫兹 | 无 |
| 连续血压 | 有 | 无 | 有 |
| 呼吸 | 有 | 无 | 有 |
| 采样率 | 约 3 Hz | 四百赫兹量级 | 一千赫兹 |
| 主要用途 | 直立应激耦合 | 工作记忆与神经血管耦合 | 衰老与自主神经 |
字段层面的差别更实际。mental-fnirs 给的是按试验分段的多个文件,段内有明确的事件对齐;这份数据给的是整段连续记录加一个旁挂的标记文件,事件对齐要自己做。autonomic-aging-cardiovascular 给的是原始采样率的长记录,适合做逐搏分析;这份数据给的是降采样后的版本,适合做慢变耦合,不适合做逐搏。三者的取舍方向不同,不能互相替代。
§3 定位:一次主动起身,四套系统的同步考卷
3.1 它属于网络生理学,而不属于某个单器官学科
这份数据的作者来自塞梅尔维斯大学医学院,核心成员长期做脑血流与网络生理学。数据本身是论文《Two-Tiered Response of Cardiorespiratory-Cerebrovascular Network to Orthostatic Challenge》的配套发布,论文 2021 年 3 月发表在 Frontiers in Physiology,数据 2021 年 5 月进入 PhysioNet。这个先后顺序说明它不是一份「先有数据、后找问题」的公开库,而是「先有一个明确的机制假设、再按假设设计采集」的实验数据。
网络生理学的核心主张是:器官系统之间的耦合关系本身携带信息,单看每个系统的均值与方差不够。要把这个主张变成可检验的命题,至少需要三样东西:多路同步信号、一个能把系统推出稳态的扰动、一个能区分线性与非线性关联的估计量。这份数据三样都齐了,代价是每一样的规模都被压到最小。
3.2 「两层」指的是线性与非线性两层耦合
标题里的 two-tiered,在论文的估计框架里对应两层耦合:一层用皮尔逊相关刻画线性同步,另一层用互信息刻画包含非线性成分的统计依赖。两层用同一批重采样序列、同一组通道对,差别只在估计量。论文摘要强调非线性层的减弱远比线性层显著,这个读法与标题相互印证;至于它是否还兼指「起身」与「坐下」两个阶段,原文没有明说,不宜替作者补足。
论文的结论可以压缩成两句话:起身之后,心肺与脑血管之间的耦合显著减弱,并且这种减弱一直持续到坐下之后;减弱的幅度在非线性层远大于线性层。换句话说,线性相关还勉强维持着,非线性耦合先散掉了。这个结论之所以值得单独发一份数据,是因为它无法从任何单路信号的均值变化里读出来——血压可以回到原水平,耦合结构却已经换了一层。
| 层次 | 估计量 | 捕捉什么 | 对样本量的要求 | 起身后的表现 |
|---|---|---|---|---|
| 线性层 | 皮尔逊相关系数 | 同向或反向的线性同步 | 较低 | 减弱,但幅度有限 |
| 非线性层 | 互信息 | 任何统计依赖,含非线性 | 较高 | 显著减弱,持续到坐下 |
| 显著性 | 替代数据 | 排除有限样本造成的虚高 | 需要足够长的序列 | 逐对检验 |
| 空间聚合 | 五区平均 | 降低通道噪声 | 依赖通道布局 | 前额叶局部 |
这也解释了为什么作者要把信号重采样到三赫兹。互信息估计对序列长度敏感,原始一百赫兹的数据在同样时间窗里有三十倍的点,计算量与自相关结构都会变得难以处理;降到三赫兹既保留了心动与呼吸的主要频段,又把点数压到可接受范围。代价是高频段被截掉,这一点在 §7.2 会展开。
3.3 三条生理通路被压进同一段时间轴
从生理学看,起身这一刻至少有三条主要通路在同时工作,外加呼吸调制。第一条是压力反射:动脉压下降被颈动脉窦与主动脉弓的压力感受器感知,迷走张力快速撤回、交感张力上升,心率与血管阻力在数秒内调整。第二条是脑自动调节:脑灌注压波动时,小动脉通过肌源性与小血管内皮机制改变阻力,把血流速度维持在一个较窄的范围。第三条是神经血管耦合:局部神经元活动改变代谢需求,引起毛细血管与小动脉的局部扩张,近红外看到的血红蛋白变化里有一部分来自这里。
| 通路 | 感受器或触发 | 效应器 | 时间尺度 | 数据里的可见痕迹 |
|---|---|---|---|---|
| 压力反射 | 颈动脉窦、主动脉弓 | 心率、血管阻力 | 数秒 | 血压与心搏间期的相位关系 |
| 脑自动调节 | 灌注压变化 | 脑小动脉阻力 | 数秒至数十秒 | 脑血流速度对血压的传递函数 |
| 神经血管耦合 | 局部代谢需求 | 皮层微循环 | 数秒 | 近红外血红蛋白的局部变化 |
| 呼吸调制 | 胸腔压力与通气 | 静脉回流、心率 | 数秒至数十秒 | 呼吸性窦性心律不齐 |
麻烦在于,这三条通路在近红外信号里是叠加的。全身血压的波动会通过被动传导进入前额叶的光强变化,如果不把这一层去掉,所谓「神经血管耦合」就可能只是血压的倒影。论文的做法是把血压的线性贡献从血流速度与总血红蛋白里回归掉,再做耦合估计;这一步在数据包里没有对应的列,必须由使用者自己实现。官方页面在用途说明里也点了这一点:同步记录四路信号的目的之一,就是支持把全身成分从脑血流波动里剔除。
3.4 与其它直立应激范式的区别
直立应激在临床与研究里有多种做法,彼此不可互换。倾斜台用电动床被动改变角度,重力矢量是连续变化的;下体负压用负压箱把血液吸向下肢,不需要受试者主动发力;主动站立试验让受试者自己站起来,动作快、伪迹大,但最接近日常情境。这份数据属于最后一种,而且是最简化的版本:只有一次起身、一次坐下,没有重复,没有分级。
| 范式 | 体位改变方式 | 典型时长 | 主要用途 | 与本数据的差别 |
|---|---|---|---|---|
| 倾斜台试验 | 电动床被动倾斜 | 每级数分钟至十几分钟 | 晕厥诊断、自主神经功能评估 | 被动、分级、时长更长 |
| 下体负压 | 负压箱 | 数分钟至十几分钟 | 模拟出血、研究压力反射 | 无主动动作、无运动伪迹 |
| 主动站立试验 | 受试者自行站起 | 一分钟至数分钟 | 流行病学、初级保健筛查 | 本数据即此类,但只做一次 |
| 坐立试验 | 从坐到站反复 | 三十秒五次或十次 | 肌力与平衡评估 | 关注运动功能,不关注耦合 |
| 本数据 | 一次主动起身、一次主动坐下 | 各一分钟 | 多系统耦合机制 | 无对照、无重复、无分级 |
这个定位带来一个实际后果:它的结果不能直接与倾斜台文献的指标对齐。倾斜台研究常报告心率与血压的逐分钟均值、晕厥发生率、频谱指标;这份数据报告的是通道对之间的相关与互信息。两者的分析单位不同,一个是临床反应,一个是网络拓扑。
3.5 它在数据生态里的坐标
如果按「有没有脑血流」「有没有扰动」「是不是原始采样率」三个轴来摆放,这份数据的位置相当特殊:有脑血流,有扰动,但不是原始采样率。三者同时满足的公开库并不多,多数库要么有脑血流但只做静息,要么有扰动但只记录心血管。
3.6 一句定位
它是一份「机制演示级」的数据:样本小到不能做总体推断,结构完整到足以把「起身如何改变多系统耦合」这件事从头到尾演一遍。
§4 质量与特色:同步做得彻底,规模压到最小
4.1 同步链路:三个时钟怎么并成一个
多模态生理数据最难的不是采集,而是对齐。血压、多普勒、呼吸、近红外各有各的采样节奏,稍有偏差,耦合分析就会把时间错位误读成相位差。这份数据的做法是:所有模拟信号先进入同一块采集卡,以一百赫兹统一数字化;近红外以三赫兹输出光强;再用近红外的时间戳与协议标记作为共同时间基准,把多普勒、心搏间期、呼吸间期用一阶线性插值重采样到三赫兹。
| 环节 | 原始节奏 | 处理方式 | 最终形态 |
|---|---|---|---|
| 血压 | 模拟连续,100 Hz 数字化 | 保留波形,重采样 | 3 Hz 序列 |
| 多普勒 | 模拟连续,100 Hz 数字化 | 保留波形,重采样 | 3 Hz 双侧序列 |
| 呼吸 | 模拟连续,100 Hz 数字化 | 峰值检测成逐呼吸间期后重采样 | 3 Hz 序列 |
| 近红外 | 3 Hz 数字输出 | 作为时间基准 | 3 Hz 原始光强 |
| 事件 | 手动按键 | 写入 marker.csv | 秒级时间戳 |
这套链路有一个隐含前提:近红外的三赫兹时钟是准的。官方没有给出近红外设备的时钟漂移指标,也没有给出采集卡与近红外之间的硬件同步方式,只说「用对应的时间戳与标记同步」。对于三十三分钟的记录,即便时钟有千分之一量级的漂移,累积误差也在秒级;做慢变耦合够用,做毫秒级相位分析就不够。这是它作为「慢变网络」数据的设计取舍,不是缺陷。
4.2 校准状态决定了哪些列能跨人比较
四路信号的校准状态并不一致,这一点直接影响分析策略。脑血流速度与血压经过校准,单位分别是厘米每秒与毫米汞柱,可以在受试者之间比较绝对值;呼吸信号明确标注未校准,只保留相对形态;近红外是原始光强,连相对形态都要先做个体内标准化才能跨通道比较。
| 信号 | 单位 | 校准 | 可否跨人比较绝对值 | 使用前必须做什么 |
|---|---|---|---|---|
| 右脑血流速度 | cm/s | 已校准 | 可以 | 检查有无负值或缺失 |
| 左脑血流速度 | cm/s | 已校准 | 可以 | 同上 |
| 动脉血压 | mmHg | 已校准 | 可以 | 检查张力计接触不良段 |
| 呼吸 | 无 | 未校准 | 不可以 | 只做形态与间期分析 |
| 近红外光强 | 计数值 | 原始 | 不可以 | 个体内标准化或转浓度 |
血压的校准方式值得一提。它用的是张力计法,传感器阵列绑在桡动脉上,通过传感器位置与按压力度获得搏动波形,再按设备流程做校准。这种做法能连续记录逐搏波形,但对位置极敏感:受试者一动,接触压力改变,基线就会漂。起身与坐下恰好是最容易让手腕移动的动作,因此事件附近的血压段往往同时包含真实的生理变化与接触伪迹。官方建议先做伪迹去除,不是客套话。
4.3 案例:subj01 从三十六秒到两千零二十秒
把 subj01 摊开看,能得到这份数据最具体的一幅画像。记录从 36.492 秒开始,到 2020.756 秒结束,共六千五百七十五行。标记文件里的四个零号码是 3.335、18.106、21.721、36.492,前三个早于数据首行,最后一个与首行重合,对应近红外校准阶段的四个动作;之后是一长段没有标记的静息,直到 1632.678 秒出现第一个非零标记。
如果按 README 的名义时刻表理解,静息应在约一千八百秒结束,起身在约一千八百六十秒,坐下在约一千九百二十秒,结束在约一千九百八十秒。但 subj01 的三个非零标记是 1632.678、1920.492、1981.499,间隔分别是 287.8 秒与 61.0 秒。第二个间隔接近一分钟,第一个间隔接近五分钟。这与名义表对不上,也不是「起身一分钟」能解释的。
| 分段(按标记) | 起止秒 | 时长 | 与名义表的偏差 | 判读 |
|---|---|---|---|---|
| 校准段 | 3.3 至 36.5 | 33.2 秒 | 与官方约三十七秒一致 | 零号码,浓度未开始 |
| 标记一之前 | 36.5 至 1632.7 | 1596.2 秒 | 比名义静息短约三分钟 | 静息主体 |
| 标记一至二 | 1632.7 至 1920.5 | 287.8 秒 | 名义表无对应 | 含起身与站立保持 |
| 标记二至三 | 1920.5 至 1981.5 | 61.0 秒 | 接近一分钟 | 坐下段 |
| 标记三之后 | 1981.5 至 2020.8 | 39.3 秒 | 名义表无对应 | 记录收尾 |
这段解剖给出的结论不是「标记错了」,而是「标记是事件锚点,不是阶段边界」。同一个人身上,标记码与协议阶段的对应关系需要结合信号判断;不同人之间,标记数量与间隔也可能不同。§4.3 的案例因此建议:先用血压与血流速度的突变点定位起身动作,再用最近的标记做校准,而不是反过来。
具体怎么做?血压在起身瞬间通常出现一个短促的下探,随后回升;双侧血流速度会出现一个更明显的下降与恢复。把两条血流速度相加取平均,做一阶差分,取绝对值最大的时刻,通常就落在动作发生后一两秒内。这个时刻与标记的差值,可以作为该受试者的「标记延迟」,再应用到同一人的其它事件上。
#-- 用信号突变定位起身时刻,并与标记对照
import numpy as np
bfv = 0.5 * (bfv_r + bfv_l)
dt = np.median(np.diff(time_s))
smooth = np.convolve(bfv, np.ones(5) / 5, mode="same")
jump = np.abs(np.gradient(smooth, dt))
search = (time_s > 1500) & (time_s < 2000)
candidate = time_s[search][np.argmax(jump[search])]
print("signal-derived event:", round(float(candidate), 3))
print("nearest marker:", min(markers, key=lambda m: abs(m[1] - candidate)))
这段代码刻意不依赖标记码的语义,只依赖「起身会造成血流速度突变」这一生理事实。它的输出是一个秒数,与最近的标记比较,就能知道这名受试者的标记是提前、滞后还是恰好。对九个人都跑一遍,会得到九组延迟;这些延迟本身也是一个可分析的量,反映了操作者按标记的时机差异。
4.4 原始未处理:是优点,也是门槛
官方明确说数据「not preprocessed」,并给出三条处理建议:用小波滤波去除近红外运动伪迹,用频域巴特沃斯滤波器增强感兴趣的成分,用基于负相关的信号改进算法抑制全身成分。这三条建议对应三篇方法学文献,等于把预处理的选择权交给了使用者。
「未处理」对方法学研究是优点:可以公平比较不同伪迹去除算法,因为原始信号里保留了完整的伪迹形态。对应用研究是门槛:如果只是想拿它验证一个耦合指标,预处理这一关就要花掉大部分时间。§4.3 的案例里,起身段的血流速度突变既是事件定位的依据,也是必须剔除的伪迹,两者是同一段数据的两面。
4.5 论文与数据包之间的口径差
同一项研究在论文与数据页上的表述并不完全一致,使用者需要知道差异在哪里,而不是假定二者可以互相替代。最明显的是年龄:数据页写 26.3±3.7 岁,论文按性别给 26.2±4.6 与 26.6±3.8 岁,合并后的均值与标准差未必等于页面上的数字。其次是通道数:数据页说十六通道全部发布,论文说每名受试者最终保留十三至十六个通道用于分析,被剔除的是接触质量差的通道。
| 项目 | 数据页口径 | 论文口径 | 使用建议 |
|---|---|---|---|
| 年龄 | 26.3±3.7 岁 | 女 26.2±4.6,男 26.6±3.8 | 引用时注明来源 |
| 受试者 | 10 招,1 排除 | 10 招,1 排除 | 一致 |
| 近红外通道 | 16 通道全部发布 | 每人保留 13 至 16 | 分析时自行剔除坏通道 |
| 感兴趣区 | 未提 | 5 区 | 需要空间聚合时按论文 |
| 采样率 | 约 3 Hz | 3 Hz | 一致 |
| 时长 | 33 分钟 | 30 + 1 + 1 分钟 | 一致 |
还有一处更隐蔽的差异:数据页说「重采样至约三赫兹」,实际 subj01 的采样间隔中位数略小于三分之一秒,整段六千五百七十五行除以一千九百八十四秒,得到约三点三赫兹。这不影响慢变耦合,但会让按「三赫兹」写死索引的代码出现累积偏移。稳妥的写法是用时间戳插值,而不是用行号乘以固定步长。
4.6 可复现性检查清单
把这份数据用到自己的分析里之前,有八件事值得逐条确认。它们不涉及复杂方法,只涉及「有没有看错文件」。
| 检查项 | 正确做法 | 常见错误 |
|---|---|---|
| 编码 | 以 Latin-1 读取 | 用 UTF-8 报解码错 |
| 列数 | 取前五十三列 | 把行尾空列也算进去 |
| 列名 | 剥三重引号 | 直接按带引号字符串匹配 |
| 受试者 | 排除 subj05 或单独标注 |
把已排除的受试者算进汇总 |
| 切段 | 用逐人 marker.csv | 用 README 名义秒数 |
| 采样 | 用时间戳插值 | 用行号乘固定步长 |
| 近红外 | 个体内标准化 | 跨人直接平均光强 |
| 许可 | 读 LICENSE.txt | 只看页面标签 |
这八条里,前四条是格式问题,后四条是口径问题。格式问题会在第一次读取时报错,容易发现;口径问题不会报错,只会让结果安静地偏掉。§4.3 的案例之所以值得反复回指,就是因为它同时暴露了格式与口径两类问题。
§5 怎么拿到:三个入口与一条最短路径
5.1 三个入口,一个目录
PhysioNet 为这个项目提供了三种取数方式:网页逐文件下载、整包压缩、以及无需凭证的对象存储同步。三者的内容完全一致,差别只在是否可断点续传、是否便于脚本化。官方给出的压缩包是六点六兆,解压后十七点八兆;目录里最大的文件是单个受试者的 CSV,约一点九兆。
目录结构没有层级,所有文件都在根下。这对脚本是好事:不需要递归遍历,也不需要解析受试者子目录。对人是坏事:十个数据文件与十个标记文件混在一起,按文件名排序时 subj01.csv 与 subj01.marker.csv 会相邻,容易在批量循环里把标记文件也当成数据文件读进去。
5.2 最短的下载与校验
下面这段命令只做三件事:递归取回整个 1.0 目录、保留时间戳、用官方校验和核对完整性。它不依赖浏览器,也不需要在 PhysioNet 注册。数据是开放获取的,但许可不是公有领域,下载不等于可以任意使用。
#-- 取回 1.0 版全部文件,保留目录结构与时间戳
mkdir -p data/cardioresp
cd data/cardioresp
wget -r -N -c -np -nH --cut-dirs=3 \
https://physionet.org/files/cardioresp-response-orthostat/1.0/
#-- 核对官方 SHA256,任何一行 FAILED 都说明文件不完整
sha256sum -c SHA256SUMS.txt
#-- 确认受试者文件数量:应为 10 个数据文件与 10 个标记文件
ls -1 subj*.csv | grep -v marker | wc -l
ls -1 subj*.marker.csv | wc -l
如果只想先试一个人,把 wget 换成单文件请求即可。subj01.csv 约一点九兆,几秒钟就能下完;配对的 subj01.marker.csv 只有一百二十六字节,别漏掉。只下数据不下标记,后面切段会立刻卡住。
5.3 读进来:绕开三个格式坑
这份 CSV 的三个格式特征会让默认读取失败:Latin-1 编码、三重引号列名、行尾空列。下面的读法把三者一次处理掉,并把四十八列近红外重排成「时间 × 通道 × 波长」的三维数组,方便后续按通道或按波长聚合。
#-- 稳健读取:处理编码、引号与行尾空列,并重排近红外
import csv
import numpy as np
def load_subject(path, n_cols=53):
with open(path, encoding="latin-1", newline="") as fh:
rows = list(csv.reader(fh))
header = [c.strip().strip('"') for c in rows[0][:n_cols]]
values = np.array([[float(v) for v in r[:n_cols]] for r in rows[1:] if r[0]])
out = {
"header": header,
"time_s": values[:, 52],
"bfv_right": values[:, 0],
"bfv_left": values[:, 1],
"abp": values[:, 2],
"resp": values[:, 3],
"nirs": values[:, 4:52].reshape(len(values), 16, 3),
}
return out
subj = load_subject("subj01.csv")
print(subj["nirs"].shape, subj["time_s"][0], subj["time_s"][-1])
print(subj["header"][4:10])
读完之后应先做一次一致性检查:时间戳是否单调递增、相邻间隔是否稳定、四路信号有没有整段常量(张力计脱落的典型表现)、近红外有没有负值(光强不应为负)。这些检查不改变数据,只决定要不要把某个受试者或某一段排除。
5.4 重采样到均匀网格
官方已经给了三赫兹序列,但实际间隔略有抖动。做频谱或互信息之前,最好先插值到严格均匀的网格,否则滤波器的频率响应会失真。下面的写法用线性插值,与官方的 interp1 口径一致;如果要做更平滑的频谱,可以换三次样条,但要在方法里写明。
#-- 插值到严格均匀的三赫兹网格,保持与官方一致的一阶线性口径
import numpy as np
def uniform_grid(time_s, signals, fs=3.0):
t0, t1 = time_s[0], time_s[-1]
grid = np.arange(t0, t1, 1.0 / fs)
out = {name: np.interp(grid, time_s, arr) for name, arr in signals.items()}
return grid, out
grid, sig = uniform_grid(
subj["time_s"],
{
"bfv_right": subj["bfv_right"],
"bfv_left": subj["bfv_left"],
"abp": subj["abp"],
"resp": subj["resp"],
},
)
print(len(grid), grid[0], grid[-1], 1.0 / np.median(np.diff(grid)))
插值有一个副作用:它会把原始信号里的高频噪声抹平,也会在缺口处凭空造出直线。如果某个受试者中间有一段信号丢失,线性插值会把两端直接连起来,形成一段虚假的平稳。读数据时先看时间戳有没有跳变,比事后补救更可靠。
5.5 估计耦合:先线性,再非线性
耦合估计的最小可用流程是:按事件切段、按频段滤波、逐对算相关、再用互信息补上非线性部分。下面的代码只算一对信号,但结构可以直接扩展到十六个近红外通道与四路生理信号的所有组合。注意互信息的绝对值受分箱数与样本长度影响,跨受试者比较时必须用同一套参数。
#-- 单对信号的线性相关与互信息,附替代数据显著性
import numpy as np
from scipy.signal import butter, filtfilt
from scipy.stats import pearsonr
from sklearn.metrics import mutual_info_score
def bandpass(x, fs, low=0.02, high=0.4, order=5):
b, a = butter(order, [low / (fs / 2), high / (fs / 2)], btype="band")
return filtfilt(b, a, x)
def mi_bits(x, y, bins=8):
xb = np.digitize(x, np.quantile(x, np.linspace(0, 1, bins + 1)[1:-1]))
yb = np.digitize(y, np.quantile(y, np.linspace(0, 1, bins + 1)[1:-1]))
return mutual_info_score(xb, yb) / np.log(2)
fs = 3.0
mask = (grid > 200) & (grid < 1500)
x = bandpass(sig["abp"][mask], fs)
y = bandpass(sig["bfv_right"][mask], fs)
r, p = pearsonr(x, y)
observed = mi_bits(x, y)
rng = np.random.default_rng(42)
null = np.array([mi_bits(x, rng.permutation(y)) for _ in range(200)])
print("pearson", round(r, 4), "p", p)
print("mi", round(observed, 4), "surrogate p", (null >= observed).mean())
这段代码里的 mask 用绝对秒数取静息段,是为了演示;实际使用时应按 §4.3 的案例,用逐人标记定位事件,再取事件之前的稳定窗口。替代数据用的是简单打乱,会破坏自相关结构,得到的零分布偏窄,p 值偏小;更严格的做法是相位随机化或保留自相关的块打乱。这里保留简单版本,是为了让第一次跑通不被方法细节卡住。
5.6 接口层面的四个坑
| 坑 | 表现 | 处理 |
|---|---|---|
| 编码 | UnicodeDecodeError |
以 Latin-1 读取 |
| 列数 | 读出六十三列,后十列为空 | 只取前五十三列 |
| 标记文件无表头 | 第一行被当成数据 | 逐行解析,不跳过首行 |
| 目录扁平 | 批量循环把 marker 当数据 | 用 marker 子串排除 |
这四个坑都不涉及生理学,却足以让第一次上手的人卡半天。它们的共同点是「关键信息在,但不够显眼」:编码没提,列数只说五十三,标记文件只说「further details are provided in the data_info file」,而那个文件在 1.0 目录里并不存在。README 实际上承担了 data_info 的角色,只是名字不同。
§6 与库内条目的关系
6.1 关系图谱:它补的是「扰动 + 脑血流」这一格
库内与它最近的六个词条,分别在「扰动类型」「信号模态」「人群规模」三个轴上与它错开。把它们放在一张表里,比逐个罗列更清楚。
| 词条 | 核心资源 | 与它的共同点 | 关键区隔 |
|---|---|---|---|
autonomic-aging-cardiovascular |
1,121 名健康志愿者,静息心电加连续血压,一千赫兹 | 都关注自主神经与心血管耦合,都用连续血压 | 那边是静息、大样本、跨年龄;这边是扰动、九人、单年龄段,且多了脑血流与近红外 |
mental-fnirs |
14 名健康青年,n-back 任务,经颅多普勒加四十八通道近红外 | 都是多普勒加近红外的双模态脑血流数据 | 那边扰动是认知负荷,这边是体位改变;那边通道多、采样率高,这边通道少、采样率低 |
propofol-anesthesia-dynamics |
9 名健康志愿者,丙泊酚靶控输注,逐拍心率变异性与皮电 | 都是九人量级的健康志愿者扰动实验 | 那边扰动是药物,记录自主神经与意识;这边扰动是体位,记录心肺脑耦合 |
pulsedb |
无袖带血压估计的大型波形库 | 都含连续血压 | 那边为血压估计算法设计,有袖带参考;这边血压只是耦合分析的一路输入 |
bpssrat |
大鼠逐搏血压 | 都关注压力反射 | 物种不同,且无脑血流与近红外 |
neurocritical-pediatric |
儿童神经重症的颅内压与脑血流 | 都含脑血流 | 那边是患者、有创监测;这边是健康青年、无创 |
与 autonomic-aging-cardiovascular 的区隔值得单独说一句。那份数据回答的是「自主神经功能随年龄怎么变」,样本横跨十五个年龄组,记录是静息、长时程、原始采样率;这份数据回答的是「一次体位改变如何重排多系统耦合」,样本只有九名青年,记录是扰动、短时程、降采样。前者可以估计总体趋势,后者只能演示机制。把两者混在一起做「年龄 × 扰动」的分析,会同时失去前者的代表性样本与后者的事件精度。
与 mental-fnirs 的区隔则在任务。两者都用经颅多普勒看大脑中动脉、都用近红外看前额叶,但一个把扰动做成工作记忆负荷,一个把扰动做成重力。认知任务的事件是离散的、可重复的、每次几十秒;体位改变的事件是单次的、不可重复的、持续一分钟。这决定了两者的分析单位不同:那边可以按试次平均,这边只能按人比较事件前后。
6.2 检索路径:从标签、DOI 与设备找到它
| 检索方式 | 具体路径 | 能得到什么 |
|---|---|---|
| 按标签 | 生理信号 + 心血管疾病 + 神经科学 | 心血管与脑血流交叉的词条 |
| 按关键词 | 经颅多普勒、近红外、直立、耦合 | 多模态脑血流与自主神经词条 |
| 按 DOI | 10.13026/73w7-x881 | 直接定位本数据及其论文 |
| 按论文 | Frontiers in Physiology 2021;12:622569 | 引用该数据的后续研究 |
| 按设备 | DWL Multidop、Colin BP-508 | 使用同类设备的其它数据集 |
如果只想找「带脑血流的多模态数据」,从标签进比从关键词进更稳,因为「近红外」在库内既可能指脑成像,也可能指其他光学测量;「经颅多普勒」则几乎没有歧义。若想找「有体位扰动的数据」,关键词「直立」「倾斜」「orthostatic」三组都要试,因为不同词条的译法不统一。
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
在给这份数据打分之前,必须先校正一个常见的错位:它的设计目标不是「代表人群」,而是「在一个人身上把机制走通」。用大样本库的尺子量它,会得出「样本太少、结论不可推广」的结论;用机制实验的尺子量它,会得出「同步完整、事件清晰、可复现」的结论。两种评价都不算错,但只有后者与它的设计意图对齐。
这个校正会改变三件事。第一,样本量的评价标准从「能否估计总体分布」变成「能否在个体内重复观察到同一模式」。九个人不足以估计方差,但足以检查九次事件是否同向。第二,信号质量的评价标准从「采样率越高越好」变成「是否覆盖目标频段」。三赫兹对慢变耦合够用,对逐搏分析不够,这不是质量高低,是口径匹配。第三,缺失信息的评价标准从「字段越多越好」变成「缺的是否正好是结论所需」。它缺逐搏间期、缺差分路径因子,但这两样都可以从原始论文的方法里重建,只是要花功夫。
若忽略这个校正,最容易发生的误判是把「九人」当成「九百人」的缩小版,进而用参数检验的常规置信区间去报告组间差异。正确的做法是把人当作独立单位,报告逐人的效应方向与幅度,再做符号检验或 bootstrap,而不是把六千余行当成六千余个独立样本。
7.1 DAIMS 五维评分
DAIMS 在这里用作一套内部评估框架,五个维度各五分,评分依据是官方页面、README、论文方法与实际文件结构,不含主观偏好。
| 维度 | 分数 | 依据 | 扣分点 |
|---|---|---|---|
| 文档完备性 | 4 | 页面、README、论文三处互相补充,列定义清楚 | 提到的 data_info 文件在包内不存在 |
| 信号一致性 | 4 | 四路信号同源数字化,统一时间戳,逐人标记 | 标记码语义未逐码定义,时刻逐人不同 |
| 元数据完整性 | 3 | 有年龄、性别、设备、协议、伦理号 | 无身高体重、无用药明细、无通道坏点清单 |
| 可复现性 | 3 | 原始序列齐全,方法有论文描述 | 预处理与耦合估计的具体参数未随包发布 |
| 可获得性 | 5 | 开放下载,无需注册,体积小 | 许可为非商业且要求相同方式共享 |
| 合计 | 19/25 | 机制演示级数据中的中上水平 | 规模与元数据是主要短板 |
这个分数不应被理解为「质量中等」。扣分集中在文档细节、元数据与可复现性,三者都不是信号本身的质量问题;如果按机制实验的标准,文档与一致性都可以给到四分以上。
7.2 三个硬限制:样本、采样、事件
样本限制。 九名受试者意味着受试者级的自由度只有八。任何跨人比较的统计检验,功效都很低;能检出的效应必须很大。论文报告的是网络拓扑的整体变化,而不是某个通道对的细微差异,这个选择与样本量是匹配的。想在这份数据上做「某两个通道的耦合在起身后是否显著变化」的精细检验,多半会得到不稳定的结果。
采样限制。 三赫兹的奈奎斯特频率是一点五赫兹,而论文给近红外高频段的上界正好也是一点五赫兹。这意味着高频段的上沿没有任何余量,滤波器在这一点附近的响应会被折叠与衰减污染。更实际的影响在血压:三赫兹的时间分辨率约三分之一秒,逐搏间期的量化误差可达数十毫秒,短时程心率变异性里的高频成分会被这一步量化吃掉。§4.3 的案例里,血压波形的形态还能看出心搏,但要用它还原精确的逐搏时刻,精度不够。
事件限制。 起身与坐下是主动动作,伴随肌电、电极位移、光极位移与张力计接触变化。官方明确说分析时排除了体位挑战的最早阶段,理由是运动伪迹太大。这带来一个无法回避的空白:真正剧烈变化的那几秒,恰恰是最不可用的几秒。数据能告诉你「变化之后的新状态」,但对「变化进行中」的细节,覆盖是残缺的。
7.3 已知的、可枚举的偏差
选择偏差。 受试者是医学院的学生与雇员,自报无神经、精神、心血管疾病,且明确排除了直立性低血压。这是一个「能顺利完成经颅多普勒与近红外安装」的人群,颞窗不佳者已被剔除,因此连「健康青年」这个总体也不能完全代表。
性别构成偏差。 招募时是五女五男,排除一名男性后变成五女四男。论文按性别分别报告了年龄、身高、体重与体质指数,但没有按性别分层做耦合分析。用这份数据讨论性别差异,样本量不足。
单中心与单设备偏差。 全部数据来自塞梅尔维斯大学的一间实验室,使用同一台经颅多普勒、同一台张力计、同一套近红外设备与同一批操作者。设备型号、光极排布、校准流程都不可复制到另一个中心,跨中心泛化无从谈起。
时间与季节偏差。 采集窗口是 2009 年 12 月至 2010 年 2 月,北半球冬季。季节因素可能对血压与自主神经有影响,但这项研究没有跨季节对照,因此不能判断结果是否受季节调制。
协议偏差。 只有一次起身、一次坐下,没有重复测量,没有对照条件(比如假起身、被动倾斜),也没有随机化。个体内的习惯化、期待效应、操作者差异都无法与真实的体位效应分离。
处理偏差。 论文说每名受试者保留十三至十六个近红外通道,被剔除的是接触质量差的通道。数据包发布的是全部十六通道,没有给出剔除清单。使用者若直接对十六通道做平均,会把论文已经剔除的坏通道重新算进去,结果与论文不可比。
许可口径偏差。 项目页标注的许可是 PhysioNet Contributor Review Health Data License 1.5.0,而包内 LICENSE.txt 的正文是 Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International。两者都要求署名,但后者额外限制商业使用并要求相同方式共享。这是两个口径,差额的适用范围官方未说明。稳妥做法是按更严格的那个执行:非商业、署名、相同方式共享。
7.4 外部验证矩阵
这份数据本身没有多中心验证,也没有独立队列。能做的外部验证分三层:第一层是同一个人在不同时间窗内的自洽性,比如静息段前半与后半的耦合是否稳定;第二层是受试者之间的一致性,九个人是否出现同向的事件响应;第三层是跨库对照,把同一套估计量应用到 mental-fnirs 的静息段或 autonomic-aging-cardiovascular 的静息段,看基线耦合的量级是否可比。
三层里只有前两层是这份数据能独立支撑的。第三层需要另一份数据配合,而且由于采样率、通道数、设备都不同,只能比较「量级与方向」,不能比较「绝对数值」。如果一项研究声称在这份数据上发现了某个耦合指标,却没有任何跨人一致性或跨库对照,那它的结论最多是「在这九个人身上观察到」,不能上升为机制定论。
7.5 它为何能持续:稀缺的组合,而不是稀缺的规模
公开的体位扰动数据不少,公开的脑血流数据也不少,但同时具备「主动体位扰动 + 双侧大脑中动脉多普勒 + 前额叶多通道近红外 + 连续血压 + 呼吸」的,极少。要复制这套组合,需要一间能同时架设三种设备的实验室、一名能稳定找到颞窗的操作者、一套能忍受光极与腕带的受试者流程,以及一次通过伦理审查的主动站立协议。成本高、样本小、论文产出慢,这正是它长期不会被新库替代的原因。
它的引用也不是靠规模。做脑自动调节的人需要事件响应,做近红外方法的人需要真实运动伪迹,做网络生理学的人需要多系统同步,这三类需求都不要求大样本,只要求结构完整。只要这三类需求还在,九个人的数据就仍然有人用。
§8 生态位与历史
8.1 从采集到发布:十余年的间隔
数据采集于 2009 年 12 月至 2010 年 2 月,伦理批号 53/2009,由塞梅尔维斯大学区域与机构科学研究伦理委员会批准。论文 2021 年 3 月发表于 Frontiers in Physiology,数据 2021 年 5 月 17 日以 1.0 版进入 PhysioNet。采集与发布之间隔了十余年,这或许解释了两件事:为什么数据格式是朴素的 CSV 而不是 WFDB,为什么近红外的通道布局要指向 2017 年的另一篇论文。
同一时期,作者团队还发表了近红外通道布局与网络分析的方法学论文(Racz 等,2017),这份数据的十六通道布局图就转载自那篇论文的图一。换句话说,数据包不是独立设计的,而是既有方法学体系的一次应用与公开。
论文发表后有一份勘误(Frontiers in Physiology 2021;12:685417),内容是对原文的更正。引用时应以原文为准,同时留意勘误是否涉及方法或数值;数据包本身没有因勘误而更新版本。
8.2 方法学脉络:从单系统到网络
这项研究站在两条脉络的交汇处。一条是脑血流调节:经颅多普勒测大脑中动脉血流速度,配合连续血压,用传递函数或相干分析估计动态脑自动调节。另一条是网络生理学:把心率、呼吸、脑血流、组织氧合当作网络节点,用相关、互信息、格兰杰因果等估计边,观察网络拓扑在不同生理状态下的变化。
这份数据的贡献在于把第二条脉络的「扰动」做得干净:不是药物、不是睡眠剥夺、不是认知任务,而是一个所有人都经历、机制清楚、时间尺度明确的动作。起身的生理意义没有争议,争议只在如何量化多系统的响应。数据把这个争议所需的最小素材备齐了。
8.3 版本与许可:只有一个版本,但有两个许可口径
这个项目在 PhysioNet 上只有 1.0 一个版本,发布于 2021 年 5 月 17 日,DOI 为 10.13026/73w7-x881。页面同时给出「最新版 DOI」10.13026/ehkk-8y70;目录与版本列表都只有 1.0,没有发现 1.1 或 2.0。SHA256SUMS.txt 的时间戳是 2021 年 5 月 17 日,与发布日一致。
许可的两个口径已在 §7.3 说明。这里补一句实际操作建议:如果你在写论文的方法部分,引用项目页标注的 PhysioNet 许可;如果你要把数据再分发或用于产品,按包内 CC BY-NC-SA 4.0 的条款执行,因为它对商业使用与相同方式共享有更明确的约束。两个口径的并存不意味着可以任选其一,而是意味着应取交集。
8.4 生态位:小众但不可替代
在 PhysioNet 的项目列表里,它属于「小而专」的一类:没有挑战赛、没有排行榜、没有持续更新,下载量不会很高,但在特定的方法学论文里会反复出现。这类项目的生存逻辑与大型库不同,它们不靠数据量吸引人,而靠「别处拿不到的组合」被引用。
它的生态位可以用一句话概括:当一项研究需要「一个真实的、带脑血流的、有时间标记的体位扰动」时,它是少数几个可选对象之一。这个需求不常出现,但一旦出现,替代品很难找。
§9 使用指引
9.1 三种角色的路径
做机制的研究生。 先读论文的结果图,确认你要复现的是线性层还是非线性层;再从静息段取一对信号跑通相关与互信息;最后把事件段接进来,比较事件前后的变化。不要一上来就对十六个通道做全连接网络,九个人的数据撑不起那么多边。
做管线的工程师。 把它当成一个格式不规则的小型多模态包:Latin-1、三重引号、行尾空列、旁挂标记。写一个稳健的 loader,比调模型更值得花时间;loader 写对了,后面所有分析都能复用。先用 subj01 跑通,再批量跑十个人,最后决定 subj05 是否纳入;官方口径是排除,文件本身却是完整的。
做教学的老师。 它适合讲三件事:体位改变如何同时扰动三个系统、线性与非线性耦合的区别、运动伪迹为什么在事件附近必然出现。§4.3 的案例可以直接做成一张时间轴图,让学生自己找标记与信号突变点的偏差。
9.2 一条最短的可用流程
下面的脚本把「读取—滤波—事件锁定—保存」串成一条线,输出一个可以直接画图的数组。它不依赖论文里的任何私有参数,只用公开的列定义与标记文件。
#-- 端到端最小流程:读入、插值、滤波、事件锁定、落盘
import csv
import numpy as np
from scipy.signal import butter, filtfilt
def read_pair(csv_path, marker_path):
with open(csv_path, encoding="latin-1", newline="") as fh:
rows = list(csv.reader(fh))
vals = np.array([[float(v) for v in r[:53]] for r in rows[1:] if r[0]])
marks = []
with open(marker_path, encoding="latin-1") as fh:
for line in fh:
if line.strip():
code, sec = line.split(",")
marks.append((int(code), float(sec)))
return vals, marks
def prep(vals, fs=3.0):
t = vals[:, 52]
grid = np.arange(t[0], t[-1], 1.0 / fs)
abp = np.interp(grid, t, vals[:, 2])
bfv = np.interp(grid, t, 0.5 * (vals[:, 0] + vals[:, 1]))
b, a = butter(5, [0.02 / (fs / 2), 0.4 / (fs / 2)], btype="band")
return grid, filtfilt(b, a, abp), filtfilt(b, a, bfv)
vals, marks = read_pair("subj01.csv", "subj01.marker.csv")
grid, abp, bfv = prep(vals)
#-- 取中段标记作锚点,窗口覆盖起身与坐下,码值语义须按 §4.3 核对
anchor = min(sec for code, sec in marks if code >= 2)
window = (grid > anchor - 120) & (grid < anchor + 120)
np.savez("subj01_event.npz", time=grid[window], abp=abp[window], bfv=bfv[window])
print("anchor", anchor, "samples", int(window.sum()))
跑完之后,subj01_event.npz 里有事件前后各两分钟的两路信号。把它画出来,先肉眼确认起身造成的突变位置,再决定要不要扩大或缩小窗口。窗口的选择会直接影响耦合估计,先看图再定参数,比先定参数再解释结果可靠。
9.3 引用方式
使用这份数据至少要引两项:数据本身与 PhysioNet 平台。若复现的是论文结论,还应加引论文与勘误。官方给出的数据引用格式如下。
Eke, A., Mukli, P., Stylianou, O., & Hartmann, A. (2021).
Two-tiered response of cardiorespiratory-cerebrovascular networks
to orthostatic challenge (version 1.0). PhysioNet.
RRID:SCR_007345. https://doi.org/10.13026/73w7-x881
Mukli P, Nagy Z, Racz FS, Portoro I, Hartmann A, Stylianou O,
Debreczeni R, Bereczki D, Eke A. Two-Tiered Response of
Cardiorespiratory-Cerebrovascular Network to Orthostatic Challenge.
Front Physiol. 2021;12:622569. doi:10.3389/fphys.2021.622569
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
如果只在方法里提一句数据来源,也请写清版本号 1.0 与 DOI。版本号不是装饰:PhysioNet 的项目页会随平台改版而变化,DOI 才是稳定的锚点。
§10 AI 使用声明
| 项目 | 说明 |
|---|---|
| 本页性质 | 面向数据使用者的百科式说明,不是临床指南 |
| 生成方式 | 由编辑流程辅助撰写,事实以官方页面、README 与论文为准 |
| 数据边界 | 仅九名健康青年、单中心、单次体位扰动 |
| 不可用于 | 临床诊断、筛查、治疗决策、个体风险预测 |
| 统计口径 | 不提供人群分布、百分位或规范化参考值 |
| 许可提醒 | 页面标注与包内许可存在两个口径,商用前须自行核对 |
| 错误责任 | 使用方对分析结果与解释负责 |
| 更新方式 | 以 DOI 对应版本为准,页面改版不等于数据改版 |
常见误读
| 常见说法 | 实际 | 证据 |
|---|---|---|
| 这是一份倾斜台数据 | 是主动起身与主动坐下,没有倾斜床 | 官方方法段写「stand-up」「sit-down」,无倾斜角度 |
| 有十名受试者 | 招十人,九人进入分析 | 官方两处写明一名男性因颞窗不足排除 |
| 十个人就有十份可用数据 | subj05 文件完整,但该受试者被排除分析 |
官方两处写颞窗不足;该文件时长约三十三分钟 |
| 三赫兹够算心率变异性 | 逐搏间期量化太粗,高频段不可靠 | 采样间隔约三分之一秒 |
| 近红外列是血红蛋白浓度 | 是原始光强,需自备路径因子 | 官方页面写明 intensity values |
| 血压列可以跨人直接比较 | 可以,但事件段含接触伪迹 | 张力计对腕部位置敏感 |
| 标记码 1 就是起身 | 码值与阶段的对应逐人不同 | subj01 三个非零标记间隔 287.8 与 61.0 秒 |
| 数据已预处理 | 官方明确说未预处理 | 页面建议自行做小波与巴特沃斯滤波 |
| 许可是 CC BY | 页面写贡献者评审许可,包内是 CC BY-NC-SA | 两处文本不一致 |
| 九个人也能训练深度模型 | 独立样本只有九个 | 每人约六千余行高度自相关 |
FAQ
Q1:它到底是倾斜台试验还是站立试验?
都不是标准的倾斜台协议。受试者先静息三十分钟,然后自行迅速站起一分钟,再迅速坐下一分钟。没有倾斜床、没有被动体位变换、没有多级负荷,只有一次主动起身与一次主动坐下。
Q2:为什么官方说十个人,实际只有九个?
招了十名健康青年,其中一名男性缺少经颅多普勒所需的颞窗,无法稳定记录大脑中动脉血流速度,因此被排除在分析之外。官方正文与数据说明都写明十人招募、一人排除;但 1.0 版目录里仍保留 subj05.csv 与对应标记文件,做汇总时要单独排除或单独说明。
Q3:能不能直接拿它算心率变异性与压力反射敏感度?
不能直接从 CSV 算。文件里没有逐搏间期列,只有约三赫兹的血压与呼吸序列;这个时间分辨率下,逐搏间期的量化误差会盖过短时程高频成分。论文里的间期序列是在一百赫兹原始波形上导出后再重采样的,这一步没有随数据发布。
Q4:近红外列能直接当血红蛋白浓度用吗?
不能。四十八列是三个波长的原始光强,官方说可以据此计算氧合、脱氧与总血红蛋白浓度的变化,但没有附差分路径因子与消光系数表。要得到微摩尔每升的数值,需要自行设定波长相关的路径因子并做 modified Beer-Lambert 变换。
Q5:起身前后的数据该怎么切分?
按每人的 marker.csv 切,不要按 README 里的名义秒数切。标记时刻逐人不同,subj01 的第一个非零标记落在 1632.678 秒,与名义的一千八百秒相差近三分钟;照名义值切会把静息段拉长、把起身段错位。更稳的做法见 §4.3 的案例:用信号突变定位,再用标记校准。
Q6:能不能用它训练一个多模态模型?
可以训练,但不能指望泛化。九名受试者是九个独立样本,每人六千余行高度自相关;按行随机划分会把同一人的相邻时刻分到训练与测试两侧,得到虚高的指标。若一定要做,按人划分,把它当外部验证或小样本迁移的测试集。
Q7:三赫兹的采样率为什么这么低?
因为分析目标是慢变耦合,不是逐搏细节。近红外的输出本身就在三赫兹量级,把其它信号降到同一节奏,才能做逐点对齐与互信息估计。代价是高频段被截掉,这一点在 §7.2 已经说明。
Q8:为什么没有心电图?
数据包里没有心电通道,心搏间期由血压波形导出。这样少一路设备、少一套电极,受试者负担更轻;代价是无法从数据包直接得到心电波形,也无法独立校验每一次心搏的检测质量。
Q9:许可到底是哪一个?
项目页标注 PhysioNet Contributor Review Health Data License 1.5.0,包内 LICENSE.txt 的正文是 CC BY-NC-SA 4.0。两者都要求署名,后者还限制商业使用并要求相同方式共享。稳妥做法是按更严格的那个执行。
Q10:论文与本数据包有哪些口径差?
年龄的均值与标准差两处写法不同;近红外发布十六通道,论文分析时每人保留十三至十六个;其余如人数、时长、采样率基本一致。引用具体数值时注明来源,不要把两处数字混用。
术语表
| 术语 | 含义 |
|---|---|
| 直立应激 | 体位由卧或坐转为站立时,重力造成的循环扰动 |
| 压力反射 | 血压变化经压力感受器触发的心率与血管阻力调节 |
| 脑自动调节 | 灌注压波动时脑小动脉维持血流相对稳定的能力 |
| 神经血管耦合 | 局部神经活动与微循环血流之间的匹配关系 |
| 经颅多普勒 | 用低频超声穿透颅骨测量脑动脉血流速度 |
| 大脑中动脉 | 经颞窗最常被探测的脑动脉,缩写 MCA |
| 血流速度 | 多普勒频移换算出的红细胞运动速度,单位 cm/s |
| 近红外光谱 | 用近红外光穿透头皮测量皮层血红蛋白变化 |
| 光极 | 发射与接收近红外光的探头 |
| 差分路径因子 | 光在组织中实际路径与几何距离之比,缩写 DPF |
| 氧合血红蛋白 | 结合氧的血红蛋白,缩写 HbO |
| 脱氧血红蛋白 | 未结合氧的血红蛋白,缩写 HbR |
| 总血红蛋白 | 氧合与脱氧之和,缩写 HbT |
| 逐搏间期 | 相邻心搏之间的时间,常作为 RR 间期的估计 |
| 呼吸间期 | 相邻呼吸峰之间的时间,缩写 BB |
| 重采样 | 把不等间隔序列映射到统一时间网格 |
| 互信息 | 两个变量共享信息量的度量,可捕捉非线性依赖 |
| 替代数据 | 保留部分统计特性、破坏目标关系的随机序列 |
| 皮尔逊相关 | 两变量线性相关程度的度量 |
| 感兴趣区 | 把多个通道聚合成一个空间单元,缩写 ROI |
| 运动伪迹 | 身体动作造成的电极或光极位移与信号突变 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 招募人数 | 10(5 女 5 男) | 官方页面方法段 | 官方 |
| 分析人数 | 9 | 官方页面与 README | 官方 |
| 记录时长 | 约 33 分钟 | 官方摘要与数据说明 | 官方 |
| 采样率 | 约 3 Hz | 官方摘要与 README | 官方 |
| 列数 | 53 | 官方数据说明 | 官方 |
| 近红外 | 16 通道 × 3 波长 | 官方数据说明 | 官方 |
| 未压缩体积 | 17.8 MB | 官方文件页 | 官方 |
| 文件数 | 10 数据 + 10 标记 + 4 辅助 | 官方目录 | 官方 |
| 版本 DOI | 10.13026/73w7-x881 | 官方页面 | 官方 |
| 论文 | Front Physiol 2021;12:622569 | Europe PMC | 论文 |
| 许可 | 页面与包内两个口径 | 页面与 LICENSE.txt | 官方,存在冲突 |
附录 B:数字的来源分层
| 层级 | 包含哪些数字 | 本文的处理 |
|---|---|---|
| 官方页面与 README | 人数、时长、采样率、列定义、体积、DOI | 直接引用,标注版本 |
| 论文摘要与全文 | 年龄分性别统计、通道保留数、频段划分、方法细节 | 引用时注明论文口径 |
| 未核实 | 标记码逐码语义、路径因子、subj05 被排除的分析细节 |
明写未公布,不做推断 |
附录 C:完整参考文献
- Eke A, Mukli P, Stylianou O, Hartmann A. Two-tiered response of cardiorespiratory-cerebrovascular networks to orthostatic challenge (version 1.0). PhysioNet. 2021. doi:10.13026/73w7-x881.
- Mukli P, Nagy Z, Racz FS, Portoro I, Hartmann A, Stylianou O, Debreczeni R, Bereczki D, Eke A. Two-Tiered Response of Cardiorespiratory-Cerebrovascular Network to Orthostatic Challenge. Front Physiol. 2021;12:622569. doi:10.3389/fphys.2021.622569.
- Corrigendum: Two-Tiered Response of Cardiorespiratory-Cerebrovascular Network to Orthostatic Challenge. Front Physiol. 2021;12:685417. doi:10.3389/fphys.2021.685417.
- Racz FS, Mukli P, Nagy Z, Eke A. Increased prefrontal cortex connectivity during cognitive challenge assessed by fNIRS imaging. Biomed Opt Express. 2017;8(8):3842-55.
- Molavi B, Dumont GA. Wavelet-based motion artifact removal for functional near-infrared spectroscopy. Physiol Meas. 2012;33(2):259-70.
- Cui X, Bray S, Reiss AL. Functional near infrared spectroscopy signal improvement based on negative correlation. Neuroimage. 2010;49(4):3039-46.
- Pan J, Tompkins WJ. A real-time QRS detection algorithm. IEEE Trans Biomed Eng. 1985;(3):230-6.
- 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:批量体检脚本
#-- 对十个受试者做最小体检:时间单调、缺失、常量段、近红外负值
import csv
import numpy as np
report = []
for i in range(1, 11):
path = f"subj{i:02d}.csv"
with open(path, encoding="latin-1", newline="") as fh:
rows = list(csv.reader(fh))
vals = np.array([[float(v) for v in r[:53]] for r in rows[1:] if r[0]])
t = vals[:, 52]
mono = bool(np.all(np.diff(t) > 0))
flat = int(sum(np.ptp(vals[:, c]) == 0 for c in range(4)))
neg = int((vals[:, 4:52] < 0).sum())
report.append((i, len(vals), round(float(t[-1]), 1), mono, flat, neg))
for row in report:
print(row)
输出里若 mono 为假,说明时间戳有回退,插值前必须先排序;若 flat 大于零,说明某路信号整段为常量,通常是设备脱落;若 neg 很大,说明近红外通道有异常。三项都不涉及生理学,却能在分析前挡掉大部分低级错误。
附录 E:如果只记五件事
- 它是主动起身与坐下的九人实验,不是倾斜台,也不是大样本队列。
- 四路信号同步在一条时间轴上,核心用途是看耦合如何随体位改变重排。
- 三赫兹是慢变耦合的节奏,不是逐搏分析的节奏。
- 切段用逐人标记,不要用名义秒数;
subj05要单独处理。 - 许可是非商业的,且页面与包内文本不一致,商用前必须核对。
编辑说明
本页事实核对截至 2026 年 10 月 28 日,依据为 PhysioNet 项目页、1.0 版 README.txt 与 LICENSE.txt、目录清单,以及 Europe PMC 收录的论文摘要与全文。规模、结构、边界三类数字均取自上述来源;未对数据做分布统计、百分位或标签频次计算。页面标注许可与包内许可文本不一致一事,已在正文两处并列呈现,未替发布方做判断。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- cerebral-perfusion-diabetes — 共享标签:生理信号 / 心血管疾病 / 神经科学
- cves — 共享标签:生理信号 / 心血管疾病 / 神经科学
- chf2db — 共享标签:生理信号 / 心血管疾病
- cerebral-vasoreg-diabetes — 共享标签:生理信号 / 心血管疾病 / 神经科学
- emgdb — 共享标签:生理信号 / 神经科学
- sgamp — 共享标签:生理信号 / 神经科学
- tremordb — 共享标签:生理信号 / 神经科学
- phdsm — 共享标签:生理信号 / 神经科学
- c-elegans-wholebrain-calcium — 共享标签:生理信号 / 神经科学
- drosophila-wholebrain-2p — 共享标签:生理信号 / 神经科学
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

