做了几年脑影像分析,我最大的感受就是很多人不是不会点鼠标,而是卡在“跑完预处理之后怎么办”这一步。就拿cat12做SBM(Surface-Based Morphometry,基于皮层表面的形态学分析)来说,好不容易把T1像分割、表面重建、厚度估计、平滑这一整套流程跑完,到了统计阶段就开始犯难:到底该在vertex水平做全皮层双样本T检验,还是把指标抽到ROI里做区域水平的双样本T检验?这两个选择看上去只是分析粒度不同,但实际上会直接改变你的研究结论、图表呈现方式,甚至影响审稿人是否会质疑你的多重比较策略。
这篇文章就把我个人基于cat12完成SBM的ROI统计、并分别进行vertex水平与ROI水平双样本T检验的完整流程讲清楚。我会覆盖预处理要点、SPM统计模型搭建、ROI指标提取、常见坑与排查方法,适合正在学习cat12、准备做两组被试皮层形态学对比的神经影像方向研究生和从业者。内容全部来自实际操作经验,不是照着手册念。
1. 项目到底在做什么:SBM统计的基本盘
1.1 不是VBM,是SBM:两类形态学分析的差异
很多刚入门的朋友会把VBM和SBM混在一起。VBM(Voxel-Based Morphometry)是把T1像分割成灰质、白质、脑脊液,然后在一个体素一个体素的水平上比较灰质体积或密度。SBM的思路不同:它先在灰白质界面上重建出皮层表面,再在这个表面上逐点计算皮层厚度(Cortical Thickness)、褶皱指数(Gyrification Index)、分形维度(Fractal Dimension)、皮层复杂度等指标。
SBM在ROI统计上有天然优势。皮层厚度这个指标本质上就是在皮层表面“垂直于皮层的距离”,它是一个逐顶点的属性,所以既可以沿着整个皮层表面做全顶点检验,也可以把某一组顶点归并成一个解剖区域后取平均值。这种“既能在vertex上精细定位,又能退回到宏观区域做概括”的特性,让SBM很适合两类分析策略并行。
VBM的统计分析通常基于体素,如果要做ROI提取,你得先把灰质密度投到模板空间再拿到ROI里取均值。SBM则不同,它的ROI提取是在表面网格上完成的,ROI边界更贴合解剖结构。这也是为什么我建议课题目标涉及皮层形态时,优先考虑SBM,而不是只用VBM跑一套。
1.2 vertex水平与ROI水平:两种分析粒度的本质
先说vertex水平。cat12默认会将每个半球的皮层表面重采样到大约十几万到三十多万个顶点,每个顶点都对应一个厚度值或GI值。双样本T检验时,检验会在每一个顶点上单独进行,最终得到一张全脑的统计图。这种做法不依赖先验区域假设,适合做探索性分析,但代价是顶点数量巨大,必须做严格的多重比较校正,否则假阳性会爆炸。
ROI水平则完全不同。你先把皮层划分为若干个解剖区域,每个区域里的几千个顶点求均值,得到每个被试每个ROI的一个数字。这样分析单元从顶点变成了区域,多重比较的次数一下子从十几万降到了几十到一百多个,统计检验的负担小得多。这种策略适合有明确假说、只关心特定脑区的验证性研究,也适合后续做效应量、相关分析或者与其他模态数据联合建模。
但这里有个常见的误解:ROI水平T检验不等于“一定比vertex水平更显著”。它只是让检验的自由度和多重比较压力发生了变化,具体结果取决于真实效应在空间上的分布。如果效应只局限在某一小块皮层,vertex水平可能反而更容易捕捉;如果效应弥散在整个ROI内,那ROI均值检验通常更稳。
1.3 项目工作流总览
整个项目从原始T1像到最终统计表格,大致遵循下面这条链路:
- 数据整理与匿名化;
- cat12分割与表面重建;
- 质量检查与异常被试处理;
- 数据平滑;
- vertex水平双样本T检验;
- ROI指标提取;
- ROI水平双样本T检验;
- 结果整理与图表呈现。
下图不画了,直接把这条链路每个环节的操作要点拆开讲。留心一点:不要在脑影像分析里跳过质量检查直接进入统计,这是所有后续bug的最大来源。
2. 从数据到可用统计量:SBM预处理的完整链路
2.1 数据准备:格式、路径和分组
这一步没有技术含量,但90%的中途报错都源于此。先说格式:cat12直接支持NIfTI格式(.nii或.nii.gz),如果你手里是DICOM序列,建议用dcm2niix批量转换成NIfTI。转换时注意保存为3D单文件格式,不要转成4D时间序列,虽然T1本身是3D,但有些扫描序列在转换时可能因为方向信息不完整被拆成多个文件,这种数据不要直接用。
再说目录组织。我给每个被试单独建一个文件夹,内部结构类似:
sub-01/ ├── anat/ │ ├── sub-01_T1w.nii.gz │ └── sub-01_T1w.json sub-02/ ├── anat/ │ ├── sub-02_T1w.nii.gz │ └── sub-02_T1w.json这里强调三点:
- 路径中绝对不能有中文、空格、特殊符号,尤其是Windows系统下,带中文路径很容易让MATLAB/SPM在处理中途静默失败;
- 给每个被试起名字用“sub-编号”这种格式,比“张三”“control1”之类的命名规范得多;
- 分组信息一定要单独记录在Excel或CSV里,包括组别、年龄、性别、颅内总体积(TIV/ICV)等协变量,后续统计时这些是要一起进模型的。
另外提醒一句:涉及被试数据的项目务必先做匿名化处理并确认伦理审批。T1像如果带有面部重建信息,发布前也要考虑去除面部特征,很多预处理工具都内置了去面部功能。
2.2 cat12 SBM流程的关键参数
在MATLAB里启动cat12后,先打开Segmentation模块。这里要选对输入图像,把每个被试的T1加权像添加进去。跑起来后,cat12会先做空间配准,然后进行分割和表面重建,输出内容除了常规的灰质、白质、脑脊液概率图之外,还会在输出目录里生成一个surf文件夹,里面包含左右半球的central surface、thickness、area、GI等表面数据文件。
不同cat12版本对表面文件的名字略有差异,常见的是包含freesurfer或resampled字段的文件。需要记牢的是:SBM统计分析用到的数据是表面文件,不是灰质体素图。很多人分不清“我跑完了cat12 Segmentation,出来的p1/p2/p3是什么”,p系列是体素级分割产物,供VBM使用;SBM要看surf目录下的表面文件。
分割运行前有几个参数值得动一下:
- Dartel或Shooting:选择空间归一化方法,通常用默认设置即可,但Shooting在皮层厚度分析中更常见;
- Surface Resolution:默认会重采样到32k或164k,除非你有特殊需求,否则保持默认;
- “Use surface thickness estimation”这个选项要确保打开,否则可能只输出central surface而不输出thickness。
2.3 质量检查:不能跳过的关卡
每次跑完分割,我建议先不要急着平滑和统计,而是看一遍质量检查结果。cat12的Segment界面里有一个“QA”按钮,可以查看每个被试分割后的数据质量评分。更实用的做法是用cat12的“Check sample homogeneity using covariance”功能,把所有被试的指标放到一起去查离群点。
我实操中的标准是:
- 质量评分中每分钟都可能出现异常,但重点关注低于整体样本均值2到3个标准差的被试;
- 不在第一步就删数据,而是先回到原始T1看是不是有运动伪影、金属伪影或者脑组织缺损;
- 如果原始图像质量确实不佳,考虑剔除或者用更保守的方法再处理。
这一步的重要性在于:vertex水平的T检验对个别坏数据极其敏感。皮层重建一旦出现严重错误,局部厚度值会出现极端异常,直接导致局部统计结果被这个被试主导。你有再好的统计校正方法也救不回来,因为错误是系统性的,不是随机噪声。
2.4 平滑核的选择:我为什么喜欢15mm
平滑在SBM里有两个作用:一是提高信噪比,二是让顶点的统计误差更接近Gaussian Random Field的假设,便于后续FWE校正。cat12处理后的表面数据虽然已经具有一定平滑度,但统计前通常还会再人为平滑一次。
常见的平滑核有10mm、15mm、20mm。用多大的核没有绝对统一标准,但我的经验是:
- 做全皮层vertex水平T检验时,15mm是一个相对均衡的选择,既能抑制顶点间噪声,又保留了足够的空间分辨率;
- 如果关注小而局限的脑回区域,10mm更合适;
- 如果要做ROI水平的均值比较,平滑核的选择对结果影响较小,因为ROI均值本身就是一次大范围的平均;
- 有一些研究建议报告多个平滑参数下的稳健性结果,但这会增加计算负担,建议只在关键结果上做敏感性分析。
平滑入口在cat12的Surface模块下,选好平滑后的数据保存路径,设置好FWHM参数,运行即可。注意不要在原目录上直接覆盖,否则后续需要重新跑平滑才能对比不同参数。
3. vertex水平双样本T检验:在SPM里配置与跑通
3.1 数据入口和统计模型选择
打开cat12的Surface模块,会看到一系列功能,包含平滑、统计模型、结果提取等。要搭双样本T检验模型,选择“Statistical Model”或类似的入口(具体名称视版本而定,有些版本叫Basic Models),然后选择“Two-sample t-test, unpaired”。表面上看起来是在cat12里操作,本质上它调用的还是SPM的统计框架,只是数据对象从体素图变成了表面文件。
进入模型配置界面后,需要分别选择两组被试的surface数据。假设我们比较的是患者组和健康对照组,组1选患者组每个人的皮质厚度文件,组2选健康对照组每个人的皮质厚度文件。文件对应关系要注意:每组所有被试的surface数据必须来自同一个前缀和同样的重采样模板,否则配准空间不一致,统计结果毫无意义。
3.2 协变量与显式掩膜
双样本T检验模型里很常见的一个坑是协变量设置。年龄、性别是常规要匹配的协变量,如果设计允许,还会加入颅内总体积(ICV/TIV)或教育年限等。这些都要作为Additional covariates添加到模型里。
但要注意:不要把所有能想到的变量都一股脑塞进模型。神经影像研究中协变量过多会导致自由度下降,而且当协变量与组别高度相关时,会把真正的组间效应部分吸收掉。比较稳妥的做法是:先做单因素方差分析或者卡方检验确认年龄、性别在两组间是否均衡。如果均衡,可以选择不加入协变量或者只加入年龄;如果不均衡,则必须加入相关协变量进行控制。
显式掩膜方面,大多数情况下不需要额外添加。因为cat12在做表面分析时,数据本身就是限定在皮层mask内的,和非皮层区域无关。你在SPM界面看到的“Explicit mask”选项一般留空即可。
3.3 多重比较校正:FWE、FDR还是TFCE?
vertex水平的顶点数量巨大,如果直接拿未校正的p<0.001去报告结果,审稿人大概率会提出质疑。SPM/cat12的surface统计提供了基于随机场理论的FWE校正,以及FDR校正。我个人的用法是:
- 如果结果簇非常明显,用FWE校正后的p<0.05报告,这是最被认可的标准;
- 如果FWE太严格导致没有存活体素,可以报告p<0.001未校正的结果并明确标注是探索性发现,或者改用TFCE(Threshold-Free Cluster Enhancement)配合置换检验,这种组合对真实效应较弱的数据更友好;
- FDR校正也可以报告,但要说明使用的是Benjamini-Hochberg方法。
cat12里配置置换检验需要额外安装并调用相应工具包,但对小样本研究来说非常值得,因为随机场校正对数据平滑度敏感,而置换检验基本不依赖分布假设。实际项目中,我通常先用FWE看一眼,如果结果不够理想,再用TFCE置换检验交叉验证。
结果显示时,选择contrast为[1,-1]表示组1大于组2,[-1,1]表示组2大于组1。结果屏幕会显示显著顶点的着色区域,保存后可以进行渲染查看。
3.4 结果输出与坐标报告
拿到显著簇之后,还需要输出统计细节。SPM的结果表会给出每个簇的大小、peak顶点坐标以及对应T值。注意这里的peak坐标是表面顶点的空间位置,并不是传统体素坐标,报告时需要说明使用的是表面坐标。
很多人在写论文时直接照抄SPM的坐标,这里要警惕:如果你的空间归一化是基于cat12内部模板,那么表面坐标系统与MNI体素坐标之间可能并非严格一致。写作时应当报告cat12/surfstat给出的顶点编号、坐标及其对应的图谱区域(比如用Desikan-Killiany图谱定位该顶点属于哪个脑回)。不要只报一个孤立的MNI坐标,否则读者和审稿人很难验证结果。
4. ROI水平双样本T检验:把宏观问题变成数字
4.1 ROI的定义:图谱怎么选,要不要自己画
ROI水平分析的第一个核心问题就是ROI从哪里来。最常用的是标准的解剖图谱,比如Desikan-Killiany图谱(DK图谱)、Destrieux图谱、AAL图谱(如果surface分析中用到AAL需要转成surface版本)、Hammers图谱等。cat12的ROI分析接口里通常会预置若干图谱,用之前先确认图谱划分是否和你的研究问题匹配。
举个例子:你想比较默认网络核心区域(如楔前叶、角回)之间的厚度差异,DK图谱里有对应的解剖定义,直接用即可;但如果你的兴趣区域在某个文献自定义的功能分区里,那就不存在“默认图谱”可用了,需要自己定义ROI。这时候可以基于表面顶点生成ROI文件(自定义ROI绘制,或者基于已有功能激活簇定义),再导入cat12做提取。
有一个操作细节:不要在体素空间随便画一个box就当ROI用到surface数据分析里。你要提取的指标(厚度、GI)定义在皮层表面网格上,所以ROI必须与表面网格对齐。最稳妥的方式是用cat12支持的surface-based ROI文件,或者在surface上手动标记顶点集合。
4.2 cat12提取ROI指标的操作细节
cat12的Surface模块下有一个“ROI based analysis”工具,可以指定要提取的表面数据(thickness或GI或area等)、使用的图谱、要保留的输出格式(通常是csv或者txt)。运行后会生成一个表格,行是被试,列是每个ROI的均值(有时候也输出标准差、区域顶点数)。
实际操作时,有几处容易出问题:
- 左右半球分开处理:DK图谱等通常把左、右半球分开编号,提取结果会区分lh和rh。如果你要比较的是某个区域的双侧平均值,需要自己再做一次相加或平均;
- 输出文件不要直接双击打开,用MATLAB的load或者Excel导入时注意分隔符;
- 确认每个被试提取的ROI数量一致,如果某个被试某个ROI为空值,要回去检查该被试的表面重建是否有缺陷。
在我的项目里,会一次性提取三种指标:皮层厚度、GI、分形维度,方便后续分别分析,也方便在组间比较时做互补验证。
4.3 ROI水平双样本T检验:SPM与外部工具两条路
ROI指标的统计方法有两类常见实现路径。
第一类是把ROI均值向量直接当成普通数据,在MATLAB/SPM里跑一个简单的双样本T检验模型。具体操作是:在SPM的Basic Models中选择“Two-sample t-test”,把每个被试的ROI均值作为观测值填入对应组别,然后运行。这样得到的结果和在大脑图像上统计本质上是一回事,只是数据从顶点退化为区域均值。
第二类是导出到外部工具,比如SPSS、R、Python的SciPy或statsmodels包。这种方法更灵活,因为你可以在模型里做Levene方差齐性检验、考虑Welch自由度修正,还可以一次性对所有ROI做FDR校正。代码层面,可以简化为:
from scipy import stats # group1 和 group2 分别为两组被试在某一个ROI上的厚度均值 t_stat, p_value = stats.ttest_ind(group1, group2, equal_var=False)这里我强烈建议做方差齐性检验,如果方差不齐则使用Welch校正(也就是上面代码里的equal_var=False)。被试数比较少的神经影像研究里,两组方差经常不相等。
多重比较问题在ROI水平依然存在。假设DK图谱有68个区域,你做了68次T检验,即使真实无效假设成立,预期也会有大约3.4个假阳性。所以ROI分析报告时也应当汇报FDR校正后的结果,或者明确说明你只测试了少数几个预先指定的ROI,属于假设驱动分析。
4.4 vertex和ROI两个水平的结果如何互相佐证
最理想的情况是vertex水平发现某个脑回区域的组间差异显著,ROI水平也证实该脑区的厚度均值存在方向一致的差异。这种情况下结论最为扎实。
但真实数据不会总这么完美。常见的情况是:vertex水平有多个散布显著簇,ROI水平没有一个ROI通过校正后的阈值;或者反过来,vertex水平没有簇存活,ROI水平却有几个区域p值较小。遇到这种情况时,我的建议是不要强行把它们解释为“一致”或“矛盾”,而要回到假设本身。如果研究是探索性的,vertex水平的散布簇是正常结果,ROI检验只能作为辅助描述;如果研究是验证性的,以ROI水平预先指定区域的结果为主,vertex分析作为展示空间分布的补充。
另一个实操技巧:ROI均值可以提取出来做更丰富的分析,比如偏相关分析、中介效应、机器学习分类精度等。一次ROI提取相当于把全脑数据压缩成了少数几个稳定特征,对后续分析非常友好。
5. 实操中踩过的坑:排查与经验
5.1 vertex水平T检验跑完没有显著簇
这是出现频率最高的问题。很多人的第一反应是“数据没差异”,但我建议按下面几条逐一排查:
- 检查统计模型中两组被试的surface文件是否填反了位置,有时候组1和组2放反了导致contrast方向错误;
- 检查协变量是否编码正确,尤其是分类变量(如性别)有没有被当成连续变量处理;
- 检查显著阈值是不是设得太严格。如果FWE校正下没有结果,立刻看一下未校正p<0.001的统计图,判断效应是否消失;如果未校正也没有任何趋势,再考虑数据本身的问题;
- 检查平滑核是不是太小。没有平滑或平滑核过小,会让顶点间测量误差很大,T检验的统计力显著下降;
- 检查样本量。每组只有十来个人时,vertex水平FWE校正要达到显著非常困难,这种时候可以考虑以ROI为主分析、vertex分析作为探索性辅助。
5.2 ROI提取后数值出现NaN或明显异常
ROI提取结果里出现空值或者与相邻被试差距悬殊的值,几乎都是表面重建错误导致的。常见原因是分割阶段的拓扑修正出问题,或某个被试的中央表面在局部区域断裂。
遇到这种情况,最快的排查方式是回到cat12的surface viewer里看这个被试的重建结果,尤其看异常ROI对应区域是否有明显的网格变形。如果重建确实有问题,可以尝试重新分割该被试,或者将该被试从ROI分析中剔除,并在方法部分如实说明。
另外,也不要忽视ROI名称的歧义。不同图谱对同一个脑区的命名不同,比如“precuneus”在DK图谱和Destrieux图谱里边界就有细微差别。合并左右半球或比较不同图谱结果时,一定要仔细核对ROI标签,我见过有分析把“bankssts”当成独立脑区做了一整轮统计,后来才发现它与颞上沟的关系并不简单,导致结果解释很尴尬。
5.3 结果解释时要小心的三个问题
第一,方向性。双样本T检验的contrast [1,-1] 与 [-1,1] 方向不同,得到的T值符号完全相反。写论文时一定要明确报出“组1 > 组2”还是“组2 > 组1”,避免在摘要里把方向写反。
第二,单位与尺度。皮层厚度通常以毫米为单位,差异一般只有零点几毫米甚至更小。报告时不要只给p值,要给出均值差、标准差、Cohen's d等效应量指标,这样读者才能判断差异在临床上或认知上是否真的有意义。
第三,surface模板的空间描述。cat12的surface数据经过归一化到组平均模板空间后,顶点坐标对应到特定参考脑。报告中说明使用的是cat12版本的表面模板和原始T1像的空间归一化流程,方便他人复现。
5.4 避坑清单速查表
| 痛点 | 典型表现 | 排查与建议 |
|---|---|---|
| 分割质量差 | 厚度值极端、ROI空值 | 检查原始T1质量,尝试重新分割或剔除被试 |
| 平滑参数不合适 | vertex水平统计无结果 | 尝试10/15/20mm平滑核,做敏感性分析 |
| 协变量编码错误 | 模型跑通但结果方向不对 | 查看设计矩阵,确认分类变量编码方式 |
| 结果坐标混淆 | 报告坐标与图谱区域对不上 | 使用cat12表面坐标,并结合vertex的区域定位 |
| 多重比较方法被质疑 | 审稿人要求补做校正 | 使用FWE或TFCE置换检验,并报告未校正结果作为辅助 |
| ROI空值 | 提取表格里某些区域为NaN | 查看对应被试的表面重建结果,及时处理 |
| 双侧ROI合并方式不统一 | 左右半球合并后结果波动大 | 明确记录是求均值还是求和,保持全项目一致 |
| 未报告效应量 | 只有p值,信息量不足 | 补上Cohen's d和置信区间 |
6. 一点个人体会
最后分享一个我每次接手新数据都会做的固定动作:在跑统计之前,先花半小时把每个被试的皮层表面渲染出来快速扫一遍。不要只看cat12的QA评分,因为评分能反映整体质量,但局部拓扑错误、重建褶皱这类问题很难用单个分数完全概括。亲身扫一遍表面图之后,你会对自己数据的真实质量有个直观印象,后面统计跑出任何离群结果时,也能更快判断是被试问题还是真实效应。
这个习惯帮我节省过大量排查时间,也让我在一些被其他项目组判定为“数据没有差异”的数据集里,发现了其实是少数坏被试在捣乱的真相。脑影像分析就是这样,预处理一点点差异,统计结果天差地别。只要把每个环节的把控做好,基于cat12的SBM加ROI统计分析并不是什么黑魔法,它只是一套可复现、可检查、可解释的系统工程。希望这篇实践记录能帮你少走弯路,把宝贵的时间留给真正值得解释的科学问题。