☰
fMRI与PET跨模态空间相关分析:JuSpace工具箱从安装到实战全攻略
2026/10/2 15:43:02 网站建设 项目流程

很多做脑影像研究的朋友应该都遇到过这种尴尬:手里有一张漂亮的fMRI激活图,或者刚跑完VBM分析拿到灰质体积差异图,老板随口问一句“这个脑区和多巴胺系统有关系吗”,你当场就愣住了。常规的GLM分析根本回答不了这种问题,因为fMRI信号本身不包含受体密度的信息。JuSpace这个基于MATLAB/SPM12的工具箱,就是专门用来做这类跨模态空间关联分析的,它能把你的功能影像图和神经递质受体/转运体PET模板放到同一个MNI空间里做体素级相关性计算,直接回答“激活模式和哪个神经递质系统共定位”。

这篇文章我会从实际使用的角度,把JuSpace到底能做什么、装起来要注意什么、跑分析的完整流程、结果怎么解读,以及我测试过程中踩过的坑全部过一遍。无论是刚入门需要找个工具完成“神经递质共定位”分析的新手,还是想系统了解这个工具箱边界的老手,都应该能从里面捡到点有用的东西。

1. 从fMRI激活图到神经递质关联,JuSpace到底解决了什么

神经影像领域有个很经典的痛点:功能磁共振能告诉你哪些脑区被激活了,PET分子影像能告诉你在某个脑区里多巴胺D2受体密度有多高,但两种模态的数据天生就不在一个坐标系、不在一个分辨率、来源还是不同的受试者。过去想把它们联系起来,基本只有两条路,一条是手动画ROI提取平均激活值和受体结合势,做个小样本的相关分析,另一条是直接目测“看起来差不多嘛”,然后写进讨论里——后者显然是学术不端的高危地带。

JuSpace的思路很有意思,它不要求你的数据里面有PET信息,它直接把已经发表的、公开的神经递质受体密度模板当成“空间指纹”,然后把你的脑图跟这些指纹做逐体素的皮尔逊相关,算出一个总体相关值。这个值就代表“你的激活模式在多大程度上和某一种神经递质系统的分布模式一致”。

从我实际应用的经验来看,它最有价值的应用场景集中在三个方向。

第一个是解释任务态fMRI的激活模式。比如说你做了一项药物相关的fMRI研究,发现某个认知任务显著激活了腹侧纹状体、前扣带和眶额叶,想论证这个激活网络确实和奖赏/多巴胺系统有关,JuSpace就能一键给出激活图与多巴胺D2受体模板的空间相关系数和显著性水平。第二个场景是静息态或疾病人群研究,比如抑郁症患者的某个功能连接异常模式,到底更接近血清素转运体(SERT)的分布还是去甲肾上腺素系统的分布,这类问题JuSpace可以直接做横向比较。第三个是VBM/皮层厚度分析,研究者经常拿到一张灰质萎缩图,想看看萎缩模式是否选择性对应特定的神经递质系统,这在帕金森病、精神分裂症研究里尤其常见。

JuSpace的前置输入门槛也值得一提:它要求的所有图像都必须是MNI标准空间里的,且已经完成分割配准等预处理。换句话说,如果你手头的图像还在个体空间,得先用SPM12的normalise或者DARTEL推到MNI空间。这个前置条件既是门槛也是优势,它能保证所有图像在同一个解剖坐标体系里做计算,避免因空间不匹配导致的伪相关。

对于刚上手的读者,我建议不要一开始就追求特别复杂的分析,先理解清楚这个核心逻辑:配准到同一空间、逐体素提取数值、算空间相关、再用置换检验评估显著性,后面所有功能都是这个逻辑的延伸。

2. JuSpace的运行基础:MATLAB、SPM12与工具箱安装

JuSpace不是独立软件,它本质上是一套跑在MATLAB里的脚本和函数集合,依赖SPM12的图像读取、配准和显示功能。安装这块看似简单,但我在帮不同人配环境时发现,出错的基本都集中在版本匹配和路径设置上。

2.1 版本选型:MATLAB、SPM12和JuSpace的兼容矩阵

先明确一个基本认知:JuSpace目前主要在MATLAB环境下运行,对Octave的官方支持并不完整,我不建议在Octave下跑完整分析,有些内置函数会报错。

MATLAB版本方面,我用过R2018b到R2023a,都能正常运行。如果你的MATLAB版本过老(比如R2015a之前),SPM12本身就可能跑不起来。SPM12的版本倒是没什么岔子,建议直接去SPM官网下载最新release版本,然后解压到一个路径里不含中文和空格的目录,比如D:\Tools\spm12,这一点非常关键。

JuSpace本体可以从它的官方网站或者GitHub仓库下载。下载下来是一个名为JuSpace_v1.x的文件夹,里面包括核心函数、PDF手册、示例数据和一个脚本目录。个人建议永远下载最新版,因为早期版本里空间相关性的置信区间计算存在一些统计学问题,后续版本才对置换检验的伪随机数种子做了修正。

2.2 安装配置的完整路径

安装流程其实就三步。

第一步,把JuSpace文件夹和SPM12文件夹放到同一个大目录下,比如D:\Tools\里面同时存在D:\Tools\spm12和D:\Tools\JuSpace_v1.3。第二步,启动MATLAB,先添加SPM12到路径并初始化。第三步,添加JuSpace到路径。不需要点击任何安装脚本,因为JuSpace本身是绿色工具箱,只要把文件夹加入MATLAB搜索路径就能用。

% 添加SPM12路径并启动 addpath('D:\Tools\spm12'); spm_jobman('initcfg'); spm; % 添加JuSpace路径 addpath(genpath('D:\Tools\JuSpace_v1.3'));

这里有个很多新手容易忽略的细节:如果只是addpath('D:\Tools\JuSpace_v1.3')而不加genpath,JuSpace的子文件夹(比如/utils、/surf)里的函数就不会被加载,运行时会报Undefined function 'spm_read_vols'或者Undefined function 'ju_getROI'之类的错误。我第一次用的时候就被这个卡了十分钟,所以请务必用genpath。

验证安装是否成功的方法很简单,在MATLAB命令行里输入:

which ju_main

如果返回了D:\Tools\JuSpace_v1.3\ju_main.m,就说明已经正确安装了。如果返回'ju_main' not found,说明路径添加有问题。

2.3 用示例数据自检

JuSpace自带示例数据,里面有预处理的PET模板、示例功能图和执行脚本。强烈建议第一次运行时先拿示例数据走一遍全流程,这能帮你确认环境本身没问题,排除掉后面自己数据出问题时的环境因素。

可以在JuSpace文件夹里找到手册(PDF格式),里面详细描述了示例数据的运行方式。一般是在MATLAB当前目录切换到示例数据文件夹后,直接运行Demo脚本,观察是否有图像显示窗口弹出、是否生成结果CSV文件。如果这里就报错了,大概率是路径问题或者SPM版本不对。

3. 实操主线:从预处理图像到空间相关分析的全流程

环境配好之后,核心环节就是往JuSpace里喂数据,拿到分析结果。这个工具箱的GUI层面做得比较规整,直接输入ju_main就能弹出一个图形界面。

3.1 输入图像的准备规范

刚才说过,所有输入图像都必须在MNI空间。这一点我重复一遍,因为它的重要性怎么强调都不过分。

在准备输入图像时,有几类常见来源。任务态fMRI的contrast图:通常来自SPM一阶分析生成的spmT_0001.img/.nii,如果你的数据经过了平滑处理就更合适,因为PET模板本身的分辨率比较低(通常是2mm或更大体素),过度锐利的激活图会导致逐体素匹配时出现很多空值体素。VBM灰质图:来自CAT12或SPM的VBM8处理结果,通常是smwc1*.nii这类调制后配准到MNI的灰质片段。PET自己的SUVR图:如果你做的是多示踪剂研究,想把受试者水平的PET图跟公开模板比较,也可以用,但要保证你自己的PET图已经经过空间标准化。

输入格式上,NIfTI(.nii)和SPM的Analyze(.img/.hdr)都能用。我建议一律用NIfTI,因为一些较新的代码路径对Analyze格式的orient信息处理有历史遗留bug。一个常见错误是拿原始DICOM往里灌,JuSpace不具备DICOM到NIfTI的转换能力,必须预先用dcm2niix或SPM自带转换工具完成。

3.2 设置分析的核心参数

启动ju_main后,主界面大致分三个区域:输入图像选择区、分析选项区、输出设置区。

在输入图像选择区,你需要指定:

  • 是否使用内置模板作为“另一组图像”,还是使用自定义的三维NIfTI图像作为目标
  • 勾选想要比较的图谱,比如多巴胺D1、多巴胺D2、血清素5-HT1A、5-HT2A、GABAa、毒蕈碱M1等

这里我要多说一句图谱选择的问题。JuSpace内置的图谱非常多,分别来自不同的公开数据集,比如Zilles和Amunts的受体图谱、Dukart等人的PET图谱等。不是所有图谱都适合所有研究问题,比如你想论证一个“奖赏网络”的激活模式跟多巴胺系统相关,那应该同时勾上D1和D2受体,但如果你的研究假设是焦虑机制,那5-HT1A和5-HT2A就是更合理的选择。勾选过多无关图谱会带来多重比较的问题,虽然工具箱内部会做FDR校正,但从研究设计的角度说,尽量基于假设挑选图谱。

分析选项区有几个关键设置,我建议这样配:

  • Correlation metric:选Pearson correlation,这是默认选项,大部分已发表文献用的都是它
  • Spatial correlation type:有Global和ROI-wise两种可选,我会在下一小节专门说明
  • Permutation number:默认1000次,如果条件允许我建议跑5000次,虽然耗时增加,但p值估计更稳定
  • Smoothing kernel:如果输入图像比较粗糙,可以在这里指定一个FWHM,但一般情况下建议输入前就在SPM里处理好,不要在这里依赖平滑

输出设置区主要就是指定结果输出目录,然后点运行。整个过程的计算量取决于图谱数量和体素数,通常一个包含多个图谱的分析在几分钟内能跑完。

3.3 Global与ROI-wise两种相关模式怎么选

这是JuSpace使用中最重要的决策点,直接影响结果的生物学解释。

Global模式是把整张图的所有体素拉成一个长向量,跟模板的对应体素向量做相关。它的优点是简单直观,回答的是“全脑范围内整体匹配程度如何”。缺点也很明显:全脑大部分体素里模板信号本来就接近于零或噪声主导,它们会稀释真正的共定位区域,导致相关r值被拉低。比如说一个激活图只在杏仁核一个小区域很明显,全局相关会被全脑大量无信号体素冲淡,r值可能很低,但不代表它们在杏仁核局部完全重合。

ROI-wise模式是把解剖分区(基于图谱自带的ROI定义)当作分组依据,每个ROI内计算一个相关值,然后汇总成每个ROI一个r值的分布。或者说,它先计算每个ROI的平均激活值和平均受体密度,再拿这一组ROI的平均值做跨区域相关。那更符合“跨脑区分布模式是否一致”这一科学问题,因为它分析的单位是脑区,而不是体素。

我的经验是:如果你的研究问题是“哪个神经递质系统与该脑区群的整体激活模式最匹配”,用Global更合适;如果你的研究问题是“一组与任务相关的脑区里面,受体密度的相对高低是否与激活强度的相对高低一致”,用ROI-wise更能抓生物学意义。

3.4 典型输出结果长什么样

跑完之后,JuSpace会在输出目录里生成几类东西。一个CSV结果表,每行对应一个图谱,包含相关系数r、未校正p值、FDR校正后的q值、置信区间等。还会生成可视化的散点图,展示体素(或ROI)值的分布和拟合线。另外会保存一个日志文本文件,记录运行参数和版本信息。

我在解读结果时有一个个人习惯:先看r值的绝对值而非直接看p值。因为对于大样本的全脑体素相关来说,即使很小的r值也可能“显著”,但生物学意义有限。一般经验上,|r|>0.3才谈得上中等程度的空间共定位,|r|<0.1即便标了显著,解释起来也要非常谨慎。之后再检查q值(FDR校正后),如果q>0.05,说明相关可能只是偶然。最后再看置信区间范围,区间若包含0,那点估计再好看也要怀疑。

4. 统计细节与结果解读:别让p值骗了你

JuSpace的分析看起来是“算个相关系数再置换检验p值”,但统计层面有几个细节如果没搞懂,非常容易得出误导性的结论。

4.1 置换检验与空间自相关的陷阱

空间影像数据有一个天然特性:相邻体素之间的值高度自相关,远不是独立样本。这种情况如果直接做普通Pearson相关的显著性检验,自由度会严重高估,p值会极度膨胀,哪怕随机生成的两张平滑图像之间也很容易算出“显著”的空间相关。

JuSpace默认采用置换检验(permutation test)来绕开这个问题。置换检验的做法是:固定形态模板,把你自己的脑图在空间上做随机旋转或者随机重排,然后重新计算相关值,重复成千上万次,得到一个零分布,最后看你真实的r值落在零分布的哪个位置,从而得到经验p值。

这里有个重要的使用建议:置换次数不要太省。1000次置换下,p值的最小分辨粒度是0.001,5000次能得到更平滑的零分布,接近更精细的小数。对于要投稿的论文,建议用5000次甚至10000次,审稿人可能会质问统计细节。

4.2 多重比较校正的必要性

如果你一次勾选了十个图谱,等于在同一样本上做了十次相关检验。未校正的p值里总会有几个侥幸显著,这是纯粹的概率问题,不是真实生物学信号。JuSpace提供了FDR校正选项,它会基于Benjamini-Hochberg方法对图谱维度上的p值做校正。

但从研究设计的角度,我建议在选图谱阶段就控制数量,而不是事后依赖校正。一个理性方案是:正式分析只选基于文献有明确先验假设的两三个图谱,把其他图谱的内容放到补充材料中作为exploratory结果呈现,并明确标注未经多重比较校正。

4.3 结果解释三原则

解释JuSpace的“显著相关”时,我给自己定了三个原则,防止过度解读。

第一,空间相关不等于因果关系。你的激活图与D2受体分布高度相关,并不能证明激活是由D2受体介导的,更不能证明受体密度高导致了激活强,只能说共定位,或者说空间分布一致性高。很多新手容易在这一步翻车,动不动就写“activation was driven by dopaminergic denervation”,审稿人一眼就能看出来是过度推断。

第二,空间相关不等于个体水平的关联。JuSpace比较的是空间分布模式,它的输入是所有受试者混合后的平均效应图,而不是受试者水平的变化配对。如果想回答“个体间多巴胺功能差异是否预测个体激活差异”,需要做的是个体水平的PET-fMRI融合分析,用SPM的biological parametric mapping或者贝叶斯融合方法,JuSpace并不适合这个任务。

第三,存在潜在的人为共线性。比如一个激活图在灰质区域广泛分布,而受体模板本身在灰质中也广泛分布,那灰质/白质的边界本身就能制造出大量“共同为0”的体素,推高相关值。因此JuSpace在上传输入图像时通常建议做灰质掩膜,只保留灰质体素计算相关,减少这种人为共线性。

5. 实测中频繁踩到的坑与排查思路

我觉得这部分应该是这个工具箱用户最需要的。我在自己分析数据和帮别人调试的过程中,陆陆续续遇到好几类问题,解决起来说难不难,但如果没有头绪会非常消耗时间。下面按我踩坑的实际顺序和逻辑链条来写。

5.1 坑一:输入图像方向不一致导致相关值异常

有次我拿到合作者给的contrast图,他们自己用FSL做了配准,但没有严格检查图像朝向。结果JuSpace跑出来的相关值几乎全是负数,散点图上一团乱。我第一反应以为是代码bug,后来把图像拖到MRIcroGL里一看,发现那张图的左右朝向和内置模板是反的。

FSL配准到MNI的默认输出与SPM的LPI坐标系在某些设置下确实可能镜像颠倒。检查方法不复杂,在MRIcroGL或者SPM的Display功能里对比一下你的图像和模板在相同MN坐标(比如(0, -50, -20),应该是小脑蚓部附近)位置上是否对应。

解决办法要么在FSL里加--out参数设置强制方向,要么用SPM的reorient功能重置origin并且检查方向矩阵。这里我的建议是:任何外部来源的nii图像,进入JuSpace之前一律用SPM Display逐层扫一遍再进流程。

5.2 坑二:图像分辨率与模板不齐导致nii读取报错

有次我输入一张体素大小为1.5mm等方的高分辨率结构像,JuSpace直接报错说图像维度与模板不匹配。后来查了一下,JuSpace内置模板大多是2mm体素,如果你的输入图像不是2mm且在同一个网格上,它内部的图像重采样步骤可能会有些版本兼容问题。

具体表现是报错信息类似于Error using spm_sample_vol或者Voxel coordinates out of bounds。最快的解决方案是在输入JuSpace之前,用SPM的imcalc或者spm_resample把所有图像统一重采样到与模板相同的2mm网格。甚至可以简单粗暴地直接用SPM的Normalise模块把图像重新写入到TPM.nii的网格上。

我个人的工作流程是在跑完一阶分析之后,专门做一个“JuSpace准备”的批量脚本,把图统一重采样到2x2x2和模板网格,做好灰质掩膜,再存成一个专门的分析文件夹。

5.3 坑三:MATLAB内存不足导致置换检验崩溃

置换检验5000次,加上若干图谱,MATLAB需要在内存里反复读取和运算图像数组。默认Java堆内存不足时,可能在运行到一大半时直接崩掉,说明你是第一次跑这个分析,什么都没保存,心态很容易崩。

解决办法分两步。第一步,运行前先调大MATLAB的Java堆内存和系统可用内存,在MATLAB的Preferences里把Java Heap Memory调到最大可用值(比如4GB以上)。第二步更稳妥:如果你的输入图像体素不超过8mm,可以在JuSpace里启用低内存模式(部分版本有这个选项),它会将图像数据转化为单精度(single)数组并分批读取。

如果是在服务器上跑无界面MATLAB,记得在启动命令里预留内存,比如matlab -nodesktop -nosplash -r "...",并确保系统物理内存足够大。

5.4 坑四:ROI-wise模式下结果解读失真

ROI-wise模式虽然好用,但有一个坑:计算每个ROI的平均受体密度时,不同图谱的ROI划分原则并不完全一致。有些图谱是根据组织学边界画的细碎ROI,有些是功能分区的大ROI,这种情况下跨图谱比较ROI数量就不公平。

具体来说,如果某个图谱将扣带回拆成背侧和腹侧两个ROI,而另一个图谱将整个扣带回合并为一个ROI,那基于ROI均值的相关分析背后对应的样本量就不同,可能导致r值不可比。

所以我在用ROI-wise做多图谱横向比较时,会先检查每个图谱的ROI数目和名称,尽量选择ROI划分原则相近的图谱做直接比较,或者在方法部分明确写出每个图谱的ROI数目,让读者能够理解结果的可比性边界。

6. 进阶玩法:多图谱比较、支持向量回归与自定义图谱

基础的空间相关分析跑通之后,JuSpace还提供了几个进阶功能,我简单介绍一下它们能做什么,以及什么时候值得用。

6.1 进行多个神经递质系统之间的“竞争性比较”

基础模式是单独比较你的脑图与每个图谱的相关性。进阶玩法是在一次分析中放入多个图谱,JuSpace支持把多个图谱作为多元预测变量,然后计算你的脑图与它们的整体偏相关,或者比较不同图谱的r值是否有显著差异。这在回答“这个激活模式更接近多巴胺系统还是血清素系统”这类问题时特别有用。

有一个关键注意点:不同图谱之间往往高度相关(比如D1和D2受体在某些脑区的分布模式本身就相似),所以即使你在结果里看到与D1的r值大于与D2的r值,也不一定能说明你的脑图选择性地更接近D1系统。最好在补充材料里报告图谱两两之间的相关性矩阵,帮助读者评估独立贡献。

6.2 支持向量回归的用法与限制

JuSpace还内置了基于支持向量回归(SVR)的编码模型,允许你反向考察:给定你的脑图作为因变量,多个图谱作为自变量,能不能用神经递质分布的组合模式来预测你的激活图的空间分布。

这种思路比简单相关更进一步:它能告诉你某种神经递质组合在多大程度上解释了全脑激活模式的空间差异,还能给出每个图谱的权重向量。需要注意的是,SVR的样本量衡量单位是体素/ROI,它的权重不一定稳定,特别是当图谱数量多、体素较少时容易过拟合。要小心不要在解释权重时过度因果化。

6.3 自定义图谱与基于表面数据的分析

除了内置的PET图谱,JuSpace允许你加载自定义的三维NIfTI模板,这意味着你可以把任何自己感兴趣的空间标记图(比如某个基因表达的脑图谱、钙结合蛋白分布图)拿来跟自己的脑图做同样的空间相关分析。

另一个有趣的方向是表面数据分析。虽然JuSpace的核心流程是体素级的,但如果你只有基于FreeSurfer生成的皮层表面数据(如厚度图或recon-all的mri文件),也可以先将表面图投射到体积空间之后再进入JuSpace。这一步通常用FreeSurfer的mri_surf2vol完成。相对麻烦一点,但能扩展工具的使用场景。

如果将来我写续篇,我会专门把“表面数据如何安全地转成体积数据并保留顶点对应关系”这一个操作单独拆出来写一篇完整的做法,因为里面坑实在太多了。

7. 总结与个人经验

最后这一段我想说点更贴近实际的个人感受,而不是再重复一遍上面的操作步骤。

JuSpace这类工具的定位,本质上是一个“空间共定位快速验证器”,它的价值不在于替代你的统计模型,而在于用极低的成本把一个原本很难回答的跨模态问题变成一张可以放进论文的结果图。对大多数期刊审稿人来说,一张“激活图+受体图谱空间相关散点图”的说服力,往往比三五行“previous studies have shown...”的讨论文字强得多。

我在实际使用过程中最大的体会是:JuSpace跑起来太轻松了,以至于人们容易低估输入数据质量的重要性。如果输入的图像质量不行,跑出来的r值再高也不要信。我给自己定了一条铁律:任何进入JuSpace的图像,都要先在SPM里肉眼检查方向、对齐、覆盖范围三步,不符合要求的直接打回重做,绝对不带着问题做分析。另一个值得养成的习惯是保留所有运行参数和版本号,JuSpace这类工具箱更新频繁,不同版本跑出来的置信区间可能略有差异,论文投稿前务必记录工具箱版本,避免审稿人要求复现时对不上。

如果目前的公开模板还不能覆盖你的研究需求,建议关注新版JuSpace的发版公告,其开发者社区也会根据领域内新的公开图谱持续更新内置库。上手之后,再回来看文章开头那些“跟多巴胺系统有关系吗”的问题,你会很自然地回答:跑一下不就知道了。

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

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

立即咨询