1. 环境准备与数据初探你的fMRI研究起点你好我是老张在脑影像分析这个行当里摸爬滚打了十几年用过各种工具踩过无数坑。今天咱们不聊那些虚头巴脑的理论就手把手地带你走一遍用SPM12处理fMRI数据的完整流程。想象一下你刚在磁共振扫描仪旁守了几个小时终于拿到了一组热乎乎的、原始的fMRI数据通常是成百上千个.nii或.img/.hdr文件心里既兴奋又有点发怵这堆数据怎么才能变成论文里那些漂亮的、显示大脑哪里被激活的彩色图片呢别担心跟着我的步骤来从数据到发现这条路我带你走通。首先咱们得把“战场”准备好。你需要三样东西MATLAB、SPM12工具箱以及你的原始数据。我建议你使用MATLAB R2018b或更新的版本太老的版本可能会遇到兼容性问题。SPM12的安装很简单去官网下载压缩包解压到一个你容易找到的路径比如D:\spm12。然后在MATLAB中通过“设置路径”功能把这个文件夹及其所有子文件夹添加进去。最后在MATLAB命令窗口输入spm fmri如果弹出了那个熟悉的SPM菜单界面恭喜你环境搭建成功了。在真正动手处理之前我强烈建议你先“看看”你的数据。这不是浪费时间而是避免后续灾难性错误的关键一步。你可以用SPM自带的检查工具或者像我一样用一个更轻量、更直观的软件——MRIcroN。打开MRIcroN把你的第一个时间点的fMRI数据拖进去。接着点击Windows - Information这里藏着数据的“身份证信息”。你需要重点关注两个参数Number of Slices层数和TR重复时间。比如信息显示Number of Slices: 36,TR: 2000 ms。这意味着你的大脑在每次扫描一个TR中被切成了36层进行采集每2秒钟完成一次全脑扫描。知道这两个值后我们可以算出一个重要的衍生参数TA采集时间。它的公式是TA TR - (TR / Number of Slices)。代入我们的例子TA 2000 - (2000 / 36) ≈ 1944.44 ms。这个TA是什么意思呢它表示扫描完一层到开始扫描下一层之间的实际时间间隔。因为磁共振扫描不是“咔嚓”一下同时拍下所有脑层而是一层一层顺序或隔层扫描的所以同一时刻不同脑层采集到的信号其实对应着略微不同的时间点。理解这一点对下一步的“时间层校正”至关重要。花上10分钟做这个数据初探能让你对整个数据集的结构心中有数后续操作才不会像在黑暗中摸索。2. 预处理四部曲为数据“梳妆打扮”原始fMRI数据就像刚从地里挖出来的矿石夹杂着各种“杂质”比如扫描时间差、被试微小的头动、不同被试大脑结构的差异等等。预处理的目的就是把这些杂质剔除掉让数据变得“干净”、“整齐”使得后续的统计分析能够真正捕捉到由实验任务引起的大脑活动信号而不是这些技术噪音。这个过程通常包含四个核心步骤咱们一个一个来拆解。2.1 时间层校正把错位的时间点对齐还记得我们算出来的TA吗因为扫描是逐层进行的在一次全脑扫描一个TR内第一层和最后一层采集时间相差了接近一个TR在我们的例子里是2秒。这意味着当你分析某个特定时间点的大脑活动时你实际上是在比较不同实际时刻采集的脑层信号这显然会引入误差。时间层校正就是为了解决这个问题。在SPM12菜单中点击Slice Timing。Data选择你的所有原始fMRI图像文件。关键参数在这里Number of Slices: 填入36。TR: 填入2单位是秒。TA: 填入我们计算好的TR - (TR/NSlices)即2 - (2/36)。SPM会自动计算。Slice order: 这是指扫描时采集各层的顺序。最常见的是隔层升序采集比如从第1层开始然后第3、5、7...层再扫第2、4、6...层。在我们的例子里如果是从第1层隔层扫到第35层再从第2层隔层扫到第36层顺序就写作[1:2:35, 2:2:36]。这个信息必须从你的扫描协议或技术人员那里获得猜是猜不准的。Reference Slice: 参考层。一般选择中间层因为它的采集时间点位于整个TA的中间作为时间对齐的基准最合适。对于36层中间层就是第18层36/2。设置好后点击运行。SPM会生成一套新的图像文件默认前缀是“a”比如aSubject01.nii。这些“a”文件里的每一层信号都经过插值算法被调整到了参考时间点即第18层被采集的那个时刻。现在在一个TR内所有体素可以理解为三维像素的信号在时间上就是对等的了为后续分析打下了第一个基础。2.2 头动校正稳住别晃被试在扫描仪里躺上几十分钟不可能完全纹丝不动。微小的头动即使是毫米级会严重破坏fMRI信号让激活区“模糊”或出现假阳性。头动校正的目标就是估计并校正这些运动。在SPM菜单选择Realign (Estimate Reslice)。在Data的Session里选中你刚刚做完时间校正的、所有以“a”开头的文件。这里有个小技巧在文件选择框的过滤栏Filter里输入^a.*或直接输入a可以快速筛选出所有“a”文件避免手动选择几百个文件的麻烦。参数通常保持默认即可这些默认值如配准算法、平滑程度是经过大量验证的。运行后SPM会做两件事一是生成一套新的、“头动对齐后”的图像文件前缀变为“r”如raSubject01.nii这些“r”文件在空间上已经对齐到第一个时间点了二是生成一个名为rp_*.txt的运动参数文件里面记录了6个参数3个平移3个旋转在每个时间点上的变化。这个txt文件至关重要我习惯在MATLAB里用load命令把它读出来画个图看看。如果发现某个方向的平移超过了体素大小的一半比如你的体素是3x3x3 mm那么1.5mm以上就是警戒线或者旋转超过了1度你就得高度警惕了。这个被试的数据质量可能很差需要考虑在后续分析中将其作为协变量控制甚至在极端情况下舍弃这个被试的数据。头动校正不能创造奇迹它只能校正无法修复因剧烈运动导致的信号失真。2.3 空间标准化把不同的大脑“放进同一个模子”我们每个人的大脑形状、大小都不同。为了进行组间分析或与脑图谱对比需要把所有被试的大脑都映射到一个标准的空间模板上。这个过程叫空间标准化。在SPM里这通常分两步走先把功能像配准到个人的结构像再把结构像配准到标准模板。第一步功能像配准到结构像 (Coregister)在菜单选择Coregister。Reference Image: 选择该被试的高分辨率T1结构像。结构像解剖细节清晰是理想的参考基准。Source Image: 选择经过头动校正的平均功能像。SPM在头动校正时会自动生成一个mean开头的文件它代表了所有时间点功能像的平均信噪比更高更适合用于配准。 点击运行SPM会计算一个变换矩阵将功能像对齐到结构像的空间。这一步并没有生成新的功能像文件只是存储了变换信息。第二步结构像配准到标准空间 (Normalise: Estimate Write)在菜单选择Normalise (Estimate Write)。Image to Align: 选择上一步用到的T1结构像。Images to Write: 选择所有需要被标准化的图像。这包括1刚才配准过的结构像本身2所有经过头动校正的功能像“r”开头的文件。你可以一次性全选。Affine Regularisation:这是关键选择默认是“European brains”欧洲脑模板。但大量研究表明不同人群的脑结构存在差异。对于中国/亚洲被试我强烈推荐你选择“East Asian brains”。这个选项会使用基于亚洲人群脑模板先验信息来约束配准过程能得到更准确、偏差更小的标准化结果。虽然不一定在所有情况下都“碾压”欧洲模板但在统计上通常能提供对亚洲被试更优的配准精度。 运行后SPM会生成两套新文件前缀为“w”的结构像如wT1.nii和前缀为“w”的功能像如wraSubject01.nii。这些“w”文件就都位于标准的MNI空间了不同被试的大脑此时具备了空间可比性。2.4 空间平滑给数据一点“磨皮”效果空间平滑顾名思义就是用一个小的高斯核可以想象成一个三维的模糊滤镜对图像进行卷积。这么做主要有三个目的1) 符合高斯随机场理论SPM统计推断的数学基础的要求2) 提高信噪比让真正的信号更突出3) 弥补不同被试间细微的配准误差。在菜单选择Smooth。Images to Smooth: 选择所有标准化后的功能像即“wra”开头的文件。FWHM: 全宽半高决定了高斯核的“胖瘦”即平滑程度。一个经验法则是FWHM设置为原始数据体素大小的2到3倍。比如如果你的功能像体素是3x3x3 mm³那么FWHM可以设为 [6 6 6]2倍或 [8 8 8]。平滑太小噪声抑制不够平滑太大会过度模糊激活区损失空间分辨率。我通常从2倍开始尝试。 点击运行生成的文件前缀会变成“sw”例如swraSubject01.nii。至此预处理全部完成。你的数据已经从“原始矿石”变成了“精炼材料”整齐、干净、可比随时可以送入统计分析的“熔炉”了。3. 一阶统计分析构建你的实验模型预处理后的数据每个体素都有一条随时间变化的时间序列。一阶分析或称个体水平分析的目的就是用一个统计模型最常用的是一般线性模型来检验每个体素的时间序列信号在多大程度上可以由你的实验设计比如“看图片” vs “休息”来解释。简单说就是找出这个被试在做实验时大脑的哪些区域被特异性地激活了。3.1 模型设定告诉SPM你的实验故事在SPM菜单点击Specify 1st-level。Directory: 选择一个文件夹用来存放这个被试的所有一阶分析结果。Units for design: 选择Seconds。这意味着你的实验设计时间将以秒为单位。Interscan interval: 填入你的TR单位是秒例如 2。Data Design - New Session: 点击添加一个新的实验会话Session。如果你的实验有多个run或session需要分别添加。Scans: 在这里选择该被试所有经过预处理时间校正、头动校正、标准化、平滑的功能像也就是那些“swra”开头的文件。注意要按时间顺序全选。Conditions: 这是核心部分。你需要定义实验条件。点击New Condition输入条件名比如Picture。然后你需要指定这个条件在什么时候发生。这通常需要一个onset起始时间点单位秒向量和一个duration持续时间单位秒向量。例如你的实验是“看图片5秒休息15秒”循环10次。那么Picture条件的onset就是[0, 20, 40, ... 180]duration就是[5, 5, 5, ... 5]共10个5。如果你有多个条件比如还有Sound条件就再新建一个。如果你有感兴趣的非实验因素比如头动参数可以在Covariates里添加把它们的影响从模型中排除。全部设置好后点击最下方的绿色运行按钮。SPM会生成一个SPM.mat文件保存在你指定的目录里。这个文件就像一个“配方”完整地记录了你的数据、实验设计和模型结构。模型设定是最容易出错的一步务必反复检查你的onset和duration是否与实验记录完全一致。我经常在这里栽跟头一个小数点输错整个结果就面目全非了。3.2 参数估计算出大脑的“反应强度”模型设定好了但模型里的参数比如“看图片”这个条件对大脑活动的效应有多大还是未知的。这一步就是利用数据通过数学方法通常是普通最小二乘法来估计这些参数。在SPM菜单点击Estimate。然后选中上一步生成的SPM.mat文件点击运行。这个过程可能会花点时间取决于你的数据量。运行结束后工作目录下会生成一系列beta_开头的文件如beta_0001.nii,beta_0002.nii...。每个beta文件代表一个模型参数回归系数的估计图。比如beta_0001可能对应常数项beta_0002对应“Picture”条件的效应大小。数值越大表示该体素的活动受该条件的影响越强。3.3 结果查看与对比找出激活区有了参数估计我们就可以进行统计检验了。我们通常关心的是不同条件之间的对比。比如“看图片”比“休息”激活了哪些脑区点击SPM菜单的Results。首先选择刚才估计好的SPM.mat文件。然后SPM会弹出一个对比管理器Contrast Manager。在这里你需要定义你的对比Contrast。给对比起个名字比如Picture Rest。在权重向量Weights vector里根据你的模型参数顺序填入对比权重。假设你的模型参数顺序是[常数项, Picture条件, Sound条件, 头动参数1, 头动参数2...]。那么要检验“Picture Rest”其实就是检验Picture条件的效应是否大于0。因此权重向量可以设为[0, 1, 0, 0, 0, ...]。如果你想比较两个条件比如Picture Sound权重向量就是[0, 1, -1, 0, 0, ...]。点击Define new contrast然后选择t-contrast最常用用于检验单向差异。定义好对比后SPM会要求你设置统计推断的阈值。这里有两个关键参数p-value (uncorrected): 体素水平的未校正p值。你可以先设一个宽松的值比如0.001看看大概的激活情况。Extent threshold (voxels): 团块大小的阈值。为了排除零散的噪声点通常要求激活区域必须由连续的一定数量的体素构成。可以设为0先不设限或者根据你的平滑核大小设一个经验值比如10个体素。点击完成SPM就会进行统计计算并在图形窗口显示一幅统计参数图。图中大脑上彩色的区域就是显著激活的脑区。你可以通过调整阈值在结果窗口点击whole brain或cluster按钮来平衡敏感性和特异性。更严格的校正如FWE校正可以控制全脑水平的假阳性率但也会更保守。在实际项目中我通常会尝试多种阈值并结合已有的文献来合理解读我的发现。最后激活的坐标可以导出用于在脑图谱如AAL中定位具体的脑区这就是你从原始数据中挖掘出的第一个“发现”。