ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

SPM处理fMRI数据高频问题与解决方案合集

SPM处理fMRI数据高频问题与解决方案合集 搞 FMRI 的人谁没被 SPM 里各种小问题折磨过不管是刚入门的研究生还是做了好几年的老手只要打开 MATLAB 敲下spm fmri就总会在某个环节碰到一个让人抓狂的报错或者一个怎么看都不对劲的结果。SPM 这个软件功能确实强大但它的很多细节设计得非常“老派”很多问题在官方文档里写得不清不楚网上答案又零零散散。我这些年用 SPM 处理过不少 fMRI 数据从 DICOM 转格式开始到预处理、一阶分析、二阶分析再到结果展示几乎每个阶段都踩过坑。很多问题其实原理并不复杂就是一些约定俗成的规矩没人告诉你。这篇东西我就把平时遇到的高频问题按处理流程整理成一个合集每个问题都讲清楚现象、原因和解决办法给正在被 SPM 折磨的朋友一份可以直接“抄作业”的避坑指南。这篇东西适合所有用 SPM 做 fMRI 数据分析的人尤其是刚开始接触、还在摸索阶段的新手。1. 数据准备与格式转换还没开始就被卡住很多人以为 SPM 的坑是从预处理开始的实际上数据准备阶段就有不少问题。这个阶段最烦人的地方在于报错信息往往看不出来是“格式”问题还是“路径”问题只能一个一个排查。1.1 图像文件读不进来的常见原因SPM 对文件格式的挑剔程度比大多数人想象的要高得多。最常见的情况是你在文件夹里明明看到了.nii文件但 SPM 的Display或者Batch界面里就是显示不出来或者点选之后直接报错。首先要确认文件是不是真正的 NIfTI 格式。有些转换工具会生成带.nii后缀但内部结构不合规的文件尤其是从某些厂商的旧型号机器上导出的数据用第三方工具转换时容易产生这种问题。SPM12 对 NIfTI 的兼容性还行但遇到这种“伪 NIfTI”还是会出现File not recognized之类的报错。另一个常见的坑是文件名和路径。SPM 对路径中的中文、空格、特殊字符非常敏感。我相信很多人都经历过把数据放在“D:\我的数据\第一次扫描\”下面然后 SPM 直接罢工的情况。解决办法也很简单数据路径务必要纯英文、无空格比如D:\fmri_data\session1\。文件夹层级也不要太深有时候路径太长也会触发不可名状的错误。提示前期数据整理时就把路径和文件名规范好能省掉后面很多不必要的麻烦。文件名建议统一用sub-01_run-1_T1w.nii这类可读性强的命名方便后续处理。1.2 图像方向不对左右颠倒的“灵异事件”用 SPM 的Display按钮查看刚转好的图像时有人会发现图像左右好像反了。这个问题的本质是 NIfTI 坐标系的约定问题。医学影像领域存在两种坐标系一种是放射学坐标系radiological图像左侧对应患者的右侧另一种是神经科学坐标系neurological图像左侧对应患者的左侧。SPM 默认按神经科学坐标系显示但有些转换工具尤其是某些 DICOM 转换软件默认使用放射学坐标系。在 SPM 里看起来“左右颠倒”往往不是数据本身有问题而是显示约定不同。检查方法很简单在 SPMDisplay里查看时注意看左上角的方向标签L/R 标记。如果担心数据本身有问题可以对比原始 DICOM 图像和转换后的 NIfTI 图像在同一个层面的显示只要没有发生镜像翻转数据处理结果就不会受影响。1.3 TR、TE 等参数在转换时的准确性fMRI 数据转换时DICOM 文件头里包含了大量扫描参数比如 TR重复时间、TE回波时间、翻转角、体素大小、层数等。SPM 做统计分析时TR 是一个非常重要的参数因为它直接关系到时间单位换算。很多人用 MRIcro 或者 dcm2nii 转换完数据就直接开始处理没有检查转换结果里记录的 TR 是否和扫描参数一致。我遇到过一位同学扫描时 TR 明明是 2000ms转换出来的 NIfTI 文件里记录的 TR 却变成了 2500ms结果整个时间序列的统计结果都偏了。所以转换完成后建议用 SPM 的Display或者任意一个能查看 NIfTI 头信息的工具比如 FSL 的fslinfo确认 TR 值。如果是用 dcm2nii 转换注意保留原始 DICOM 文件的备份万一转换出问题还可以重新来过。1.4 4D NIfTI 和 3D NIfTI 的取舍fMRI 数据通常是一个 4D 文件3D 空间 时间维但有些早期转换工具会把每个时间点都存成一个 3D 文件。SPM 两种方式都支持但处理习惯不一样。如果数据是 4D 文件SPM 在Data选择时只需要选一次后面会自动识别所有时间点。如果是成千上百个 3D 文件你在 SPM 的 Batch 里需要把整个文件夹的所有文件都选中或者用SPM12自带的文件选择工具批量选择。我个人建议尽量转换成 4D NIfTI因为文件数量少管理起来方便批处理时也不容易出错。有时候 SPM 读 4D 文件会要求确认“是否按 4D 读取”要点“是”否则它会把时间维当成单独的 3D 文件来处理后面建模时就会出现时间点数量对不上的问题。2. 预处理环节高频踩坑重灾区预处理是 SPM 处理 fMRI 数据中最容易出错的环节因为涉及多个步骤每个步骤都有参数要设置每个参数都有讲究。这里我把最常见的几个坑拎出来重点说。2.1 Slice Timing 的 slice order 填错Slice timing时间层校正是 fMRI 预处理的第一步也是最容易填错的一个步骤。不同厂商、不同扫描序列的采集顺序不一样有的从下往上顺序采集有的是隔层采集先奇数层后偶数层。SPM 的Slice timing模块里需要填Number of Slices和Slice Order。很多人就是在这里填错导致整个时间序列的对齐出现问题后续统计结果一团糟。如果扫描仪是隔层采集且层数是 32那么 slice order 应该是1:2:32, 2:2:32这种形式——先填所有奇数层再填所有偶数层。如果是顺序采集直接填1:32就行。如果不确定扫描序列的采集顺序去问扫描技师或者查看扫描协议文档千万别猜。注意Slice timing 的参考层Reference Slice选择也有讲究。一般选择时间上居中的一层作为参考比如 32 层的话选 16 或者 17。这个选择对结果影响不大但会影响预处理后数据的平滑程度。2.2 Realign 之后一定要看头动参数Realign头动校正是预处理的重要步骤它通过刚体变换把不同时间点的图像对齐到参考图像上。但很多人跑完 Realign 就直接进入下一步了从来不检查头动参数。SPM 的 Realign 会生成一个rp_*.txt文件里面记录了每个时间点在 x、y、z 三个方向的平移和旋转参数。如果一个被试的头动超过一个体素通常 fMRI 体素是 3-4mm那么这组数据的质量就很可疑了。如果头动超过 3mm 或者 3 度一般建议考虑剔除该被试或者在建模时把头动参数作为协变量加进去。我自己的习惯是Realign 跑完后用 SPM 的Check Reg功能把mean*.img和第一个时间点的图像叠加起来看看不出明显错位的话再查看rp_*.txt的最大平移和旋转值。如果发现某个被试头动过大会在项目记录里标注出来后续做敏感性分析时剔除它再跑一遍。2.3 Coregister 报错的真正原因Coregister配准这一步是把功能像和结构像对齐。常见的问题是 Source Image 和 Reference Image 的选择搞反了或者 T1 结构像没有经过重采样导致两个图像分辨率不一致。在 SPM 的 Coregister 模块里Reference Image是参考图像通常是 T1 结构像Source Image是需要被配准的图像通常是 mean 功能像。很多人把这两个搞反了结果功能像被变换到了奇怪的位置。另外一个细节是T1 结构像如果是高分辨率比如 1mm 各向同性而功能像是 3.5mm 体素Coregister 之前最好先通过Reslice或其他工具把 T1 重采样到和功能像一致的分辨率否则配准过程会非常慢而且有时会得到很差的配准结果。我在实际处理中发现SPM12 自带的 Coregister 对这种情况的处理能力有限先用Segment得到的参数再配准或者用 ANTs 这类专业工具先跑一遍效果会好很多。2.4 Normalize 之后图像变暗或体积变小Normalize空间标准化的目的是把个体脑图像变换到标准空间MNI 空间这样不同被试的数据才能放在一起比较。但有人跑完 Normalize 后发现图像变暗了或者体积变小了以为数据出了问题。图像变暗的原因很可能是 Normalize 之后的图像经过了调制Modulation处理。如果选择的是 DARTEL 流程并且勾选了“Modulated Normalisation”那么图像体素的值会乘以一个缩放因子以保持总体积不变视觉上看起来就会变暗。这是正常现象。体积变小则可能是参数设置问题。如果 Normalize 时选择的 Voxel Size 比原始体素尺寸大比如原始体素是 3mm 各向同性你在 Normalize 的 Voxel Size 里填了 8mm那输出图像的体素数量就会变少体积看起来自然变小了。常用做法是保持 Voxel Size 和原始数据一致比如 3mm 或 2mm。还有一个容易忽视的问题Normalize 后生成的文件名前缀是w比如wraf*.nii或wrar*.nii这表示它已经被变换到了标准空间。后续 Smooth 时应该选择这些带w前缀的文件而不是原始文件。2.5 Smooth 的 FWHM 到底选多大Smooth空间平滑的 FWHM半高全宽参数选择也是一个经典问题。SPM 默认值是 8mm很多人就直接用默认值也不知道为什么。FWHM 的选择和原始体素大小、期望检测的效应空间尺度有关。如果体素是 3.5mm 各向同性那么 8mm 的 FWHM 是一个比较合理的选择既不会过度平滑丢失细节也不会因平滑不足导致统计检验的随机场假设不满足。如果原始体素比较小比如 2mm可以适当减小 FWHM 到 6mm。需要注意的是Smooth 后的图像应该保存在带s前缀的文件中比如swraf*.nii后续统计建模时选择的是这些文件而不是原始文件。实操心得Smooth 的 FWHM 不宜小于原始体素大小的两倍。过小的 FWHM 会导致统计检验时体素之间不满足独立性假设容易产生假阳性结果。这个原则很多人不知道但在审稿时可能会被问到。3. 统计建模看起来能跑结果却经不起推敲预处理做完之后数据已经有了sw*.nii开头的文件接下来就是建立统计模型。这个阶段的坑更隐蔽因为你往往要到出结果的时候才发现有问题。3.1 条件名称不能以数字开头这是一个非常细碎但非常常见的问题在 SPM 的一阶分析fMRI model specification中Condition的Name不能以数字开头。比如你给条件取名1-back或2backSPM 会直接报错或者生成的设计矩阵奇奇怪怪。原因是 SPM 内部会把条件名称作为 MATLAB 的变量名使用而 MATLAB 变量名不能以数字开头。解决办法很简单在条件名称前加一个字母比如c1_back或Cond_2back。我见过有人在这个问题上卡了很久一直以为是数据问题结果就是名字没起对。3.2 Onset 的单位是秒不是扫描层数在一阶分析的 Onset 设置中SPM 要求填写的 Onset 单位是“秒”而不是扫描的层数或时间点编号。很多人在这里出错尤其是用某些自动化流程导出的 Onset 文件是时间点编号的形式直接填进去后模型的时序完全错乱。还有一种情况是有些任务程序记录的 Onset 是以扫描层数为单位需要乘以 TR 换算成秒。比如第 20 个时间点TR 为 2 秒那么 Onset 就是 40 秒。做这一步时务必统一单位最好在 Onset 文件的表头写清楚单位并且保存一份原始记录以备核查。3.3 设计矩阵秩亏有人掉进陷阱却不自知设计矩阵Design Matrix的秩亏rank deficiency是 fMRI 统计分析中一个常见但容易忽略的问题。SPM 在估计模型时会显示设计矩阵的图形如果你发现设计矩阵的某些列看起来完全一样或者有某列全为零那就说明存在共线性问题。共线性通常发生在多个条件之间存在高度相关的刺激序列时或者某个条件在某次扫描中根本没有出现。后一种情况更隐蔽——如果一个 run 里没有呈现某个条件但你在构建模型时仍然把该条件加进去了SPM 虽然可能不会报错但该条件的参数估计结果会毫无意义。建议在建模之前先检查每个 run 的 Onset 文件确认每个条件都有实际出现。如果某个 run 中某个条件缺失可以把这个 run 单独建模或者在其他 run 中对该条件进行估计后再做组分析。3.4 多个 run 的处理Replicate 还是 Concatenate一个被试通常有多个 run扫描序列段。在 SPM 的一阶分析中有两种处理方式Replicate 和 Concatenate。Replicate 是指把多个 run 作为“重复测量”来建模SPM 会为每个 run 分别估计参数然后通过二阶分析比较不同 run 之间的差异。Concatenate 则是把所有 run 拼接成一个长的时间序列来建模前提是各个 run 的扫描参数TR、层数、体素大小完全一致。大多数情况下建议使用 Replicate 方式处理多个 run因为这种方式能更好地处理 run 之间的头动差异和时间效应。如果用 Concatenate需要在建模时添加额外的 regressor 来补偿 run 之间的基线漂移操作复杂度高还容易出错。3.5 二阶分析时选错文件一阶分析完成后每个被试会生成一组con_*.img对比图像文件。二阶分析比如单样本 t 检验需要选择的输入文件就是这些con_*.img或con_*.nii文件。很多人在这里犯的错误是选择了spmT_*.img文件或者选择了某个特定条件下的beta_*.img文件。记住一个原则二阶分析的输入永远是对比图像contrast images不是 beta 图或统计图。con_*.nii文件记录的是每个被试在某个对比下的效应大小最适合做组分析。实操心得在 Batch 编辑器里设置二阶分析时务必使用Factorial design或One-sample t-test模块并且输入文件类型选择contrast images。选错文件类型的结果就是你的组分析结果完全不可信而且这个过程不容易察觉。3.6 结果校正方式FWE、FDR 和 uncorrected查看统计结果时SPM 会提供多种校正方式FWEFamily-Wise Error、FDRFalse Discovery Rate和 uncorrected未校正。很多新手不知道选哪种看到有显著的 voxel 就高兴却忽略了校正问题。FWE 是最严格的校正方法通过随机场理论Random Field Theory控制多重比较带来的假阳性。FDR 相对宽松一点控制的是假发现率。uncorrected 则完全不校正只在探索性分析中使用。在功能像分析中voxel-level的 FWE 通常比较严格如果样本量不大可能很难达到显著。这时可以看cluster-level的校正结果它是以簇连通的显著体素集合为单位进行校正敏感性更高在神经影像文献中也被广泛接受。如果你看到 “No suprathreshold clusters” 的提示首先不要慌。这可能是因为阈值设置太高校正方式太严格或者数据本身效应不够强。可以尝试调整 p 值阈值比如从 0.001 放宽到 0.005或者切换校正方式看看是否有体素达到显著。4. 批处理、脚本与进阶提示SPM 的 GUI 界面虽然便于手点但处理大量被试时效率太低而且容易出错。用 Batch 编辑器和脚本可以大大提高效率和可重复性。4.1 Batch 编辑器里 Dependence 的用法SPM 的 Batch 编辑器支持通过Dependence机制让后续步骤自动获取前一步的输出。比如 Realign 生成mean*.img后Coregister 需要mean*.img作为 Source Image此时就可以在 Batch 中把 Coregister 的 Source Image 设为 Realign 输出的mean*文件的 Dependence。很多刚开始用 Batch 的人喜欢在每个步骤里手动选择文件这样容易选错而且无法复用。用 Dependence 之后整个预处理流程可以一键跑完中途不需要人工干预。这个功能我用得非常频繁强烈推荐。具体操作是在 Batch 编辑器中把流程的各个模块拖到同一棵树里然后在需要依赖前一步输出的参数位置右键选择Dependence再选择对应的模块输出字段。SPM 会自动把前一步生成的文件填进去。4.2 从 GUI 操作生成脚本入门脚本的最佳捷径SPM12 提供了一种方式在 GUI 里设置完整个 Batch 后点击Save或Run时选择生成.m脚本文件。这个脚本文件可以在 MATLAB 中直接运行也可以编辑修改后复用。我的习惯是第一次处理时用 GUI 操作一遍同时生成脚本之后所有数据的处理都在脚本基础上微调不再经过 GUI。这样不仅效率高还能保证所有被试的处理流程完全一致这是 fMRI 数据分析的基本要求——可重复性。对于想进一步自动化的朋友SPM 的脚本本质上是调用 MATLAB 函数比如spm_preproc、spm_normalise、spm_smooth等。你完全可以在理解这些函数参数的基础上编写自己的循环脚本批量处理多个被试。这个过程虽然初期麻烦但一旦写好后续数据处理会非常轻松。4.3 MATLAB 路径里的中文、空格和内存问题SPM 是在 MATLAB 环境里运行的因此 MATLAB 的路径问题也会直接影响 SPM 的使用。第一SPM 工具箱所在的路径不能有中文或空格。比如你把 SPM12 安装在C:\Program Files\SPM12这种带空格的路径下有时候会触发奇怪的错误。建议安装在D:\toolbox\spm12这种纯英文、无空格的路径下。第二SPM 的数据处理非常耗内存。预处理阶段只要Smooth一个步骤就会同时加载多张图像内存不够时 MATLAB 会直接报Out of memory。解决办法包括关闭其他不必要的 MATLAB 窗口、在 MATLAB 中减少自动保存的暂存变量、使用 64 位版 MATLAB这是硬性要求。第三如果数据量特别大建议分批处理不要一次性把 20 个被试的所有 run 都放进同一个 Batch。我一般以 5-6 个被试为一批跑完一批再跑下一批这样既不会爆内存也方便中途发现问题及时修正。4.4 结合外部工具提升效率SPM 虽然功能全面但有些流程用起来并不顺手。我在实际项目中经常搭配一些外部工具来提升效率和结果质量。Artifact Detection ToolsART是一个非常实用的工具箱可以自动检测时间序列中的异常信号比如头动尖峰、伪影生成一个包含异常时间点的 regressor 文件。把这个 regressor 加入一阶模型作为协变量可以显著降低头动和伪影对统计结果的影响。很多顶刊文章都会报告用了这种“scrubbing”或“regressing out motion outliers”的方法。xjView 是另一个常用的结果显示工具它基于 SPM 的输出结果提供更丰富的可视化选项。SPM 自带的Results界面功能比较基础xjView 能展示三维脑图、导出表格数据、做 ROI 分析而且在多个模板MNI、Talairach之间切换坐标。我通常在Results界面里找到显著的簇后用 xjView 生成可发表级别的脑区图。DPABIDPARSF 的升级版则是基于 SPM 的图形化界面把整个预处理和统计流程串联起来适合追求便捷的初学者。不过它本质上还是调用 SPM 的函数所以理解 SPM 本身仍然是第一位的。4.5 排查问题的方法论从日志到 Check Reg最后说一点通用的排查思路。SPM 报错时首先看命令行窗口的完整报错信息那里通常会提示是哪个模块、哪一步出了问题。如果报错信息很抽象可以在 MATLAB 中进入 SPM 模块所在的目录查看对应函数代码找到报错的行号理解触发条件。对于结果显示类的问题比如图像显示异常Check Reg 是一个非常实用的功能。它允许你把多张图像叠加显示快速检查配准、归一化是否成功。我几乎每步预处理后都会用 Check Reg 检查一遍尤其是 Realign 和 Coregister 之后。如果你遇到一个完全没见过的问题不要独自纠结。SPM 有非常活跃的用户邮件列表[email protected]搜索历史邮件通常能找到答案。在提问之前先确认自己的 SPM 版本号、MATLAB 版本号、数据格式并且提供完整的报错信息这样别人才能帮你定位问题。另外要养成记录处理日志的习惯。我曾经通过对比两台电脑上相同的处理流程输出定位到一个因 SPM 版本细微差异导致的结果不一致问题。这给我提了个醒合作项目中所有人尽量使用相同版本的工具结果才具备可比性。整理这个“小问题合集”的过程也是我对自己 SPM 使用经验的复盘。这里面很多坑不是看文档就能避开的而是要在实际操作中一点点踩过来才知道怎么绕。如果你正被某个问题卡住希望这里有你要的答案。如果没找到先按上面提到的几个方向去排查——格式、路径、单位、参数约定排除掉这些之后绝大多数问题都迎刃而解。
返回列表