matlab代码提取ICA分析中IC_mask.nii

#本研究共纳入189名轻度脑外伤患者,分为三组:健康对照组、急性期患者组以及阈值匹配的恢复期患者组,每组各63名。研究的前期工作包括:

#通过GIFT软件对每名参与者的空间图谱进行分析,所得数据格式为:ica_sub001_component_ica_s1_.nii。
#结合肉眼观察及相关性分析,确定每个独立成分(IC)所属的脑网络。例如,IC2被归类为SMN(感觉运动网络)。
#接下来,我们将提取每名参与者的独立成分。例如,从ica_sub001_component_ica_s1_.nii中提取IC2。随后,通过单样本分析,评估三组在IC2中的差异,发现三组间确实存在显著差异。为进一步分析这些差异,我们首先制作IC2的二值化mask,之后可以进行两两组间对比。


clc; clear;
spm('Defaults', 'fMRI');
spm_jobman('initcfg');

% 需要分析的IC列表(可自行修改)
icNumbers = [2,3,4,5,6,10,11,12,16,17,18,21,22,24,27,30,31]; 

% 基础路径(根据实际情况修改)
baseDir = 'E:\ICA2025\ica2025-1\result1\';
#协变量所处文件夹,Age.txt、Sex.txt、Edu.txt
covDir = 'E:\ICA2025\ica2025-1\covariates2\';
#灰质mask先行准备
maskPath = 'E:\ICA2025\GM_mask.nii,1';

% 主循环:遍历每个IC
for icIdx = 1:length(icNumbers)
    icNum = icNumbers(icIdx);
    
    % ========== 1. 创建结果文件夹 ==========
    resultDir = fullfile('E:\ICA2025\ica2025-1', sprintf('result3_ica_ic%d', icNum));
    if ~exist(resultDir, 'dir')
        mkdir(resultDir);
    end

    % ========== 2. 配置分析参数 ==========
    matlabbatch = []; % 每次循环清空配置
    
    % ------ 2.1 模型设置 ------
    % 结果目录
    matlabbatch{1}.spm.stats.factorial_design.dir = {resultDir};
    
    % 被试扫描文件(动态生成IC编号)
    scans = cell(189, 1);
    for i = 1:189
        subStr = sprintf('sub%03d', i);
        scans{i} = fullfile(baseDir, sprintf('ica_%s_component_ica_s1_.nii,%d', subStr, icNum));
    end
    matlabbatch{1}.spm.stats.factorial_design.des.t1.scans = scans;
    
    % ------ 2.2 协变量设置 ------
    covNames = {'Age', 'Sex', 'Edu'};
    for c = 1:3
        covFile = fullfile(covDir, [covNames{c} '.txt']);
        covData = load(covFile);
        matlabbatch{1}.spm.stats.factorial_design.cov(c).c = covData;
        matlabbatch{1}.spm.stats.factorial_design.cov(c).cname = covNames{c};
        matlabbatch{1}.spm.stats.factorial_design.cov(c).iCFI = 1;
        matlabbatch{1}.spm.stats.factorial_design.cov(c).iCC = 1;
    end
    
    % ------ 2.3 掩膜和全局设置 ------
    matlabbatch{1}.spm.stats.factorial_design.masking.tm.tm_none = 1;
    matlabbatch{1}.spm.stats.factorial_design.masking.im = 1;
    matlabbatch{1}.spm.stats.factorial_design.masking.em = {maskPath};
    matlabbatch{1}.spm.stats.factorial_design.globalc.g_omit = 1;
    matlabbatch{1}.spm.stats.factorial_design.globalm.gmsca.gmsca_no = 1;
    matlabbatch{1}.spm.stats.factorial_design.globalm.glonorm = 1;

    % ========== 3. 运行分析 ==========
    try
        % 模型估计
        matlabbatch{2}.spm.stats.fmri_est.spmmat = {fullfile(resultDir, 'SPM.mat')};
        matlabbatch{2}.spm.stats.fmri_est.write_residuals = 0;
        matlabbatch{2}.spm.stats.fmri_est.method.Classical = 1;
        
        % 对比定义
        matlabbatch{3}.spm.stats.con.spmmat = {fullfile(resultDir, 'SPM.mat')};
        matlabbatch{3}.spm.stats.con.consess{1}.tcon.name = 'Positive Effect';
        matlabbatch{3}.spm.stats.con.consess{1}.tcon.weights = [1 0 0 0];
        matlabbatch{3}.spm.stats.con.consess{1}.tcon.sessrep = 'none';
        matlabbatch{3}.spm.stats.con.delete = 0;
        
        % 结果阈值化
        matlabbatch{4}.spm.stats.results.spmmat = {fullfile(resultDir, 'SPM.mat')};
        matlabbatch{4}.spm.stats.results.conspec.contrasts = 1;
        matlabbatch{4}.spm.stats.results.conspec.threshdesc = 'FWE';
        matlabbatch{4}.spm.stats.results.conspec.thresh = 0.05;
        matlabbatch{4}.spm.stats.results.conspec.extent = 100;
        matlabbatch{4}.spm.stats.results.units = 1;
        matlabbatch{4}.spm.stats.results.print = false;
        
        % 执行当前批处理
        spm_jobman('run', matlabbatch);
        fprintf('IC%d 分析成功完成\n', icNum);
        
    catch ME
        fprintf('IC%d 分析失败: %s\n', icNum, ME.message);
    end
end

disp('所有IC分析完成!');
#这里最后只能分析出spmT_0001.nii
#最后一步需要你借助xjview卡阈值,FWE0.05,Voxel100,+,最后保存为IC2_mask.nii
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容