先放个结论任务态fMRI预处理没有必要去专门找一套“任务态专用工具包”DPABI SPM12 这套组合完全够用而且大部分核心算法本来就是 SPM12 提供的DPABI 更像是一个把参数串起来、批量跑并帮你省掉大量手写 batch 的调度界面。真正容易出问题的从来不是软件本身而是任务态数据在参数选择上跟静息态的那几个微妙差异。我最早自己跑任务态数据时也踩过坑按照静息态的预处理习惯顺手勾了带通滤波、顺手把全局信号回归也打开了结果一级分析里任务条件的主效应怎么都不显著后来排查半天发现是预处理把任务相关的低频成分滤掉了。那次之后我把任务态预处理的每个环节重新捋了一遍这篇笔记就是把“为什么这么填”和“实操中怎么避坑”一起整理出来主要面向第一次用 DPABI 处理任务态数据、又不想在预处理阶段埋雷的同行。1. 为什么任务态数据不能直接照搬静息态流程1.1 任务态与静息态在信号假设上的根本差异静息态数据关注的是被试在无任务状态下自发的 BOLD 低频涨落默认的分析窗口是 0.01~0.1 Hz对应的是几十秒到上百秒的慢波成分。所以静息态预处理里常常要做带通滤波把这个频段之外的心跳、呼吸漂移、扫描仪慢漂移尽量过滤掉方便后面算 ALFF、ReHo、功能连接这些指标。任务态的逻辑完全不同。任务态关心的是 BOLD 信号是否跟着刺激或任务条件同步变化事件相关设计里甚至要求分辨出一两秒内出现的峰值变化这是相对高频的信息。如果你把静息态那套 0.01~0.1 Hz 带通直接套过来等于把低频端砍掉——当一个任务的组块节律较长时任务相关成分本身就在 0.01 Hz 以下滤掉之后就什么都看不出来了。这也是我在开头说的那次翻车经历。所以任务态预处理里通常不主动做带通滤波最多做一下高通去漂移低频慢漂移部分交给后面一级分析SPM 里的 high-pass filter去处理。这个思维转变是所有参数调整的前提。1.2 DPABI与SPM12的分工谁负责调度谁负责算账很多初学者打开 DPABI 之后会有点困惑为什么这个界面里也能看到 SPM12 的东西因为 DPABI 本质上是构建在 SPM12 之上的批处理工具SPM12 负责具体算法比如 DICOM 导入、Slice Timing、Realign、Coregister、Segment、Normalize、Smooth 这些底层操作DPABI 负责把操作串成管道、给每个被试批量执行、输出便于核查的目录结构。环节主要负责者图形界面与流程编排DPABI批量循环、数据目录组织DPABIDICOM 转 NIFTISPM12 / dcm2nii 接口时间层校正、头动校正、配准、分割、标准化、平滑SPM12预处理质量指标生成DPABI一句话总结你把样本信息、TR、层数、层顺序、平滑核大小这些参数填在 DPABI 面板上DPABI 生成对应的 SPM12 batch再用 MATLAB 指令逐被试执行。所以如果 SPM12 路径没配好或者版本不匹配DPABI 界面再正常也没用。1.3 任务态预处理流程总览与文件命名约定任务态预处理的基本链路如下DICOM 转 NIFTI如果数据采集端已经是 NIFTI 则跳过去除前几个时间点可选推荐时间层校正 Slice Timing头动校正 Realign功能像与结构像配准 Coregister结构像分割 Segmentation标准化 Normalize到 MNI 空间平滑 SmoothSPM12 生成文件时有非常固定的前缀规则这个一定要记住否则你在结果目录里看到一堆乱码一样的文件名会直接懵前缀含义a时间层校正后r头动校正realigned后w标准化normalized后s平滑smoothed后c1/c2/c3分割出的灰质/白质/脑脊液rc1/rc2/rc3重采样到 MNI 空间的灰质/白质/脑脊液rp_头动参数文件每帧 6 列X/Y/Z平移 roll/pitch/yawmean*头动校正后的平均功能像如果整个链路完整跑完最后用于统计的文件通常形如swar*.nii先做了 slice timinga再做 realignr再 normalizew最后 smooths。通过文件前缀就能快速反推这个被试跑到哪一步排查问题会快很多。2. 数据整理与环境配置先把地基打牢2.1 目录结构与命名规范DPABI 对数据目录有一个隐含要求每个被试一个独立文件夹T1 和功能像分别放好。我推荐在开始之前就固定好目录结构不要边跑边改。我自己的习惯是这样的Project/ ├── Participants/ │ ├── 001/ │ │ ├── T1/ │ │ │ └── *.dcm │ │ └── Func/ │ │ └── *.dcm │ ├── 002/ │ │ ├── T1/ │ │ │ └── *.dcm │ │ └── Func/ │ │ └── *.dcm │ └── ...几个容易踩的细节被试编号不要用纯中文、不要带空格用001、002这种定宽数字避免后面排序变成 1、10、2 的诡异顺序。如果每个被试有多段任务多个 run建议在 Func 目录下再拆分子目录比如Func_Run1、Func_Run2或者按 DPABI 支持的多功能层目录去组织。DICOM 文件来源检查一下同一个 DICOM 文件夹里如果混入了定位像或场图序列DPABI 的 DICOM 导入阶段会分错文件预处理出来的时间点数对不上。2.2 MATLAB、SPM12、DPABI的版本与路径配置这三个软件的版本搭配很关键。SPM12 官方支持 MATLAB 的时间范围比较宽但太新的 MATLAB 偶尔会出现图形句柄或兼容性问题我自己的经验是 MATLAB R2020b 到 R2022b 这段区间比较稳妥。DPABI 建议用最新版 V6.x老版本在任务态数据处理上的选项不如新版本完整。在 MATLAB 里配置路径的方式addpath(genpath(/path/to/spm12)); addpath(genpath(/path/to/DPABI_V6.x)); savepath;注意两点先加 SPM12再加 DPABI。因为 DPABI 会调用 SPM12 的函数如果路径顺序反了某些同名函数可能被覆盖跑出来的行为会非常诡异。配置完路径后最好重启一次 MATLAB再在命令行里输入spm和dpabi验证能否正常启动。如果spm打开窗口正常、dpabi也能打开主界面说明环境基本没问题。2.3 去除前几个时间点任务前静息与dummy scan怎么处理fMRI 扫描开始的几个 volume 往往信号极不稳定因为磁化状态还没有达到稳态T1 对比度会异常偏高。所有预处理流程里我都会先切掉头几个时间点再进入正式步骤DPABI 里也有对应的选项。切几个常见做法是 4~10 个。这个取决于扫描仪和序列稳妥一点的做法是先看原始数据的时序均值图像如果前几帧明显比后面亮或出现整体强度漂移就切掉 10 个如果本身稳定切 4 个也可以。切太多会损失数据尤其是实验本身时长较短时。有一个“双重切除”的坑如果采集时扫描序列已经设置了 dummy scan即前 n 帧采集但不保存那接收到的 NIFTI 数据可能已经自动少了那几个 volume你又在 DPABI 里切 10 帧等于白白损失数据。所以开始前一定问清楚扫描参数里有没有 dummy scan再决定 DPABI 里要不要切、切多少。3. 预处理核心参数逐项拆解每一站该怎么填3.1 时间层校正参考层和slice order的确定方法功能像是一个 volume 一个 volume 拍的但每个 volume 内部并不是同一瞬间完成的扫描仪在 TR 时间内逐层采集所以每一层对应的真实采集时间有一个偏移。时间层校正的作用就是通过插值把同一 volume 所有层的信号对齐到某个参考时间点上。对任务态来说这一步比静息态更敏感。事件相关设计中 HRF 的峰值本来就短几百毫秒的层间偏移如果不校正不同脑区的 BOLD 响应看起来会像在不同时间点到达时间精度不够的后果就是激活检测效率下降。需要填写两个关键参数slice number 和 slice order。slice number直接等于你扫描序列的层数比如 32 层就填 32。slice order指的是每一层实际被采集的先后顺序这个必须从扫描序列参数里确认不要猜。常见的三种输入形式扫描方式Slice Order 填写示例32层说明连续升序从上到下或从下到上1:32或32:-1:1飞利浦、GE 常见隔层先奇数后偶数1:2:31, 2:2:32西门子常见隔层先偶数后奇数2:2:32, 1:2:31需从扫描参数确认参考层reference slice一般取全部层的中位时间点那一层比如 32 层通常选第 16 层。如果某个兴趣区在脑顶部也可以考虑把参考层往顶部区域靠一下尽量减少该区域相对参考层的时间偏移。3.2 头动校正任务诱发的微动作如何记录和评估头动校正是用刚体变换把每一帧对齐到参考帧通常是第一帧或平均帧估计 6 个参数X/Y/Z 平移以及绕三轴的旋转。SPM12 的 realign 会输出rp_*.txt文件里面每一行对应一个 frame 的 6 个参数后续分析里经常被当作协变量回归进模型。判断头动是否严重不能只看平移还要看旋转。经验做法是计算 frame-wise displacementFDPower 2012 年提出的公式大致是FD(i) |dX(i)| |dY(i)| |dZ(i)| |alpha(i)| * 50 |beta(i)| * 50 |gamma(i)| * 50旋转角度单位是弧度乘以 50 近似等于头部半径约 50 mm处的弧长位移。我的实操阈值参考指标轻度需要警惕通常建议剔除最大平移 1.5 mm1.5~3 mm 3 mm最大旋转 1.5°1.5°~3° 3°平均 FD 0.2 mm0.2~0.5 mm 0.5 mm坏帧比例FD 0.5 mm 10%10%~20% 20%任务态数据头动问题比静息态更突出被试在任务中要做按键、说话、咀嚼等动作头动不仅幅度大而且往往和任务条件时间锁相关。参数填得好不好直接影响后面一级分析是否出现任务相关伪影。3.3 配准与分割为什么先配准后标准化顺序不能反预处理的后半段思路是先把功能像和结构像T1对到同一个空间再用 T1 分割得到从个体空间到 MNI 标准空间的变形场最后把这个变形场施加到功能像上。注意顺序不能反原因很简单如果你先单独分割 T1 并把它标准化到 MNI再反过来把功能像配准到已经标准化的 T1就会有两次独立的插值误差功能像会变得很“糊”组分析的时候敏感度下降。DPABI 里配准一般选择 T1 到功能像的平均像做 coregistration然后用平均像目检。分割用的是 SPM12 的 New Segment会生成 c1、c2、c3 三张图对应灰质、白质、脑脊液。配准做完一定要看质量。SPM12 里可以用 Check Reg 同时显示 T1 和功能平均像肉眼检查边缘是否对齐如果发现明显错位不要急着继续标准化先回到原始影像看看是不是方向标签有问题必要时手动 reorient。3.4 标准化到MNI空间普通标准化与DARTEL怎么选标准化是把不同被试的大脑形态统一到同一模板空间这样后续组分析才能逐体素比较。DPABI 里提供普通标准化和基于 DARTEL 的标准化两个方向。普通标准化就是直接用 SPM12 的 unified segmentation 得到变形场再写到功能像上。速度快、默认参数成熟绝大多数任务态研究完全够用。DARTEL 的做法是先在样本内部生成一个平均模板再用这个模板对每个被试做更精细的配准精度更高但计算量大很多而且对单个被试的数据质量更敏感。小规模精细空间归一或者样本脑形态差异偏大时可以选 DARTEL常规任务态全脑分析直接普通标准化即可。方式速度精度适用场景普通标准化快足够常规任务态组分析DARTEL慢更优VBM、样本间结构差异大、需要精细配准时标准化时还要确定体素大小。我一般设置 2×2×2 mm 或保持原始分辨率也有很多人习惯 3×3×3 mm计算更快、后续平滑后统计更容易满足随机场假设。如果被试样本量不大我建议 2 mm保留更多空间细节。3.5 平滑核大小与任务激活检测的关系平滑是一个容易被低估的步骤。高斯平滑核FWHM的作用不只是把图变糊它有三个实际收益提高信噪比减少高频噪声对统计量的影响让不同被试之间功能激活位置稍微偏移时不至于完全配不上使误差场更接近高斯随机场模型满足基于 GRF 的体素水平校正假设。FWHM 的选择核心看数据分辨率和兴趣区大小。常见原则是取原始体素大小的 2 倍左右例如 2 mm 体素用 6 mm FWHM3 mm 体素用 6 mm 也常见。如果分析目标是非常小的核团比如杏仁核、导水管周围灰质FWHM 太大很容易把小激活抹平建议用 4 mm 甚至更小。反之如果只做全脑大规模激活区8 mm 也不夸张。DPABI 里平滑核的填写格式是三个数字比如[6 6 6]分别代表 X/Y/Z 方向。4. 任务态预处理中必须避开的几个坑4.1 头动与任务条件相混淆时该怎么办这是一个非常隐蔽但伤害极大的坑。假设你的实验组块是“任务 30 秒 休息 30 秒”被试在任务期做高频按键头动也跟着任务期同步增加。这种头动和任务条件高度相关会产生两个后果一是头动参数回归进 GLM 后任务条件本身的一部分真实差异也被吸走激活检测效力下降二是如果头动与任务完全同步SPM 的模型有可能分不清到底是 BOLD 激活还是运动伪影。判断方法很简单画一条头动曲线再画一条任务开/关方块图肉眼对比两者是否同步更严谨一点可以算一下每个帧的头动 FD 和任务条件指示变量之间的相关系数。如果相关系数很高这个被试的数据就要特别小心。处理手段按严重程度排序轻度同步头动可以在 GLM 中添加额外的微运动回归器或者用 F 检验对比有无头动协变量时的任务效应是否稳定中度同步头动可以考虑按坏帧剔除scrubbing或仅剔除某几个帧严重同步头动直接剔除被试可能是更理智的选择因为模型已经很难分离真实激活和运动伪影。4.2 带通滤波在任务态中的风险前面提过带通滤波是静息态预处理的常规操作但任务态不建议加。举个具体例子一个长组块设计任务块 120 秒、控制块 120 秒整个周期是 240 秒对应的频率是 1/240 ≈ 0.0042 Hz。如果你用 0.01~0.1 Hz 的带通这个任务相关频率就被彻底滤掉了。即使任务块没那么长只要任务节律偏低频带通都会造成不同程度的信息损伤。正确做法是预处理阶段不滤波最多做线性去漂移或高通低频漂移的抑制交给 SPM12 的一级分析模块SPM 的 high-pass filter 默认 128 秒截止你也可以根据任务设计改成 256 秒甚至更长。如果在 DPABI 里看到滤波选项确认它是“仅去线性漂移”还是“带通滤波”任务态数据一律选不滤波或只做去线性漂移。4.3 多run数据如何整理与预处理一个被试跑了两个 run预处理时不要图省事把两个 run 拼成一个四维文件。正确做法是让 DPABI 分别对每个 run 做时间层校正和头动校正之后标准化时共用同一个 T1 变形场。目录组织上我建议001/ ├── T1/ │ └── *.nii ├── Func_Run1/ │ └── *.nii └── Func_Run2/ └── *.nii在 DPABI 里可以添加多个功能像目录DPABI 会逐个处理。之后在做 SPM12 一级分析时两个 run 作为两个 session 输入PD 模型里设置相同的回归量即可。如果两个 run 之间的 TR、层数、层顺序不一样不常见但换序列时会出现就必须当作两批数据分别设置预处理参数不能一个 settings 全跑。4.4 预处理结果质检清单预处理跑完不是结束质检必须做。我的习惯是建立一个简单的检查清单每个被试过一遍时间点数是否符合预期DICOM 转换后是否有缺失头动曲线是否有突然的大尖峰T1 与功能平均像的配准边缘是否吻合标准化后的功能像在 MNI 模板上看起来是否“正常”有没有明显扭曲平滑后的图像有没有伪影或强度异常rp_*.txt 文件是否完整帧数和原始 volume 数一致。每次跑完预处理后我都会把每个被试的质检结果记录在一个表格里标记 PASS / Warning / Fail再决定哪些数据进入后续统计分析。这一步花不了多少时间但能省掉后面大量返工。5. 我在实操中碰到的具体报错与排查过程5.1 路径和版本导致的MATLAB报错最常见的报错是打开 DPABI 时提示找不到 SPM 函数或者运行时报Undefined function or variable spm。这个基本就是 SPM12 路径没加上去重新确认addpath之后重启 MATLAB 就好了。另一个比较隐蔽的是 MATLAB 版本过新导致的图形窗口报错例如Error using matlab.ui.Figure或者某些 SPM 的 GUI 函数异常。SPM12 本身一直有更新但如果你手头的 SPM12 是几年前的旧版配 MATLAB R2023b 以上就可能出问题。排查方向很简单先看 SPM12 的版本日期再看 MATLAB 版本两个跨度太大就换掉其中一个。我个人的经验值是 MATLAB R2020b 最新 SPM12 最新 DPABI 最稳。5.2 配准结果错位的处理有次我给一个数据集跑完预处理QC 阶段发现某个被试的功能像和 T1 明显错位脑组织边缘是错开的功能像整体相对 T1 旋转了一点。查来查去问题出在这个被试采集时的头位明显偏转DICOM 转 NIFTI 后图像的齐次坐标和 T1 不一致。这种情况下强制做 coregistration 很容易配歪。解决思路是在正式预处理前加一步手动 reorient在 SPM12 的 Display 里打开功能像和 T1用“Reorient matrix”把两者大致摆到同一朝向再重新跑预处理。DPABI 里也提供 Reorient 相关选项可以在预处理前对所有被试统一设置 AC-PC 对齐。这个坑很难通过调参数解决因为根源在原始数据方向信息。所以我的习惯是预处理前先随机抽 2~3 个被试用 SPM12 打开图像看看方向是否正确再决定跑全量。5.3 头动过大的被试是剔除还是保留遇到头动大的被试很多人会纠结到底剔除还是保留。我的决策流程是先看这个被试是否全 run 头动都大还是只有某个 run 头动大看头动是否和任务条件同步看核心 ROI 区域是否出现明显伪影或信号异常用含头动协变量的模型跑一次对比结果稳定性。如果只是某个 run 头动大我会选择只剔除该 run 而不是整个被试保留另一个合格 run 的影像数据。如果头动普遍超标且与任务同步我会直接剔除哪怕样本量变小也不硬留。因为任务态 GLM 对运动伪影的容忍度比静息态更低留一个严重头动被试进组分析可能产生假激活也会掩盖真实效应得不偿失。5.4 预处理完成后给下一步留好哪些文件预处理完成并不代表万事大吉最终进入一级分析前要确保以下文件都完整每个被试标准化并平滑后的功能像文件swar*.nii或类似前缀每个 run 的头动参数文件rp_*.txt后续 GLM 要作为协变量每个 run 对应的帧数信息便于检查模型自由度如果做了坏帧剔除保留剔除帧编号列表方便后续写模型时做 missing frame 处理。这些文件我会统一在Preprocessed目录下按被试归档和原始数据分开。这样一来下一步在 SPM12 里建一级模型时只需要按被试填功能像路径和rp_文件路径就能顺畅地接上。我自己跑任务态数据到现在最深的感受是预处理这部分真正决定分析质量的往往不是软件多复杂而是你有没有理解每一步的参数从哪来、为什么要这么设。头动、时间层校正、滤波设置这几个环节尤其值得多花时间核对。如果你也准备用 DPABI 跑任务态预处理我建议第一次先抽 3 个被试把整条链路跑通、把所有中间结果都检查一遍再大批量跑这样会比直接怼全样本数据稳妥得多。
阅读完成 · 觉得有帮助?