引言
在之前处理任务态数据时,使用了spm进行操作,发现就算是使用了batch界面,对于37名被试,也至少需要点击不下成百上千次;而用batch导出的script批量化,也只能批量一个简单的步骤。
做到一半忽然想起静息态处理用到的DPABI,其实无论任务态还是静息态两者预处理部分都是类似的,而DPABI就是为了批量处理被试而诞生的,所以还是再详细叙述一下DPABI的预处理流程。而后再用其批量处理过后的结果使用spm进行任务态模型的设计与个体分析。
此次采用的是之前spm中采用的任务态FMRI数据。
一、 DPABI处理顺序
完整顺序
![](https://img.haomeiwen.com/i11397089/d55bd51270a858fd.png)
预处理常用顺序
![](https://img.haomeiwen.com/i11397089/709ec553e77370a8.png)
二、DPABI批处理详细步骤
整理一下目前批量处理的四种做法
1.最原始的spmBatch单个被试,一个一个点击操作,费时费力,但重在精准。
2.spmBatch导出script后替换被试名称,整理成被试个数量的job文件,再在.m文件中复制粘贴被试个数量的执行步骤。比第一种方法稍微减轻些工作量,但总体依旧繁琐。
3.在第二种方法的基础上,直接修改code的循环。但是需要有一定的code基础,有一定难度,但是掌握后,便可自己维护与修改code。
4.使用DPABi进行预处理,只需整理文件数据结构,简单省时,但是容易报错,而且其中的步骤并非完全和spm相同,所以跑出来的结果可能不同,此处有待考证。
1.数据准备
![](https://img.haomeiwen.com/i11397089/d668a9e3eeea5e6d.png)
![](https://img.haomeiwen.com/i11397089/0eb6c7b2220500aa.png)
如图3,4,这是到手的数据,已经被初步整理成了.nii格式。
但是DPABI需要特殊的文件结构,所以仍需进一步整理,这里展示使用的R语言code和最终的整理效果。
#R语言批量准备DPABI处理前文件结构
#共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 = ""))
}
![](https://img.haomeiwen.com/i11397089/8f872e723f1c5381.png)
![](https://img.haomeiwen.com/i11397089/91327835fa9cebdf.png)
![](https://img.haomeiwen.com/i11397089/dd9cca3f35461a04.png)
![](https://img.haomeiwen.com/i11397089/f1e88d3cbd4a8775.png)
2.去除前三个TP
1)运行界面设置
![](https://img.haomeiwen.com/i11397089/5536209341d711a1.png)
然后主要结果是一个tsv文件,此处可以看到TP等每个被试的基础信息。
![](https://img.haomeiwen.com/i11397089/8dd97c0b429982dc.png)
2)检查发现共有220个TP,此时去除前3个。
![](https://img.haomeiwen.com/i11397089/335f2d9ed664608a.png)
再空跑一次后,发现TP已变成217。
![](https://img.haomeiwen.com/i11397089/396d47c8150821c5.png)
3.预处理参数设置
1)了解DPABI中缩写
![](https://img.haomeiwen.com/i11397089/a9d56c85bab809c2.png)
2)分别设置R(头动校准),配准,W(标准化),S(平滑),automask(后续便于统计分析,非必选)(block设计不进行时间校准,而标准化方法这里我们尽量选择和spm一致的方法,new segment这里我没跑通,最终选择的还是old segment。)
![](https://img.haomeiwen.com/i11397089/d52551f20b99fd83.png)
4.结果文件结构
![](https://img.haomeiwen.com/i11397089/f8114e43dc1a9669.png)
![](https://img.haomeiwen.com/i11397089/78803c4520e425bd.png)
三、SPM模型设计与个体分析
由于DPABI最终处理结果是4D文件,而SPM处理仍需要3d文件,所以还是需要将4d转化为3d。
由于此处模型设计是spm特有的操作,所以仍需一个一个单独操作。
不过设置以下4个步骤的batch后,每个被试只需要修改“4Dto3D的输入文件”,“4Dto3D的输出文件目录”,“model设计的输出目录”以及“model设计中的头动文件”这四个地方就可以了。
1.4Dto3D
![](https://img.haomeiwen.com/i11397089/54c8a107048b4e48.png)
2.fMRI model specification
![](https://img.haomeiwen.com/i11397089/2339a83e2687d098.png)
![](https://img.haomeiwen.com/i11397089/8c1df633f0423956.png)
回归选取的头动参数需要选中每个被试前面处理生成的rp.txt文件。
这里按照实验设计speed onsets写为:0:62:372;baseline写为:32:62:404
3.Model estimation
![](https://img.haomeiwen.com/i11397089/6c87aaadc17b6839.png)
4.设置Contrast(后续统计分析使用)(1 -1 0 0 0 0 0 0)
![](https://img.haomeiwen.com/i11397089/ab2da60478b00a00.png)
5结果展示(更改con文件命名为与被试同,便于后续统计分析)
![](https://img.haomeiwen.com/i11397089/f009b71f4c72ea60.png)
这里再介绍一种方法,也就是以上说明的第三种批量处理方法对第三步:“SPM模型设计与个体分析”进行code批量化
1.首先设计一个batch,如上,然后导出script。
2.对script进行matlab的批处理修改,如下:
修改主要包含两部分:
1.对spm的环境进行设置:
(1)将batch中的matlabbatch全部替换成jobs
(2)加入spm_get_defaults和spm_jobman('initcfg')
(3)循环内部结尾加入spm_jobman('run',jobs);clear jobs
2.添加循环:针对自己的文件结构添加循环
这些code的修改参考了贾晓燕的文章((11条消息) SPM批处理数据_贾晓燕的博客-CSDN博客_spm 批处理)
%-----------------------------------------------------------------------
% 时间:20220913
%程序员:wishing
%目的:批量处理DPABI预处理后的任务态数据,包含4D转3D、model 设计、model评估与contrast设计四个步骤。
%-----------------------------------------------------------------------
clear,clc;
spm_get_defaults
spm_jobman('initcfg');
for i = 1:2
filename_in = char(append('D:\desk\speed\data_1\Dp_spm\RW\FunImgRWS\sub_10',string(i),'\swr10',string(i),'_speed.nii,1'));
filename_out = char(append('D:\desk\speed\data_1\Dp_spm\RW\FunImgRWS\sub_10',string(i)));
filename_re = char(append('D:\desk\speed\data_1\Dp_spm\RW\RealignParameter\sub_10',string(i),'\rp_10',string(i),'_speed.txt'));
jobs{1}.spm.util.split.vol = {filename_in};
jobs{1}.spm.util.split.outdir = {filename_out};
jobs{2}.spm.stats.fmri_spec.dir = {filename_out};
jobs{2}.spm.stats.fmri_spec.timing.units = 'secs';
jobs{2}.spm.stats.fmri_spec.timing.RT = 2;
jobs{2}.spm.stats.fmri_spec.timing.fmri_t = 35;
jobs{2}.spm.stats.fmri_spec.timing.fmri_t0 = 18;
jobs{2}.spm.stats.fmri_spec.sess.scans(1) = cfg_dep('4D to 3D File Conversion: Series of 3D Volumes', substruct('.','val', '{}',{1}, '.','val', '{}',{1}, '.','val', '{}',{1}), substruct('.','splitfiles'));
jobs{2}.spm.stats.fmri_spec.sess.cond(1).name = 'speed';
jobs{2}.spm.stats.fmri_spec.sess.cond(1).onset = [0
62
124
186
248
310
372];
jobs{2}.spm.stats.fmri_spec.sess.cond(1).duration = 32;
jobs{2}.spm.stats.fmri_spec.sess.cond(1).tmod = 0;
jobs{2}.spm.stats.fmri_spec.sess.cond(1).pmod = struct('name', {}, 'param', {}, 'poly', {});
jobs{2}.spm.stats.fmri_spec.sess.cond(1).orth = 1;
jobs{2}.spm.stats.fmri_spec.sess.cond(2).name = 'baseline';
jobs{2}.spm.stats.fmri_spec.sess.cond(2).onset = [32
94
156
218
280
342
404];
jobs{2}.spm.stats.fmri_spec.sess.cond(2).duration = 30;
jobs{2}.spm.stats.fmri_spec.sess.cond(2).tmod = 0;
jobs{2}.spm.stats.fmri_spec.sess.cond(2).pmod = struct('name', {}, 'param', {}, 'poly', {});
jobs{2}.spm.stats.fmri_spec.sess.cond(2).orth = 1;
jobs{2}.spm.stats.fmri_spec.sess.multi = {''};
jobs{2}.spm.stats.fmri_spec.sess.regress = struct('name', {}, 'val', {});
jobs{2}.spm.stats.fmri_spec.sess.multi_reg = {filename_re};
jobs{2}.spm.stats.fmri_spec.sess.hpf = 128;
jobs{2}.spm.stats.fmri_spec.fact = struct('name', {}, 'levels', {});
jobs{2}.spm.stats.fmri_spec.bases.hrf.derivs = [0 0];
jobs{2}.spm.stats.fmri_spec.volt = 1;
jobs{2}.spm.stats.fmri_spec.global = 'None';
jobs{2}.spm.stats.fmri_spec.mthresh = 0.8;
jobs{2}.spm.stats.fmri_spec.mask = {''};
jobs{2}.spm.stats.fmri_spec.cvi = 'AR(1)';
jobs{3}.spm.stats.fmri_est.spmmat(1) = cfg_dep('fMRI model specification: SPM.mat File', substruct('.','val', '{}',{2}, '.','val', '{}',{1}, '.','val', '{}',{1}), substruct('.','spmmat'));
jobs{3}.spm.stats.fmri_est.write_residuals = 0;
jobs{3}.spm.stats.fmri_est.method.Classical = 1;
jobs{4}.spm.stats.con.spmmat(1) = cfg_dep('Model estimation: SPM.mat File', substruct('.','val', '{}',{3}, '.','val', '{}',{1}, '.','val', '{}',{1}), substruct('.','spmmat'));
jobs{4}.spm.stats.con.consess{1}.tcon.name = 's-b';
jobs{4}.spm.stats.con.consess{1}.tcon.weights = [1 -1 0 0 0 0 0 0];
jobs{4}.spm.stats.con.consess{1}.tcon.sessrep = 'none';
jobs{4}.spm.stats.con.delete = 0;
spm_jobman('run',jobs);
clear jobs
end
四、DPABI群体统计分析
群体分析这里使用SPM也可以,不过由于之前用DPABI更加顺手,所以最后还是用DPBAI进行,二者本质相同,核心都是spm中的code。
1.单样本t检验
1)准备文件结构
#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 = ""))
}
2)文件结构展示
![](https://img.haomeiwen.com/i11397089/cd7ed9e680215f56.png)
3)DPABI单样本t检验
这里根据行为学指标与头动指标排除被试(1,5,8,9,10,14,23,32,33)
![](https://img.haomeiwen.com/i11397089/40e89eda1619c2fa.png)
4)view结果并报告。
网友评论