美文网首页
FMRI任务态数据处理(DPABI&SPM)

FMRI任务态数据处理(DPABI&SPM)

作者: 莫浪愁 | 来源:发表于2022-09-09 16:54 被阅读0次

引言

在之前处理任务态数据时,使用了spm进行操作,发现就算是使用了batch界面,对于37名被试,也至少需要点击不下成百上千次;而用batch导出的script批量化,也只能批量一个简单的步骤。
做到一半忽然想起静息态处理用到的DPABI,其实无论任务态还是静息态两者预处理部分都是类似的,而DPABI就是为了批量处理被试而诞生的,所以还是再详细叙述一下DPABI的预处理流程。而后再用其批量处理过后的结果使用spm进行任务态模型的设计与个体分析。
此次采用的是之前spm中采用的任务态FMRI数据。

一、 DPABI处理顺序

完整顺序

1

预处理常用顺序

2

二、DPABI批处理详细步骤

整理一下目前批量处理的四种做法
1.最原始的spmBatch单个被试,一个一个点击操作,费时费力,但重在精准。
2.spmBatch导出script后替换被试名称,整理成被试个数量的job文件,再在.m文件中复制粘贴被试个数量的执行步骤。比第一种方法稍微减轻些工作量,但总体依旧繁琐。
3.在第二种方法的基础上,直接修改code的循环。但是需要有一定的code基础,有一定难度,但是掌握后,便可自己维护与修改code。
4.使用DPABi进行预处理,只需整理文件数据结构,简单省时,但是容易报错,而且其中的步骤并非完全和spm相同,所以跑出来的结果可能不同,此处有待考证。

1.数据准备

3两组原始数据
4数据大致分布(n=37)

如图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 = ""))
}
5结构1 6结构2
7结构3
8结构4

2.去除前三个TP

1)运行界面设置


9O1.png

然后主要结果是一个tsv文件,此处可以看到TP等每个被试的基础信息。


10R1.png
2)检查发现共有220个TP,此时去除前3个。
11O2.png

再空跑一次后,发现TP已变成217。


12R2.png

3.预处理参数设置

1)了解DPABI中缩写


13缩写

2)分别设置R(头动校准),配准,W(标准化),S(平滑),automask(后续便于统计分析,非必选)(block设计不进行时间校准,而标准化方法这里我们尽量选择和spm一致的方法,new segment这里我没跑通,最终选择的还是old segment。)


14O3.png

4.结果文件结构

15
16

三、SPM模型设计与个体分析

由于DPABI最终处理结果是4D文件,而SPM处理仍需要3d文件,所以还是需要将4d转化为3d。
由于此处模型设计是spm特有的操作,所以仍需一个一个单独操作。
不过设置以下4个步骤的batch后,每个被试只需要修改“4Dto3D的输入文件”,“4Dto3D的输出文件目录”,“model设计的输出目录”以及“model设计中的头动文件”这四个地方就可以了。

1.4Dto3D

17

2.fMRI model specification

18
19

回归选取的头动参数需要选中每个被试前面处理生成的rp.txt文件。
这里按照实验设计speed onsets写为:0:62:372;baseline写为:32:62:404

3.Model estimation

20

4.设置Contrast(后续统计分析使用)(1 -1 0 0 0 0 0 0)

21

5结果展示(更改con文件命名为与被试同,便于后续统计分析)

22

这里再介绍一种方法,也就是以上说明的第三种批量处理方法对第三步:“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)文件结构展示


23

3)DPABI单样本t检验
这里根据行为学指标与头动指标排除被试(1,5,8,9,10,14,23,32,33)


24
4)view结果并报告。

相关文章

网友评论

      本文标题:FMRI任务态数据处理(DPABI&SPM)

      本文链接:https://www.haomeiwen.com/subject/flnnnrtx.html