
做fNIRS研究这些年我踩过最深的坑不是信号质量差也不是预处理参数调不明白而是找数据。导师让我做方法学验证开口就问“有没有现成的公开数据集可以跑”我愣是翻了好几天论文补充材料在OSF、GitHub、IEEE DataPort之间来回折腾。后来我才发现fNIRS公开数据集的生态虽然没有fMRI那么成熟但能用的资源其实比想象中多只是太分散了很多同学根本不知道去哪儿找更不知道拿到手之后该怎么处理。这篇博文就把我实际用过、调研过的fNIRS公开数据集整理一遍讲清楚每个资源能做什么、数据是什么格式、适合什么研究场景以及下载之后怎么顺利跑通预处理。内容面向正在做fNIRS方向的研究生、想用公开数据做预实验的课题组还有刚入门想快速上手fNIRS分析工具的同学。我不打算罗列一堆链接完事而是把我踩过的坑和验证过的路线一起写出来帮你省下几个星期的无用功。1. fNIRS数据到底长什么样先搞清三件事1.1 从信号本质到数据形态fNIRS功能性近红外光谱成像的原理说起来并不复杂用650到950纳米波段的近红外光照射头皮光线穿过皮层表面后被组织吸收和散射其中氧合血红蛋白HbO和脱氧血红蛋白HbR对不同波长光的吸收率不一样。通过检测反射回来的光强变化再套用修正的Beer-Lambert定律就能估计出脑区浅层皮层中HbO和HbR浓度的相对变化。跟fMRI相比fNIRS的时间分辨率高得多采样率通常在几赫兹到几十赫兹设备便携、对头动相对耐受特别适合婴幼儿、老年人、运动场景以及需要面对面交互的超扫描实验。但代价是空间分辨率低只能覆盖靠近颅骨的大脑皮层区域测量深度大概在1到3厘米。所以拿到一份fNIRS数据写在头文件里的往往是光强或光密度Optical DensityOD序列按通道、按时间排布而不是像fMRI那样的三维体素图像。这就是新手最容易懵的地方fNIRS数据不像结构像MRI那样打开就是一个直观的脑图像。它本质上是一张或多张二维时序表每一行是一个采样点每一列是一个测量通道。要用好公开数据集第一步不是急着预处理而是先搞明白这份数据的通道布局、采样率、事件标记存放在了哪里。1.2 公开数据集为什么重要很多课题组有设备但设备不是随时都能用很多学生想做方法学或者算法验证又没有足够的伦理审批和时间去采集一批新数据。公开数据集恰好能解决这些问题你可以用它来复现论文里的分析流程对比不同预处理管道的效果也可以拿来做机器学习分类、特征选择、领域自适应这类研究。另外fNIRS领域的数据共享风气这几年明显好起来了。OpenNeuro、OSF这些平台上都能找到不少高质量数据期刊也越来越鼓励作者把数据和代码一起公开。对审稿人和后来者来说一份组织良好的公开数据集本身就是一种学术贡献。我见过好几个同行就是因为把超扫描的数据整理上传到OSF被不少团队引用还促成了后续的合作。别觉得上传数据没技术含量把数据整理清楚这件事本身就是给领域铺路。2. 值得上手的五类公开数据集2.1 通用任务态CogPilot认知负荷数据集CogPilot是我个人认为最适合拿来练手的一个合集。它不是一个单一实验的数据而是围绕认知负荷评估整合了多个子数据集里面包含MATB多属性任务电池、N-Back、Fitts任务、模拟飞行等范式的fNIRS记录部分子集还同步了心电或心率等生理信号。数据以.mat格式为主里面是Homer可以直接识别的.nirs结构或者兼容字段这意味着你下载之后不用做太多格式转换就能直接导入Homer2或Homer3开始预处理。这个数据集的价值在于任务范式丰富。比如N-Back子集可以用来做工作记忆负荷的分类MATB子集贴近飞行和驾驶情境适合做认知疲劳研究。我第一次拿它跑通了从原始光强到GLM激活图的完整流程中间没遇到什么格式灾难对一个初学者来说相当友好。去IEEE DataPort上搜索“CogPilot”就能找到需要注册账号授权页面会列出具体的数据内容和使用协议。下载前注意看每个子集的说明文档因为不同子实验的被试人数、通道数量、采样率、任务时长都不一样最好先做好记录再批量处理。2.2 镜像容器fNIRS-Docker快速复现如果你连软件环境都还没搭好fNIRS-Docker这个项目可以直接把你拉进“开箱即用”的状态。这个项目把Homer2分析环境连同示例数据集一起封装进了Docker镜像你不需要自己在MATLAB里折腾工具箱路径也不用手动去下载各个依赖库。跑起来之后容器里自带工作目录和示例数据跟着文档做一遍就能体会到“导入数据—预处理—hrf拟合—结果可视化”的完整链路。我记得这个项目是当年很多人学习Homer2时推荐的起点。它在GitHub上能找到搜索“fNIRS Docker”就行。它的局限在于示例数据的规模和类型比较有限主要适合跑通流程、验证工具链不适合做大规模研究。更好用的方式是把它的环境当作“标准测试环境”你从其他数据集下载的数据先在这个容器里跑一遍预处理如果没问题再换到本机分析这样可以把环境差异导致的问题挡住一大半。2.3 厂商示例数据NIRx与Artinis设备厂商提供的示例数据往往是被忽视的好资源。NIRx官网的下载中心有演示数据集和样例文件覆盖了静息态、任务态、超扫描等不同采集模式文件里通常会附带采集参数说明和通道坐标。我之前为了验证MNE-NIRS的读取流程就是从NIRx的示例数据开始测的因为它的格式最规范头文件信息完整很适合拿来写解析脚本和做格式校验。Artinis也有类似的数据下载页面提供多种型号设备记录的示例数据。厂商数据的一大优势是附带的文档详细——探头的排布、光极坐标、事件标记位置都写得清清楚楚这对新手理解fNIRS头帽布局非常有帮助。缺点是这些数据往往不是为发表研究准备的通常缺乏独立被试的所有原始记录不适合做统计推断。但作为格式学习、工具调试、通道排布演示的素材它们比很多论文补充数据要好用得多因为没有缺失文件、没有乱编码、也没有损坏的标记通道。2.4 超扫描数据双人交互研究超扫描hyperscanning是fNIRS最有特色的应用方向之一因为它可以在两三个被试同时佩戴设备的情况下记录面对面交互时双方的脑活动。跟fMRI只能单人扫描不同fNIRS的超扫描生态效度高很多。但这个方向的数据特别难找因为采集成本翻倍同步和数据对齐也更复杂。我见过不少研究团队把超扫描数据传到OSF上搜索关键词可以用“fNIRS hyperscanning”“dual brain”“two-person interaction”再加上任务类型比如“cooperation”“conversation”“eye contact”。数据通常包含两个被试各自的信号文件、事件标记、以及同步时间戳。如果你要分析人际神经同步Interpersonal Neural SynchronyINS需要特别留意数据里是否包含同步信号或触发通道不然两边的数据时间轴对不齐后续相关性计算全是脏数据。从我的经验来看超扫描数据集的格式差异极大有按被试分文件的也有把两个被试放在同一个.nirs里用不同通道组区分的。下载前建议先看README弄清楚通道编号中被试A和被试B的分界在哪里再考虑怎么做通道级配对分析。2.5 平台聚合OpenNeuro与OSF/BIDSOpenNeuro是一个神经成像数据共享平台上面传统上以fMRI和MEG为主但近几年fNIRS的数据集数量也在增加。在搜索筛选条件里选择modality类型为fNIRS就能看到相关数据集。这类平台最大的好处是数据组织规范很多已经通过BIDS格式校验带有participants.tsv、task描述、事件文件等元数据配合fNIRS的BIDS扩展BEP026对应的后续规范处理起来清爽得多。OSFOpen Science Framework则是另一个宝库很多论文在正文里写了“data are available at OSF”但你要一个个找。更高效的方法是直接用Google Scholar搜文献时留意有没有OSF链接或者到OSF上搜索关键词“fNIRS”。OSF上的数据质量参差不齐有的连README都没有有的则整理得比正式论文还详细。我通常优先选择那些带有完整通道位置文件和时间事件标签的项目因为这样的数据复用成本最低。2.6 一张表看懂数据集选型数据集/资源任务类型典型规模主要格式获取方式适合场景CogPilotMATB、N-Back、Fitts、模拟飞行等多子集数十人规模.mat / .nirsIEEE DataPort认知负荷分类、Homer流程学习fNIRS-Docker示例任务数据少量数据.nirsGitHub快速搭建分析环境NIRx示例数据静息态/任务态/超扫描演示用.snirf或厂商格式NIRx官网下载中心工具验证、格式学习Artinis示例数据静息态/任务态演示用厂商格式Artinis官网通道排布、预处理测试OpenNeuro上的fNIRS数据集视具体数据集而定较完整BIDS/SnirfOpenNeuro平台规范分析、方法学研究OSF上的超扫描数据合作/对话/社交交互几十人多样OSF搜索人际神经同步研究这张表不是让你挨个把资源下载下来而是帮助你根据研究目标快速圈定范围。如果只是想学会Homer2怎么用直接上fNIRS-Docker如果是做认知负荷分类CogPilot是首选如果写代码需要干净的数据做格式解析厂商示例数据最省心。3. 数据格式与加载预处理3.1 SNIRF统一格式与BIDS扩展fNIRS早期最糟心的问题就是格式不统一每家厂商都有自己的文件后缀Homer能读的.nirs只是“事实标准”不是“正式标准”。后来社区推出了SNIRFShared Near Infrared Spectroscopy Format基于HDF5把光强、时间轴、通道布局、事件标记、元数据统一装在一个.snirf文件里。这几年新发布的公开数据集越来越多采用.snirfHomer3和MNE-NIRS都原生支持NIRx等厂商也在软件里提供导出.snirf的选项。SNIRF好在哪里拿一个具体场景举例你下载了一份数据想知道通道排列和光极距离。在旧格式里你可能要读一份单独的txt说明再手动建立映射在.snirf里这些信息直接以结构化字段存在Python里调一下就可以查看。做格式转换也有工具支持比如很多厂商SDK或者社区脚本都可以把.nirs转成.snirf。对使用者来说学会读.snirf等于掌握了一套通用的“数据打开方式”比死记各种厂商格式要高效得多。BIDS方面fNIRS对应的BIDS扩展为数据提供了统一的目录结构、命名规范、事件文件格式。如果你在OpenNeuro上下载过数据会看到诸如sub-01_task-rest_snirf.snirf、sub-01_task-rest_events.tsv这样的文件排列。这种规范化的目录结构让后续自动化分析变得非常方便循环遍历所有被试按规则读入数据和事件标签你不需要为每个数据集单独写一套路径解析代码。3.2 用Python/MNE读数据MNE-Python从0.21版本开始加入了fNIRS模块接口设计得相当顺手。假设你下载了一份.snirf格式的数据可以用下面几行代码读进来并快速看结构import mne # 读取SNIRF文件 raw mne.io.read_raw_snirf(sub-01_task-rest.snirf, preloadTrue) # 打印基本信息 print(raw.info) print(raw.ch_names) # 查看事件标记 print(raw.annotations) # 从原始光强计算光密度OD raw mne.preprocessing.nirs.optical_density(raw) # 再计算浓度变化HbO/HbR raw mne.preprocessing.nirs.beer_lambert_law(raw)如果数据是NIRx的.nirs格式也可以用read_raw_nirx读取接口类似。MNE的优势在于它的事件读取、通道类型标注、坏道标记、ICA等工具链都是现成的特别是你后续要跟EEG数据联合分析时能够直接复用同一套函数。不过要注意MNE里所谓通道名通常带“1x1”“2x3”之类的编号这并不直接等同于你统计上的“通道”编号理解通道坐标还需要加载montage信息。用MNE处理fNIRS还有一个隐藏的好处它的数据对象兼容mne.Epochs、mne.time_frequency等模块你可以直接做时频分析和GLM。如果以前用过MNE处理EEG转换到fNIRS几乎没什么额外学习成本。3.3 Homer2/Homer3的标准流水线Homer系列是fNIRS领域最经典的MATLAB工具箱Homer3是Homer2的下一代。它们的标准分析流程大致是第一步把原始光强转换成光密度第二步检测运动伪影并校正——常见做法是先用滑动窗标准差识别突变区间再用样条插值或者小波方法进行修正第三步带通滤波去除低频漂移和高频噪声很多文献采用0.01到0.1Hz的频带第四步用修正的Beer-Lambert定律计算HbO和HbR浓度变化第五步建立任务模型做block平均或一般线性模型GLM得到激活估计。对新手来说Homer系列最值得学习的是它把每一步都封装成了可配置的模块界面上能看到参数选项。但这也带来一个问题默认参数并不适用于所有数据。比如带通滤波的低频截止如果你做的是静息态功能连接分析0.01Hz以下可能存在有意义的慢波不能一刀切。运动校正的阈值参数也需要根据头动程度和信号强度调整。我见过不少学生盲目用默认参数跑完结果出来的激活图跟论文里完全相反。建议拿到一份新数据集时先挑一个被试的数据做参数敏感性测试观察每一步处理前后的信号变化再决定整套流程参数。4. 实操从下载到预处理的完整流程4.1 以CogPilot为例的6步操作我拿CogPilot里的N-Back子集做例子走一遍从下载到出结果的完整流程你可以把这个步骤推广到其他数据上。第一步去IEEE DataPort平台注册账号搜索CogPilot找到对应的项目页面仔细阅读数据描述和许可条款。需要注意的是有些子集可能只允许学术用途不能直接商用。第二步下载数据并解压建立一个工作目录。我的习惯是每个数据集建一个单独文件夹里面至少包含rawdata原始数据、derivatives处理结果、code分析脚本、README.md数据集说明。目录结构清晰能帮你省掉后面很多麻烦。第三步看一眼解压后的文件内部结构。CogPilot的典型情况是一个被试一个.mat文件里面包含类似data.s源极坐标、data.d探测器坐标、data.t时间轴、data.dod或data.dc光密度或浓度数据这样的字段。如果一看是这种结构你几乎可以确定它是按Homer的约定存的。第四步如果想用Homer3就把.mat文件整理成Homer3能直接识别的.nirs文件或者直接尝试在MATLAB里加载后补全SD结构。Homer3的GUI支持加载.snirf但旧版.nirs也很常见。第五步配置预处理流程参数。以N-Back为例我会先做一个0.01到0.1Hz的带通滤波然后做运动伪影校正。N-Back任务时间较短情绪唤醒不高头动一般不会太夸张运动校正阈值可以先用默认值再对比处理后信号。第六步运行block平均或GLM输出对比试次比如2-back减去0-back的HbO/HbR激活图。到这一步你才算真正“学会”了这份公开数据集的使用方法。整个流程核心不是命令本身而是每一步你都应该清楚数据经过了什么变换。拿到新的数据时不要急着把全部被试一次性跑完先处理一个被试并记录每一步的时间、信号幅度和峰度变化大概率会少走很多弯路。4.2 预处理参数怎么定预处理参数是fNIRS分析里最需要“因数据而异”的部分没有一套万金油。带通滤波的低频截止一般取0.01Hz用来去除仪器漂移和慢波但对于某些静息态或长时间任务0.01以下可能存在有意义的血管动力学信号需要参考原始文献的实验设计再做决定。高频截止通常取0.1Hz到0.5Hz主要为了滤掉心跳约1Hz左右和呼吸成分但要小心别滤掉任务诱发的快速血流动力学反应。运动校正的判断标准是看信号突变幅度和时间跨度。样条插值法会先标记出与其他通道差异巨大的段然后对突变区间进行插值修正。校正阈值设得太低会把正常任务诱发的信号当作伪影设得太高又可能把真正的头动伪影放过。我的建议是先绘制各通道信号随时间的曲线肉眼观察明显尖峰的位置再决定阈值。最后还要考虑是否使用短距离通道作为全局生理噪声回归变量。如果你的数据集采集了短距离通道源-探测器距离在5到15毫米之间这些通道主要记录头皮血流信号可以作为回归量放入GLM中有效去除系统性噪声。这一点很多公开数据集的说明书里不会特别强调但用于运动范式和临床样本时效果非常明显。4.3 质量检查的几个关键指标跑预处理之前一定要先做数据质量检查。我最低限度会做这几项检查检查各通道光强信号是否在合理范围超出发射器-探测器组合的饱和范围说明接触不良。检查心率成分是否可见。静息态下如果信号功率谱在1Hz左右看不出明显峰值大概率是探头脱落或者接触差。检查事件标记是否与任务时长一致。N-Back里每个刺激和反馈事件的时间戳应该能和实验脚本的触发逻辑对得上。检查被试间的通道覆盖是否一致。有些数据集中不同被试的通道编号含义可能不同如果直接大矩阵拼接结果不可信。检查方式可以用MNE画时间序列图也可以用Homer3的图形界面。关键是形成习惯任何统计结果在解释前先让数据质量过一遍脑。公开数据也不是工信得过我见过一些数据集中有被试半数通道损坏但作者没有标注如果在预处理前不做检查后面所有分析都会受影响。5. 常见问题与排查技巧实录5.1 数据加载类问题我遇到过最多的报错就是.nirs文件加载失败。原因通常是MATLAB工作目录不对或者文件路径包含中文或空格。Homer2时代对路径非常敏感目录里只要有一个中文文件夹就可能导致读取失败改成英文路径基本就能解决。MNE读取时遇到格式不兼容则更常见比如文件的元数据字段不完整报错信息通常会指向snirf格式解析出错。这时先检查文件是否真的含有nirs标签和data字段如果没有可能文件本身是旧版厂商格式需要先做一次格式转换。另一个加载问题是事件标记缺失。很多公开数据集把事件编码放在单独的events.tsv或.txt里而不在.snirf的annotation里。你在读数据后看不到任何标记不要以为是数据坏了先去看看同目录下有没有配套的事件文件手动导入并映射为MNE的Annotations或者其他格式的事件矩阵。5.2 格式与版本兼容问题Homer2、Homer3、MNE-NIRS对格式的接受范围并不完全重叠。.nirs文件在Homer3中可以读取但新版Homer3更推荐.snirf。厂商原始格式则需要特定代码或软件导出不建议直接拿主流工具箱硬读。这里有一个通用结论如果你不确定某份数据应该用什么工具处理先把数据转换成.snirf再看工具箱的兼容性因为当前主流工具都支持.snirf这是最大的“公约数”。转换时也要注意版本差异SNIRF规范本身有版本迭代旧版的.snirf在新版Homer3里可能提示字段缺失。遇到这种问题优先看工具箱官方的升级文档而不是自己猜测字段名因为这个格式有严格的规范约束手改容易造成新的错误。5.3 超扫描与多设备对齐超扫描数据的对齐问题是另一个高频难题。两台设备各自有独立的时间轴如果数据中没有记录触发脉冲或同步信号基本无法事后精确对齐。因此我在整理超扫描数据时通常会特别注意时间戳信息同一被试对的两个文件是否共享同一采样时钟事件标记里是否包含同步触发码。对于没有同步信号的数据最简单的折中做法是使用行为录像或对话音频中的语音起始时间作为粗对齐线索但只能用于秒级对齐不能用于毫秒级的神经同步分析。如果数据集有同步触发通道处理时会清爽很多读取两个raw对象后可以按触发通道的上升沿时间差进行线性插值对齐然后把两个raw对象合并成同一个MNE对象再按正常流程预处理。这个过程中最容易出错的是通道编号混淆建议一边看图一边确认通道对应关系别只信代码。5.4 快速排查表现象可能原因处理建议读取.nirs失败路径含中文或空格改成纯英文路径示例数据全是坏道光极脱落或接触不良查看原始记录笔记剔除或标记坏道事件标记为空事件另外存放在事件文件手动导入events文件HbO/HbR趋势奇特滤波参数不合适检查带通范围观察频谱超扫描时间对不上缺少同步信号用触发时间戳或行为事件对齐Homer矩阵尺寸不对通道数设置错误重新核对SD结构和通道布局这个表是拿来“速查”的实际处理时会更复杂。我自己的习惯是每下载一份数据先花半天时间把它的README、数据字典、文件结构摸清楚宁可慢一点也不要等到跑完所有被试才发现通道定义理解错了。数据和代码不一样代码错了可以马上重跑数据理解错了整批分析结果都可能作废。我个人在实际操作中最深的感受是公开数据集帮你省下的时间一半在下载和格式理解上另一半在你是否认真阅读了数据说明上。一开始我也是恨不得把下载按钮点了就赶紧跑流程结果老是卡在各种离奇错误上。后来老老实实地一步步读文档、检查结构、单被试调试反而快得多。如果你刚起步也别急着同时下好几个数据集先挑一个样本量适中、文档完整、格式规范的资源好好啃一遍把工具链和流程跑通再扩展其他数据集这是最稳的路径。