☰
任务态fMRI预处理实战:DPABI+SPM12参数设置与避坑指南
2026/10/4 12:23:14 网站建设 项目流程

先放个结论:任务态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
批量循环、数据目录组织DPABI
DICOM 转 NIFTISPM12 / dcm2nii 接口
时间层校正、头动校正、配准、分割、标准化、平滑SPM12
预处理质量指标生成DPABI

一句话总结:你把样本信息、TR、层数、层顺序、平滑核大小这些参数填在 DPABI 面板上,DPABI 生成对应的 SPM12 batch,再用 MATLAB 指令逐被试执行。所以如果 SPM12 路径没配好或者版本不匹配,DPABI 界面再正常也没用。

1.3 任务态预处理流程总览与文件命名约定

任务态预处理的基本链路如下:

  1. DICOM 转 NIFTI(如果数据采集端已经是 NIFTI 则跳过)
  2. 去除前几个时间点(可选,推荐)
  3. 时间层校正 Slice Timing
  4. 头动校正 Realign
  5. 功能像与结构像配准 Coregister
  6. 结构像分割 Segmentation
  7. 标准化 Normalize(到 MNI 空间)
  8. 平滑 Smooth

SPM12 生成文件时有非常固定的前缀规则,这个一定要记住,否则你在结果目录里看到一堆乱码一样的文件名会直接懵:

前缀含义
a时间层校正后
r头动校正(realigned)后
w标准化(normalized)后
s平滑(smoothed)后
c1/c2/c3分割出的灰质/白质/脑脊液
rc1/rc2/rc3重采样到 MNI 空间的灰质/白质/脑脊液
rp_头动参数文件,每帧 6 列(X/Y/Z平移 + roll/pitch/yaw)
mean*头动校正后的平均功能像

如果整个链路完整跑完,最后用于统计的文件通常形如swar*.nii:先做了 slice timing(a),再做 realign(r),再 normalize(w),最后 smooth(s)。通过文件前缀就能快速反推这个被试跑到哪一步,排查问题会快很多。

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 displacement(FD),Power 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 FWHM,3 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 头动过大的被试是剔除还是保留

遇到头动大的被试,很多人会纠结到底剔除还是保留。我的决策流程是:

  1. 先看这个被试是否全 run 头动都大,还是只有某个 run 头动大;
  2. 看头动是否和任务条件同步;
  3. 看核心 ROI 区域是否出现明显伪影或信号异常;
  4. 用含头动协变量的模型跑一次,对比结果稳定性。

如果只是某个 run 头动大,我会选择只剔除该 run 而不是整个被试,保留另一个合格 run 的影像数据。如果头动普遍超标且与任务同步,我会直接剔除,哪怕样本量变小也不硬留。因为任务态 GLM 对运动伪影的容忍度比静息态更低,留一个严重头动被试进组分析,可能产生假激活也会掩盖真实效应,得不偿失。

5.4 预处理完成后给下一步留好哪些文件

预处理完成并不代表万事大吉,最终进入一级分析前,要确保以下文件都完整:

  • 每个被试标准化并平滑后的功能像文件(swar*.nii或类似前缀);
  • 每个 run 的头动参数文件rp_*.txt,后续 GLM 要作为协变量;
  • 每个 run 对应的帧数信息,便于检查模型自由度;
  • 如果做了坏帧剔除,保留剔除帧编号列表,方便后续写模型时做 missing frame 处理。

这些文件我会统一在Preprocessed目录下按被试归档,和原始数据分开。这样一来,下一步在 SPM12 里建一级模型时,只需要按被试填功能像路径和rp_文件路径,就能顺畅地接上。

我自己跑任务态数据到现在,最深的感受是:预处理这部分真正决定分析质量的往往不是软件多复杂,而是你有没有理解每一步的参数从哪来、为什么要这么设。头动、时间层校正、滤波设置这几个环节尤其值得多花时间核对。如果你也准备用 DPABI 跑任务态预处理,我建议第一次先抽 3 个被试把整条链路跑通、把所有中间结果都检查一遍,再大批量跑,这样会比直接怼全样本数据稳妥得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询