[spm操作]什么是ROI,如何做ROI以及批量提取ROI
的%signalchange的⽰例程序
本帖作为的⼀部分
⽬录贴请见
ROI (region of interest, 感兴趣区),顾名思义,就是研究者感兴趣的地⽅。通常在脑成像数据处理中,会把某些ROI中的信号提取出来,来和⾏为或是其它脑区数据做相关。做静息态的朋友也应该了解,所谓的功能连接(functional connectivity ),就是把某个脑区做成ROI,也叫种⼦点(seed region),提取出其信号随时间点变化的序列(timecourse),然后⽤这个序列去和全脑体素做相关(据我所知,⾄少有时候是简单的⽪尔逊积差相关),相关较强的脑区就是与这个种⼦点功能连接显著的脑区。
在某些有任务的研究中,研究者会提取某个脑区的信号(beta weights, contrast value 或者% signal change),然后像对待⾏为数据那样使⽤它们。
如何选择或定义ROI
选择ROI⼀般基于(1)特定的脑结构,
(2)前⼈⽂献中显著的脑区,
(3)元分析结果,
(4)定位run (localizer run,同⼀批被试在另⼀个任务相同或相似的单独的run)中激活的脑区
可以参考Poldrack, R. A. (2007). Region of interest analysis for fMRI. Social cognitive and affective neuroscience, 2(1), 67-70.
基于脑结构的(⽐如杏仁核)叫做 structural ROI。其它的叫做functional ROI。具体例⼦可以看MarsBar的⼿册。
在实际的定义时,对于结构ROI,可以根据现成的模板(template)来定义,⽐如AAL的各个脑区。
对于功能ROI,可以提取激活峰值点的坐标,做成球形ROI(spherical ROI),也可以根据激活团块提取激活区ROI。实际上,你可以定义任何形状的ROI(当然还要考虑体素本⾝的颗粒感)。具体的定义⽅式可以参考MarsBar的⼿册。关于提取ROI内的信号,其实ROI就是⼀个⼩⼀点的mask,mask就是⼤⼀点的ROI,或者说它们本质上⼀样。ROI就是⼀个⼤的三维矩阵,除了对应于你的感兴趣的脑区之外的地⽅都是0,ROI之内都是1(在SPM中看的时候ROI边缘介于0和1,但实际上图像本⾝只有1和0两个值。)。
如下图就是⼀个球形ROI的⽰例:
定义ROI或进⾏分析常⽤的⼯具包
我个⼈最常⽤的是MarsBar
此外还有WFU PickAtlas
这两个⼯具包都有详细的说明和⽰例。
做ROI以及提取% signal change和contrast value的批处理⽰例程序
(基于Marsbar,所以要把MarsBar的⼯具包纳⼊到matlab的搜索路径中)
>>>>>>>>>>>##
% MarsBaR的批处理程序,将结果保存为txt和mat两种格式。⽂件题⽬标明roi是取对⽐值还是信号百分⽐,半径,中⼼和保存⽂件的时间(以便于⽤统计软件进⾏批处理)
clear;
marsbar('on');  % 打开marsbar
subjroot = 'I:\kongliliushuang\SPM_MRIresults_Analysis\StruNorm_tTest\';  % 数据所在的路径
roi_dir = ('I:\kongliliushuang \SPM_MRIresults_Analysis\ROI_StruNorm_tTest\');% 存放ROI的路径
roiimg_dir=fullfile(roi_dir,'img');%存放ROI图像的路径
spm('defaults', 'fmri');    %设置SPM默认参数
sphere_matr=[3,6,10];%三种球形ROI的半径,分别为3mm,6mm以及10mm,你可以只⽤⼀种,也可多试⼏种
%以下输⼊要取的ROI的中⼼(可以是其他研究中激活点的峰值,或是定位run的激活脑区峰值)
fociMatrix=[63 -54 39;
51 -48 27;
63 -54 24];
cd (roi_dir);%保存结果⽂件的地⽅
commonstring='myROI'; %保存的⼏个⽂件共有的开头的名字,可以随意更改
save_name=[commonstring,datestr(now,'yyyy_mm_dd_HH_MM_SS'),'.mat'];  %保存综合⽂件的名字
save_name1=[commonstring,'_perc_',datestr(now,'yyyy_mm_dd_HH_MM_SS'),'.txt'];  %保存信号百分⽐⽂件的名字批处理文件怎么做
save_name2=[commonstring,'_contr_',datestr(now,'yyyy_mm_dd_HH_MM_SS'),'.txt'];  %保存对⽐值⽂件的名字
save_name3=[commonstring,'_centermatrix_',datestr(now,'yyyy_mm_dd_HH_MM_SS'),'.txt'];  %保存ROI球⼼矩阵的⽂件的名字
summary_sphere_result_perc=[]; %设置⼀个空矩阵来装所有的结果
summary_sphere_result_con=[];
for loop_sphere=1:3  %使⽤三种半径
summary_result_perc=[]; %设置⼀个空矩阵来装所有的结果
summary_result_con=[];
for loop=1:size(fociMatrix,1)
%%%%%%%%%%%%%%%%%%%%%%%%%%设置球形ROI%%%%%%%%%%%%%%%%%%%%%%%
sphere_centre = fociMatrix(loop,:); %球形ROI的中⼼此处必须是MNI坐标,如果不是,需要转化为MNI坐标
sphere_radius= sphere_matr(loop_sphere);        %球形ROI的半径
sphere_roi = maroi_sphere(struct('centre', sphere_centre,'radius', sphere_radius));
% 给roi命名
sphere_roi = label(sphere_roi,sprintf( 'sphere%2dmm_%2d_%2d_%2d_roi',sphere_radius,sphere_centre(1),sphere_centre(2),sphere_centre(3)) );
roi_name=sprintf('sphere%2dmm_%2d_%2d_%2d_roi.mat',sphere_radius,sphere_centre(1),sphere_centre(2),sphere_centre(3));
saveroi(sphere_roi, fullfile(roi_dir,roi_name));% 将ROI保存为MarsBaR的ROI⽂件
% 将ROI保存为图像
save_as_image(sphere_roi,
fullfile(roiimg_dir,sprintf('sphere%2dmm_%2d_%2d_%2d_roi.img',sphere_radius,sphere_centre(1),sphere_centre(2),sphere_centre(3)))); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%
roi=sphere_roi;
%%
nsub=20;      %被试的个数
result_perc=[]; %设置⼀个空矩阵来装所有的结果
result_con=[];
for sub=1:nsub
if sub==3|| sub==7 || sub==17;  %跳过有问题的被试
continue;
end
dir=[ subjroot sprintf('subject%02d',sub)];
D = mardo(fullfile(dir, 'MyResults', 'SPM.mat'));  %此处最重要,将SPM的设计矩阵等信息载⼊进来
Y = get_marsy(roi, D, 'mean'); % 从模型中取出ROI中的数据
E = estimate(D, Y); % MarsBaR 进⾏估计
%以下取%signal
%change+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[e_specs,e_names]=event_specs(E);  %定义模型中所有的事件,即条件
n_events=size(e_specs,2);
dur=9;  %所提取事件的持续时间
for e_s=1:n_events
pct_ev(e_s)=event_signal(E,e_specs(:,e_s),dur) %返回% signal change
end
perc(1)=(pct_ev(2)+pct_ev(7)+pct_ev(12)+pct_ev(17))/4;  %由于每个run中都有我要研究的条件,将每个run中的此条件提取出%信号变化,然后求均值。2,7,12,17表⽰在整个设计矩阵中这个条件的排序,可参考中的设计矩阵图⽚
perc(2)=(pct_ev(3)+pct_ev(8)+pct_ev(13)+pct_ev(18))/4;
perc(3)=(pct_ev(4)+pct_ev(9)+pct_ev(14)+pct_ev(19))/4;
perc(4)=(pct_ev(5)+pct_ev(10)+pct_ev(15)+pct_ev(20))/4;
perc(5)=(pct_ev(6)+pct_ev(11)+pct_ev(16)+pct_ev(21))/4;
result=perc;
result_perc=[result_perc; result]
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%以下取constrast值++++++++++++++++++++++++++++++++++++++++++++++++++++
[E Ic]=add_contrasts(E,D); %取出模型中的所有对⽐
stat_struct=compute_contrasts(E,Ic)
conva(1)=(1);  % 取出所有前四个对⽐的contrast值
conva(2)=(2);
conva(3)=(3);
conva(4)=(4);
resultc=conva;
result_con=[result_con;resultc]
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
end
summary_result_perc=[summary_result_perc,[fociMatrix(loop,:),[sphere_radius*ones(1,2)];result_perc]];
summary_result_con=[summary_result_con,[fociMatrix(loop,:),[sphere_radius*ones(1,1)];result_con]];
end
summary_sphere_result_perc=[summary_sphere_result_perc;summary_result_perc];
summary_sphere_result_con=[summary_sphere_result_con;summary_result_con];
end
cd (roi_dir);%保存结果⽂件的地⽅
save(save_name,'fociMatrix','summary_sphere_result_perc','summary_sphere_result_con');
save(save_name1,'summary_sphere_result_perc','-ASCII')
save(save_name2,'summary_sphere_result_con','-ASCII')
save(save_name3,'fociMatrix','-ASCII')  % 保存结果。可以直接拷贝到excel或⽤其他软件处理。输出的txt⽂档是⼀张⼤表,你要搞清楚不同ROI和半径⼤⼩是怎么排列的。
你把⽣成的txt⽂件中的东西贴到spreadsheet中看起来就是下图这个样⼦的(当然这个截图只是⼀个⼩部分)。为了便于查看,我把有ROI坐标的那⼀⾏的格式换成了整数并且⾼亮成了黄⾊。可以看出,我从坐标为[21 12 31]的ROI中提取出了6个条件的信号(横着看有6列),并且表格中21 12 21 后⾯的3 3 3表⽰ROI 半径是3mm。⽽且能看出我提取了17个被试的数据。当然整个表格可以⾮常⼤,你也可以根据⾃⼰的⽬的来修改代码已⽣成更符合你需要的排列⽅式。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。

发表评论