• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

FMRI任务态数据SPM批处理_code操作

武飞扬头像
莫浪愁
帮助1

引言

此前先是总结了spm处理任务态数据的点击操作,后又结合dpabi进行了批量处理的改进。近两天学会了直接修改spmBatch的code,进行循环处理。比想象中的简单一些,所以这次完整的介绍一下只用SPM进行批量处理的操作方法。

一、SPM单个被试任务态数据的batch设置

二、数据结构的整理

这里参考了DPABI文件处理的结构,以便后续的循环处理。

#R语言批量准备处理前文件结构
#共37个被试,需准备RW、SD与T1三个大文件夹,并分装37个被试相应的文件。
#创建37个子文件夹
setwd("D:/desk/speed/data_1/task_spm/RW")
sapply(paste0("sub_10",1:9), dir.create)
sapply(paste0("sub_1",10:37), dir.create)

setwd("D:/desk/speed/data_1/task_spm/SD")
sapply(paste0("sub_20",1:9), dir.create)
sapply(paste0("sub_2",10:37), dir.create)

setwd("D:/desk/speed/data_1/task_spm/T1/RW")
sapply(paste0("sub_10",1:9), dir.create)
sapply(paste0("sub_1",10:37), dir.create)

setwd("D:/desk/speed/data_1/task_spm/T1/SD")
sapply(paste0("sub_20",1:9), dir.create)
sapply(paste0("sub_2",10:37), dir.create)
#移动文件
#结构像
##RW文件夹
for (i in 1:9) {file.copy(
  paste("D:/desk/speed/data_1/T1/RW/sub_10",as.character(i),"/10",as.character(i),"_t1.nii",sep = ""),
  paste("D:/desk/speed/data_1/task_spm/T1/RW/sub_10",as.character(i),"/10",as.character(i),"_t1.nii",sep = ""))
}
for (i in 10:37) {file.copy(
  paste("D:/desk/speed/data_1/T1/RW/sub_1",as.character(i),"/1",as.character(i),"_t1.nii",sep = ""),
  paste("D:/desk/speed/data_1/task_spm/T1/RW/sub_1",as.character(i),"/1",as.character(i),"_t1.nii",sep = ""))
}
##SD文件夹
for (i in 1:9) {file.copy(  paste("D:/desk/speed/data_1/T1/SD/sub_20",as.character(i),"/20",as.character(i),"_t1.nii",sep = ""),
paste("D:/desk/speed/data_1/task_spm/T1/SD/sub_20",as.character(i),"/20",as.character(i),"_t1.nii",sep = ""))
}
for (i in 10:37) {file.copy(paste("D:/desk/speed/data_1/T1/SD/sub_2",as.character(i),"/2",as.character(i),"_t1.nii",sep = ""),paste("D:/desk/speed/data_1/task_spm/T1/SD/sub_2",as.character(i),"/2",as.character(i),"_t1.nii",sep = ""))
}
#功能像文件移动
##RW
for (i in 1:9) {file.copy(
  paste("D:/desk/speed/data_0/RW/10",as.character(i),"_speed.nii",sep = ""),paste("D:/desk/speed/data_1/task_spm/RW/sub_10",as.character(i),"/10",as.character(i),"_speed.nii",sep = ""))
}
for (i in 10:37) {file.copy(
  paste("D:/desk/speed/data_0/RW/1",as.character(i),"_speed.nii",sep = ""),paste("D:/desk/speed/data_1/task_spm/RW/sub_1",as.character(i),"/1",as.character(i),"_speed.nii",sep = ""))
}
##SD
for (i in 1:9) {file.copy(
  paste("D:/desk/speed/data_0/SD/20",as.character(i),"_speed.nii",sep = ""),paste("D:/desk/speed/data_1/task_spm/SD/sub_20",as.character(i),"/20",as.character(i),"_speed.nii",sep = ""))
}
for (i in 10:37) {file.copy(
  paste("D:/desk/speed/data_0/SD/2",as.character(i),"_speed.nii",sep = ""),paste("D:/desk/speed/data_1/task_spm/SD/sub_2",as.character(i),"/2",as.character(i),"_speed.nii",sep = ""))
}

三、SPMbatch批量处理code修改

%-----------------------------------------------------------------------
% 时间:20220913
% 程序员:wishing
% 目的:批处理头动、配准、分割、标准化、模型设计与评估、contrast设计
%-----------------------------------------------------------------------
clear,clc;
spm_get_defaults
spm_jobman('initcfg');
%一种循环的写法
%p=["01" "02" "03" "04" "05" "06" "07" "08" "09" "10"  "11"    "12"    "13"    "14"    "15"    "16"    "17"    "18"    "19"    "20"    "21"    "22"    "23"    "24"    "25"  "26"    "27"    "28"    "29"    "30"    "31"    "32"    "33"    "34"    "35"    "36"    "37"];这里可以由于01-09比较特殊只能手动打,而后面的可以写一个数列再用string函数转化为字符格式,然后粘贴复制。
%然后for i=length(p)
%其中'sub_1',p(i)代替这样可以实现从1-37的无缝循环
for i = 2:3
filename_in = char(append('D:\desk\speed\data_1\Dp_spm\RW\FunImg\sub_10',string(i),'\10',string(i),'_speed.nii,1'));
filename_out = char(append('D:\desk\speed\data_1\Dp_spm\RW\FunImg\sub_10',string(i)));
file_t = char(append('D:\desk\speed\data_1\Dp_spm\RW\T1Img\sub_10',string(i),'\10',string(i),'_t1.nii,1'));
jobs{1}.spm.util.split.vol = {filename_in};
jobs{1}.spm.util.split.outdir = {filename_out};
jobs{2}.spm.spatial.realign.estwrite.data{1}(1) = cfg_dep('4D to 3D File Conversion: Series of 3D Volumes', substruct('.','val', '{}',{1}, '.','val', '{}',{1}, '.','val', '{}',{1}), substruct('.','splitfiles'));
jobs{2}.spm.spatial.realign.estwrite.eoptions.quality = 0.9;
jobs{2}.spm.spatial.realign.estwrite.eoptions.sep = 4;
jobs{2}.spm.spatial.realign.estwrite.eoptions.fwhm = 5;
jobs{2}.spm.spatial.realign.estwrite.eoptions.rtm = 1;
jobs{2}.spm.spatial.realign.estwrite.eoptions.interp = 2;
jobs{2}.spm.spatial.realign.estwrite.eoptions.wrap = [0 0 0];
jobs{2}.spm.spatial.realign.estwrite.eoptions.weight = '';
jobs{2}.spm.spatial.realign.estwrite.roptions.which = [2 1];
jobs{2}.spm.spatial.realign.estwrite.roptions.interp = 4;
jobs{2}.spm.spatial.realign.estwrite.roptions.wrap = [0 0 0];
jobs{2}.spm.spatial.realign.estwrite.roptions.mask = 1;
jobs{2}.spm.spatial.realign.estwrite.roptions.prefix = 'r';
jobs{3}.spm.spatial.coreg.estimate.ref(1) = cfg_dep('Realign: Estimate & Reslice: Mean Image', substruct('.','val', '{}',{2}, '.','val', '{}',{1}, '.','val', '{}',{1}, '.','val', '{}',{1}), substruct('.','rmean'));
jobs{3}.spm.spatial.coreg.estimate.source = {file_t};
jobs{3}.spm.spatial.coreg.estimate.other = {''};
jobs{3}.spm.spatial.coreg.estimate.eoptions.cost_fun = 'nmi';
jobs{3}.spm.spatial.coreg.estimate.eoptions.sep = [4 2];
jobs{3}.spm.spatial.coreg.estimate.eoptions.tol = [0.02 0.02 0.02 0.001 0.001 0.001 0.01 0.01 0.01 0.001 0.001 0.001];
jobs{3}.spm.spatial.coreg.estimate.eoptions.fwhm = [7 7];
jobs{4}.spm.spatial.preproc.channel.vols(1) = cfg_dep('Coregister: Estimate: Coregistered Images', substruct('.','val', '{}',{3}, '.','val', '{}',{1}, '.','val', '{}',{1}, '.','val', '{}',{1}), substruct('.','cfiles'));
jobs{4}.spm.spatial.preproc.channel.biasreg = 0.001;
jobs{4}.spm.spatial.preproc.channel.biasfwhm = 60;
jobs{4}.spm.spatial.preproc.channel.write = [0 1];
jobs{4}.spm.spatial.preproc.tissue(1).tpm = {'D:\working\matlab\toolbox\spm12\tpm\TPM.nii,1'};
jobs{4}.spm.spatial.preproc.tissue(1).ngaus = 1;
jobs{4}.spm.spatial.preproc.tissue(1).native = [1 0];
jobs{4}.spm.spatial.preproc.tissue(1).warped = [0 0];
jobs{4}.spm.spatial.preproc.tissue(2).tpm = {'D:\working\matlab\toolbox\spm12\tpm\TPM.nii,2'};
jobs{4}.spm.spatial.preproc.tissue(2).ngaus = 1;
jobs{4}.spm.spatial.preproc.tissue(2).native = [1 0];
jobs{4}.spm.spatial.preproc.tissue(2).warped = [0 0];
jobs{4}.spm.spatial.preproc.tissue(3).tpm = {'D:\working\matlab\toolbox\spm12\tpm\TPM.nii,3'};
jobs{4}.spm.spatial.preproc.tissue(3).ngaus = 2;
jobs{4}.spm.spatial.preproc.tissue(3).native = [1 0];
jobs{4}.spm.spatial.preproc.tissue(3).warped = [0 0];
jobs{4}.spm.spatial.preproc.tissue(4).tpm = {'D:\working\matlab\toolbox\spm12\tpm\TPM.nii,4'};
jobs{4}.spm.spatial.preproc.tissue(4).ngaus = 3;
jobs{4}.spm.spatial.preproc.tissue(4).native = [1 0];
jobs{4}.spm.spatial.preproc.tissue(4).warped = [0 0];
jobs{4}.spm.spatial.preproc.tissue(5).tpm = {'D:\working\matlab\toolbox\spm12\tpm\TPM.nii,5'};
jobs{4}.spm.spatial.preproc.tissue(5).ngaus = 4;
jobs{4}.spm.spatial.preproc.tissue(5).native = [1 0];
jobs{4}.spm.spatial.preproc.tissue(5).warped = [0 0];
jobs{4}.spm.spatial.preproc.tissue(6).tpm = {'D:\working\matlab\toolbox\spm12\tpm\TPM.nii,6'};
jobs{4}.spm.spatial.preproc.tissue(6).ngaus = 2;
jobs{4}.spm.spatial.preproc.tissue(6).native = [0 0];
jobs{4}.spm.spatial.preproc.tissue(6).warped = [0 0];
jobs{4}.spm.spatial.preproc.warp.mrf = 1;
jobs{4}.spm.spatial.preproc.warp.cleanup = 1;
jobs{4}.spm.spatial.preproc.warp.reg = [0 0.001 0.5 0.05 0.2];
jobs{4}.spm.spatial.preproc.warp.affreg = 'mni';
jobs{4}.spm.spatial.preproc.warp.fwhm = 0;
jobs{4}.spm.spatial.preproc.warp.samp = 3;
jobs{4}.spm.spatial.preproc.warp.write = [0 1];
jobs{4}.spm.spatial.preproc.warp.vox = NaN;
jobs{4}.spm.spatial.preproc.warp.bb = [NaN NaN NaN
                                              NaN NaN NaN];
jobs{5}.spm.spatial.normalise.write.subj.def(1) = cfg_dep('Segment: Forward Deformations', substruct('.','val', '{}',{4}, '.','val', '{}',{1}, '.','val', '{}',{1}), substruct('.','fordef', '()',{':'}));
jobs{5}.spm.spatial.normalise.write.subj.resample(1) = cfg_dep('Realign: Estimate & Reslice: Resliced Images (Sess 1)', substruct('.','val', '{}',{2}, '.','val', '{}',{1}, '.','val', '{}',{1}, '.','val', '{}',{1}), substruct('.','sess', '()',{1}, '.','rfiles'));
jobs{5}.spm.spatial.normalise.write.woptions.bb = [-78 -112 -70
                                                          78 76 85];
jobs{5}.spm.spatial.normalise.write.woptions.vox = [2 2 2];
jobs{5}.spm.spatial.normalise.write.woptions.interp = 4;
jobs{5}.spm.spatial.normalise.write.woptions.prefix = 'w';
jobs{6}.spm.spatial.smooth.data(1) = cfg_dep('Normalise: Write: Normalised Images (Subj 1)', substruct('.','val', '{}',{5}, '.','val', '{}',{1}, '.','val', '{}',{1}, '.','val', '{}',{1}), substruct('()',{1}, '.','files'));
jobs{6}.spm.spatial.smooth.fwhm = [8 8 8];
jobs{6}.spm.spatial.smooth.dtype = 0;
jobs{6}.spm.spatial.smooth.im = 0;
jobs{6}.spm.spatial.smooth.prefix = 's';
jobs{7}.spm.stats.fmri_spec.dir = {filename_out};
jobs{7}.spm.stats.fmri_spec.timing.units = 'secs';
jobs{7}.spm.stats.fmri_spec.timing.RT = 2;
jobs{7}.spm.stats.fmri_spec.timing.fmri_t = 35;
jobs{7}.spm.stats.fmri_spec.timing.fmri_t0 = 18;
jobs{7}.spm.stats.fmri_spec.sess.scans(1) = cfg_dep('Smooth: Smoothed Images', substruct('.','val', '{}',{6}, '.','val', '{}',{1}, '.','val', '{}',{1}), substruct('.','files'));
jobs{7}.spm.stats.fmri_spec.sess.cond(1).name = 'speed';
jobs{7}.spm.stats.fmri_spec.sess.cond(1).onset = [0
                                                         62
                                                         124
                                                         186
                                                         248
                                                         310
                                                         372];
jobs{7}.spm.stats.fmri_spec.sess.cond(1).duration = 32;
jobs{7}.spm.stats.fmri_spec.sess.cond(1).tmod = 0;
jobs{7}.spm.stats.fmri_spec.sess.cond(1).pmod = struct('name', {}, 'param', {}, 'poly', {});
jobs{7}.spm.stats.fmri_spec.sess.cond(1).orth = 1;
jobs{7}.spm.stats.fmri_spec.sess.cond(2).name = 'baseline';
jobs{7}.spm.stats.fmri_spec.sess.cond(2).onset = [32
                                                         94
                                                         156
                                                         218
                                                         280
                                                         342
                                                         404];
jobs{7}.spm.stats.fmri_spec.sess.cond(2).duration = 30;
jobs{7}.spm.stats.fmri_spec.sess.cond(2).tmod = 0;
jobs{7}.spm.stats.fmri_spec.sess.cond(2).pmod = struct('name', {}, 'param', {}, 'poly', {});
jobs{7}.spm.stats.fmri_spec.sess.cond(2).orth = 1;
jobs{7}.spm.stats.fmri_spec.sess.multi = {''};
jobs{7}.spm.stats.fmri_spec.sess.regress = struct('name', {}, 'val', {});
jobs{7}.spm.stats.fmri_spec.sess.multi_reg(1) = cfg_dep('Realign: Estimate & Reslice: Realignment Param File (Sess 1)', substruct('.','val', '{}',{2}, '.','val', '{}',{1}, '.','val', '{}',{1}, '.','val', '{}',{1}), substruct('.','sess', '()',{1}, '.','rpfile'));
jobs{7}.spm.stats.fmri_spec.sess.hpf = 128;
jobs{7}.spm.stats.fmri_spec.fact = struct('name', {}, 'levels', {});
jobs{7}.spm.stats.fmri_spec.bases.hrf.derivs = [0 0];
jobs{7}.spm.stats.fmri_spec.volt = 1;
jobs{7}.spm.stats.fmri_spec.global = 'None';
jobs{7}.spm.stats.fmri_spec.mthresh = 0.8;
jobs{7}.spm.stats.fmri_spec.mask = {''};
jobs{7}.spm.stats.fmri_spec.cvi = 'AR(1)';
jobs{8}.spm.stats.fmri_est.spmmat(1) = cfg_dep('fMRI model specification: SPM.mat File', substruct('.','val', '{}',{7}, '.','val', '{}',{1}, '.','val', '{}',{1}), substruct('.','spmmat'));
jobs{8}.spm.stats.fmri_est.write_residuals = 0;
jobs{8}.spm.stats.fmri_est.method.Classical = 1;
jobs{9}.spm.stats.con.spmmat(1) = cfg_dep('Model estimation: SPM.mat File', substruct('.','val', '{}',{8}, '.','val', '{}',{1}, '.','val', '{}',{1}), substruct('.','spmmat'));
jobs{9}.spm.stats.con.consess{1}.tcon.name = 's-b';
jobs{9}.spm.stats.con.consess{1}.tcon.weights = [1 -1 0 0 0 0 0 0];
jobs{9}.spm.stats.con.consess{1}.tcon.sessrep = 'none';
jobs{9}.spm.stats.con.delete = 0;
spm_jobman('run',jobs);
clear jobs
end

四、对结果con.nii文件进行整理

这里还是使用DPABI进行统计分析、view、输出结果图片与报告脑区。

#R语言
#单样本检验DAPBI文件结构
#RW
for (i in 1:9) {file.copy(
  paste("D:/desk/speed/data_1/Dp_spm/RW/FunImgARWS/sub_10",as.character(i),"/con_0001.nii",sep = ""),
  paste("D:/desk/speed/data_1/Dp_spm/group/one_ttest/RW_con/con_",as.character(i),".nii",sep = ""))
}
for (i in 10:37) {file.copy(
  paste("D:/desk/speed/data_1/Dp_spm/RW/FunImgARWS/sub_1",as.character(i),"/con_0001.nii",sep = ""),
  paste("D:/desk/speed/data_1/Dp_spm/group/one_ttest/RW_con/con_",as.character(i),".nii",sep = ""))
}

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgkgefj
系列文章
更多 icon
同类精品
更多 icon
继续加载