
做任务态fMRI分析的人第一座绕不过去的大山就是预处理。我最早用SPM12手动处理单个被试时光在Batch Editor里点模块、配参数就点得眼睛发花后来换到DPABI做批处理头几次跑又因为slice order填错浪费了整整两天才重新跑完。这套组合——DPABI加上SPM12——是目前国内用得最多的任务态和静息态fMRI批量处理方案之一它把SPM底层一个个基础模块串成了一条流水线既能批量跑几十个被试也保留了逐环节调整参数的空间。这篇笔记是从任务态fMRI预处理的角度把我在实际处理数据时反复确认过的流程、参数和理由写下来适合刚入坑的研究生、科研助理以及对DPABI还不熟、想弄明白每一步在干什么的同行参考。先给结论任务态fMRI预处理和静息态虽然长得像但目的并不完全一样。DPABI看起来很“一键”但你在点Run之前必须搞清楚TR是多少、层数是多少、层扫描顺序是什么以及这些设置会影响后面的哪一步。这篇文章不打算重复官方手册而是尽量站在实际跑数据的人的角度把那些容易默认、容易填错、容易事后才发现不对劲的地方讲清楚。1. 为什么选用DPABI与SPM12这套组合来做任务态预处理1.1 任务态和静息态预处理不能混着来很多人在打开DPABI后会有个困惑这个工具不是做静息态的吗任务态数据能不能直接套用答案是能跑但千万不能把静息态的选项原封不动搬到任务态上。静息态预处理通常包含去前几个时间点、时间层校正、头动校正、配准分割标准化、平滑再往后还有去线性漂移、带通滤波常见0.01~0.08Hz以及协变量回归任务态的预处理在前面几个环节上和静息态大致相同但之后的处理就要非常克制了——不能随便做带通滤波因为任务诱发的血氧信号有可能落在滤波频带之外特别是快速事件相关设计也不能默认把全局信号当成噪声回归掉因为任务引起的全脑信号波动在特定条件下是有实质意义的。所以我在自己的处理流程里会先明确任务态预处理要保住的两样东西一是把所有时间点的功能像在空间上对齐到一个标准空间二是尽量不破坏时间序列上血氧信号的相对关系。前者靠头动校正、配准和标准化完成后者靠时间层校正以及对去噪选项的克制来完成。DPABI最大的优势是把SPM里分散的模块串成一条链批处理和中间文件管理都很省心劣势在于如果你不理解每一步在干什么很可能直接把别人的静息态参数套到任务态上最后统计结果有异常时根本不知道问题出在哪一步。为了更直观我把任务态与静息态在预处理阶段最重要的差异列在下面处理环节静息态常见做法任务态建议做法原因去前几个时间点通常去4~10个同样建议去4~10个等待BOLD信号稳定时间层校正做做且参数要严格匹配扫描序列任务设计依赖精确的单帧时间带通滤波0.01~0.08Hz一般不做任务相关信号可能超出该频带全局信号回归有时做慎做任务态全局信号可能与任务条件相关头动参数回归作为协变量同样作为协变量减少头动伪影对统计的影响1.2 DPABI不是黑盒它是SPM12的“外壳”DPABI本质上是一套基于SPM的图形界面插件尤其是DPARSF模块把SPM的slice timing、realign、coregister、segment、normalise、smooth这些函数串联起来还加入了一些更贴近使用习惯的设计比如清晰的分被试目录结构、头动质控报告生成、静息态标准模板等。你在DPABI里执行的每一步其实都等价于在SPM12的Batch Editor里手动配置一次所以如果SPM12本身安装或运行有问题DPABI跑得再顺也会在某个中间环节突然翻车。这也是我强烈建议不要只点按钮的原因。最好提前翻一翻SPM12手册里关于“Segment”和“Normalise”的章节去理解SPM在标准化时到底做了什么几何变换和形变场估计。很多看起来莫名其妙的错误比如标准化后脑区扭曲、DARTEL报错、配准时图像方向不对本质上都是对底层逻辑理解不够导致的。我的个人习惯是第一次跑某个新序列的数据之前会先用一个被试手动在SPM12的Batch Editor里把全流程跑通确认每个模块的输出都正常再回到DPABI里设置批处理。这样即便后面报错我至少知道大致是哪一步出了问题。2. 预处理之前把这些扫描参数和数据信息先确认好2.1 TR、采集层数与扫描顺序少一个后面都难办预处理前最需要确认的不是软件配置而是扫描序列的元信息。TR重复时间、体素大小、层数、层扫描顺序这些参数在以后的Slice Timing、Normalize、Smooth中都直接参与计算。我在处理自己的数据时第一件事就是向扫数据的技师要序列参数表或者直接从DICOM头里读取。DICOM的tag里能看到TR、层厚、矩阵大小等基础信息但扫描顺序不一定直接写在DICOM头里通常只能从序列参数或者厂商的操作界面里确认。比如Siemens的序列可以在“Slice order”或“Multi-slice mode”里看到GE和Philips也都有类似的参数显示位置。关于层扫描顺序最常遇到的是两种interleaved隔层采集和sequential按顺序采集而interleaved里又分升序和降序。以36层、TR2s为例常见的interleaved顺序可能是1,3,5,...,35,2,4,...,36也有可能从第2层开始即2,4,...,36,1,3,...,35。不同厂商不同序列还真不一样所以我从来不会凭记忆填写而是每次都去确认。TR和层数决定时间层校正的时间分辨率扫描顺序决定slice timing的参考层选择这两项一旦填错后续统计激活的位置就会出现系统性的偏差而且这种偏差在单一被试上乍一看并不明显最容易造成“跑完了但结果不靠谱”的假象。2.2 DICOM/NIFTI数据整理与安装环境DPABI对数据目录有比较明确的要求建议一开始就按它的规范来整理在同一个工作目录下每个被试一个文件夹文件夹名建议用Subject_001这种整齐的命名方式。每个被试文件夹内通常要放两个子目录一个放功能像FunImg一个放结构像T1Img。功能像的DICOM文件往往数量非常多一个时间点产生几十层图像一个run可能上千个文件所以一定要保证这些文件完整、无重名、无漏扫。我习惯先用dcm2niix转成3D NIFTI格式再放入FunImg目录这样每个时间点对应一个单独的nii文件肉眼检查起来比较方便。如果你更习惯直接在DPABI里转DICOM也完全可以但前提是DICOM文件夹里不要混入定位像、校准像等其他序列。软件环境方面建议用MATLAB加SPM12再加DPABI的组合。SPM12的安装相对简单只需要把SPM12的文件夹加入MATLAB路径然后运行一次spm验证界面能否打开。DPABI同样是把文件夹加入路径然后在MATLAB命令窗口输入dpabi即可启动主界面。要注意MATLAB版本不能太老太老的版本可能与新版SPM12或DPABI不兼容。我在实验室里遇到过因为MATLAB版本过旧导致SPM的mex文件无法编译的情况后来统一升级到R2018b以后才彻底稳定。为了避免路径混乱最好在启动DPABI之前只加载SPM12和DPABI其他自研工具箱先不要全部addpath否则某些函数名冲突会引发奇怪报错。2.3 为什么要砍掉前面几个时间点很多扫描序列在前几个时间点信号还不稳定因为纵向磁化还没有达到稳态尤其是GRE-EPI序列开始采集的前几秒信号强度会有明显爬升。如果不把这几个时间点去掉后续时间层校正和头动校正会把这种信号爬升当成真实BOLD变化的一部分对统计分析造成干扰。所以预处理的第一步通常就是“去时间点”常见做法是去掉前4~10个时间点。具体去几个取决于序列达到稳态需要的时间、TR长短以及你关注的脑区信号情况。如果使用DPABI可以在参数设置里指定从第几个时间点开始处理。比如一个run总共210帧去掉前5帧就从第6帧开始处理最终的帧数就是205帧。我自己的经验是TR越短需要的预热时间相对越长因为达到稳态需要的物理时间大致固定帧数上去以后往往需要多去掉几帧。此外如果序列里本身已经有spoil或dummy scan被自动丢弃那么实际保存的DICOM第一帧可能已经是稳定帧这时可以少去几帧。不过如果没有把握宁可多去两帧也不要少去功能像帧数通常足够多少两帧对统计功效影响很小但爬升伪影对统计的影响却很坑。3. 预处理五大核心环节原理、参数和经验3.1 时间层校正为什么TR和层顺序决定成败功能像并不是一个三维盒子在一次瞬间采集完的而是一层一层在几秒内扫描完。TR2s意思是整个大脑扫一遍需要2s但第1层和第36层的采集时间点实际差了将近2s。对于任务态fMRI我们默认同一帧图像代表同一个时间点的全脑信号如果不校正层间时间差后续GLM建模时就会出现时间Offset激活区在z轴方向可能出现位置偏移。时间层校正的原理就是把采集时间不同的各层信号通过插值重新采样到同一个参考时间点上。这里有两个关键参数参考层和层顺序。参考层一般建议选择时间序列“中间位置”对应的层这样最大时间偏移最小。多数情况下我会选择大脑物理位置居中的一层。比如36层TR2s层扫描顺序是ascending那第18层或第19层就是物理位置居中的层如果是interleaved我通常会选第18层作为参考层并将slice order按实际扫描顺序填写格式类似“1 3 5 ... 35 2 4 6 ... 36”。这里千万注意有些界面要求你填“扫描顺序的层号序列”不是让你填“第1层、第2层”如果你填成1,2,3,...,36而实际是interleaved那校正方向就完全反了。3.2 头动校正刚体变换和那个不能超过3毫米的界限头动校正是预处理中最能让结果质量拉开差距的环节。原理很简单把每一帧功能像通过刚体变换三个平移、三个旋转对齐到第一帧或平均帧上从而减少头部移动导致的空间不匹配。在DPABI中头动校正通常会把所有帧对齐到平均帧上输出估计出的6个头动参数。这些参数之后会被保存为rp_*.txt文件在统计建模阶段作为协变量纳入GLM用来进一步减少残余头动的影响。头动质控的通用标准是平移不超过3mm、旋转不超过3度严格一点会用1.5mm和1.5度。但要注意绝对判断不如相对判断如果一个被试的头动整体小于0.5mm但组内比较时这个被试明显偏大也值得警惕。我会在跑批前做一次初步检查看每个run的max motion和mean motion把位移明显异常的run直接标记出来后期决定是排除还是把该被试的头动参数作为额外协变量。另外一个容易被忽视的点是头动校正前不要省略时间层校正因为如果层间时间差没有校正头动估计会受层间错位干扰估计结果可能不够准。顺序上通常是先Slice Timing再RealignDPABI默认也是这个顺序。3.3 配准与分割功能像、T1、MNI三者的姿势对齐配准与分割把每个人的大脑放到同一个“坐标系”里。功能像分辨率低、组织对比度差不适合直接做空间标准化T1结构像分辨率高、灰白质边界清晰适合做分割和组织识别。所以常规做法是先把T1结构像配准到功能像的平均图像上再把T1向标准化模板的形变场计算出来最后把功能像通过这个形变场映射到MNI空间。这一步在SPM里称为Coregister在SPM12里进一步用New Segment做组织分割输出灰质、白质、脑脊液的图像。实际操作中我遇到过好几次功能像和T1像初始位置离得很远甚至方向都不一致的情况这时Coregister会报错或配准效果极差。解决办法是先手动检查两者方向如果初始位置差太远可以用SPM的Display功能观察必要时先做一次粗略的六参数配准作为初始化。另一个常见问题是T1图像中如果有金属伪影、大面积运动伪影或扫描范围不完整分割结果会受影响进而波及标准化。因此检查T1质量是跑批前必须做的事不能省。3.4 标准化用DARTEL还是用普通Normalise标准化是把不同被试的大脑形态映射到同一个标准模板空间的过程。SPM12提供了两种路径一种是常规Normalise基于New Segment产生的变形场使用12参数仿射变换加非线性变换另一种是DARTEL先由灰质白质图像创建组内模板经过多次迭代配准后生成一个更精细的形变场。DARTEL的配准精度通常更高更适合精细的组间比较或VBM分析但计算量也明显增加。我在任务态fMRI处理中如果被试数量不是特别多、T1质量普遍不错就直接用DARTEL如果数据量大、T1质量参差不齐或者只是做常规GLM激活定位普通Normalise通常也够用。需要注意的是DARTEL对T1分割质量比较敏感一旦某被试分割出的灰质图像明显异常DARTEL迭代可能特别慢甚至报错。为了防止一个坏被试拖垮整个批处理我会在正式跑批前先挑两三个典型被试做一次完整pipeline确认DARTEL能正常收敛然后再放开跑全样本。3.5 空间平滑FWHM怎么选才不会被审稿人怼空间平滑不是可有可无的修饰它对后续SPM统计很重要。平滑一方面提高信噪比另一方面让数据更接近高斯场假设这对SPM使用的基于高斯随机场理论的统计推断很关键。平滑核的大小用FWHM半高全宽表示一般建议选为体素尺寸的2~3倍。比如功能像标准化后体素是3mm那平滑核用6mm是常见选择如果体素是2mm可以用4~6mm。组分析里6mm到8mm都很常见但也不要为了追求高SNR把平滑核选得过大空间分辨率会损失严重小脑区或者精细解剖结构的激活可能直接被抹掉。关于平滑还有一个容易被忽视的细节如果数据是在任务态下采集的且后续想做个体水平的BOLD信号提取比如做ROI分析那么平滑核的选择会影响ROI信号的独立性。ROI分析如果用了过大的平滑核不同ROI之间的信号会变得更相关。我的建议是如果要提取ROI信号可以在预处理时保留一套不经过平滑或仅轻度平滑的数据供ROI分析和时间序列作图使用GLM统计则使用正常平滑的数据。DPABI中可以很方便地对是否平滑以及FWHM进行配置但很少有人会想到保存两份数据这点算是我踩过坑后的小技巧。4. 在DPABI里跑一遍任务态预处理完整实操配置4.1 DPARSF的数据目录结构与启动DPABI界面中最重要的模块是DPARSFData Processing Assistant for Resting-State fMRI的缩写但实际上也可以处理任务态数据。启动DPABI后在界面上选择DPARSF就会进入参数设置面板。数据目录结构要求比较严格建议按下面这种格式准备工作目录/ ├── Subject_001/ │ ├── FunImg/ │ │ ├── run1_001.nii │ │ ├── run1_002.nii │ │ └── ... │ └── T1Img/ │ ├── T1_001.nii │ └── ... ├── Subject_002/ │ └── ... └── Subject_003/ └── ...这里的子目录名不要搞错大小写DPABI默认区分FunImg和T1Img。如果你的数据是DICOM格式也可以直接把DICOM文件放到FunImg里DPABI内部会调dcm2nii转换但为了减少不确定性我仍然建议在放进DPABI之前自己先转成NIFTI。文件夹准备好了之后DPARSF界面的第一个需要设置的项目就是“Working Directory”选择包含所有被试文件夹的上一层目录。然后点击“FunImg*”选择模式DPABI会自动识别每个被试的FunImg和T1Img文件夹。接下来需要设置时间点范围、TR、层数、层顺序、是否去除某些步骤等。4.2 参数面板里的关键设置我常用的任务态配置在DPARSF参数面板中有几个地方需要重点说明。首先是最上方的时间点设置Time Points这部分要填写起始帧和结束帧比如从第6帧到第210帧。如果序列每个run帧数不一致需要特别注意DPABI是否支持按run分别设置如果不支持通常要保证所有run帧数一致才能批处理。其次是TR和Slice Number这两项直接对应扫描序列参数千万不要凭印象填。接着是Slice Order设置要填实际扫描顺序的层号序列而不是层数。最后是Smoothing FWHM我通常填[6 6 6]单位是毫米。下面是几个针对任务态fMRI特别需要注意的勾选项。DPABI默认面板中有很多针对静息态的选项比如“Remove Linear Trend”和“Filter”在任务态流程中我一般不会勾选。原因在前面提到过带通滤波会滤掉任务相关频段的信号去线性趋势也要谨慎任务态设计中如果任务块时长较长线性趋势项可能与任务条件混淆反而不利于后续统计。另外如果只想做预处理到标准空间并保留全脑信号就不要在DPABI里额外勾选“Extract ROI Signal”等后处理步骤。正常跑完预处理后输出目录中会出现以w开头的标准化文件、以sw开头的平滑标准化文件rp开头的头动参数文件以及用于质控的若干图片。我在首次设置时会把“是否删除中间文件”的选项关掉保证每一步生成的中间结果都保留方便后面排查问题。等确认整条流水线稳定后再在正式批量处理时开启中间文件清理以节省磁盘空间。毕竟一个功能像run就可能产生几百兆中间文件几十个被试累积起来1TB空间说没就没了。4.3 跑批后的检查步骤不是“Run”完就万事大吉DPABI跑批完成后我强烈建议先做三件检查再进入统计分析。第一检查头动报告。DPABI会输出每个被试的头动参数和位移曲线找到平动位移超过3mm或转动超过3度的被试进行标记或剔除。第二检查配准与标准化效果。用SPM12里Check Reg功能把每个被试的T1像和标准化后的功能像叠加显示观察脑边沿是否对齐、左右方向是否正确。这一步看起来费时间但往往能发现脑区翻转、T1配准到功能像方向错误等问题。第三检查平滑后的图像是否存在异常亮斑或黑影。EPI数据偶尔会有全脑信号突变如果某一帧图像整体亮度异常后面的GLM统计会受到很大影响。我自己的习惯是跑完第一步后先随机抽查10%~20%的被试确认没有普遍问题再对所有被试做系统质控。如果前面步骤里有某个参数填错往往不是单个被试出问题而是绝大多数被试都会在同一个位置出现异常抽查就能抓住。如果只有个别被试有问题则大概率是被试本身的图像质量问题比如头动过大、金属伪影、重建伪影等不需要因此改动全流程参数。5. 预处理常见问题与排查技巧实录5.1 报错类型一数据格式与头部方向问题我在带学生时遇到频率最高的报错是DICOM转NIFTI后图像方向不对导致的配准失败。比如功能像和T1像在影像坐标系里一个朝上是前另一个朝上是后SPM会直接提示方向或维数不一致。这种情况通常不是软件问题而是DICOM头信息不完整或转换工具设置不当。解决思路是先查看两幅图像的qform和sform矩阵再通过SPM的Display工具逐层面观察。如果方向确实反了可以用ITK或FSL的fslreorient2std先把图像标准化到RAS方向再放进DPABI处理。另一个容易出问题的是文件名和路径。DPABI对中文路径和空格极其敏感目录里一旦出现中文或过长的复杂路径MATLAB在某些环境下会报错。我的建议是统一使用英文和数字命名工作目录尽量短。还有MATLAB当前路径也不要放在网络驱动器上网络延迟会导致spm_vol无法读文件这类错误排查起来非常隐蔽。5.2 参数与流程上的“隐蔽坑”参数上的坑比数据格式更隐蔽因为它不会让你直接报错而是会让结果悄悄变差。最典型的是slice order填错。比如实际是interleaved但填成了sequentialSPM不会报错跑完后的时间层校正结果依然在错误的时间假设下插值激活图会在某些层面出现偏移。另一种隐蔽问题是在DPABI中同时勾选了去线性趋势和带通滤波然后在任务态GLM阶段把预处理的“干净信号”拿去做统计。结果发现任务相关的激活全都没了因为任务相关低频信号被滤掉了。所以我坚持让每个使用DPABI做任务态的人都先写一小段笔记说明自己用了哪些预处理步骤、为什么用。哪怕只是写给自己的也会逼着你去确认每个勾选的含义。不要等到论文返修时审稿人问“How did you preprocess the data? Did you apply temporal filtering?”的时候才开始回忆自己当时勾了哪些选项。5.3 统计阶段才会暴露的预处理隐患有些预处理问题在图像上不仔细看很难发现但进了GLM统计阶段就会集中爆发。比如配准不够好导致组内功能像对齐差最后组分析激活强度下降或者某个被试头动虽然平均水平低于3mm但存在少数几帧瞬间位移很大这几帧对GLM的影响依然很大甚至会造成伪激活。遇到这类情况可以把头动参数作为逐帧协变量纳入个体GLM然后比较加与不加协变量的统计结果。如果加入协变量后原本显著的激活消失大概率是头动伪影加任务条件系统相关导致的假阳性。这种情况在任务态中尤其要警惕如果被试在被试任务期间头部微动存在条件差异头动伪影会被任务调节常规回归也可能无法完全消除。另一个我的经验是预处理阶段不要把FWHM选得过小尤其是样本量小的研究。小样本下如果平滑不足统计结果对单个体素很敏感审稿人还容易质疑多重比较校正后的结果。平滑核的选择本质上需要在空间分辨率和统计稳健性之间做取舍我在样本量低于20的研究中通常不会选择小于5mm的平滑核。最后再分享一点个人体会跑了将近三年的fMRI数据我自己最大的感受是预处理是整个分析中“复现性”要求最高的环节但它也是最容易被未来版本的软件和不同的参数选择影响结果的环节。所以我会在每次处理完一批数据后把软件版本、主要参数、异常被试列表全部存进一个文本文件放在这个项目的数据目录下。这样过半年后如果还要追加被试或重做分析不会对着自己当初的操作一头雾水。最后再提醒一次任务态预处理和静息态不是同一套逻辑凡是涉及滤波、全局信号、时间层校正的选项都值得多想一步再做选择。预处理看似枯燥却是后续所有统计结论的地基地基歪了上面建得再漂亮也没有意义。