2.Brains Crack/SPM8 Batch

Top > 2.Brains Crack > SPM8 Batch

SPM Batch の ススメ

GUI を使った操作は,最初は解析手順をとても理解しやすい.ただ,一度理解してしまうと,まどろっこしい...

SPM の中の人たちは,GUI を使わずにプログラムコードを書いて一連の解析をまとめて計算することを Batch 処理と呼んでいる.ここでは,Batch 処理をするためにScript file(*.m)を作成し,GUI で入力する時間の分を短縮することを目的にする.繰り返しとなる作業(被験者で共通する解析やファイル選択など)の分について時間短縮になる.解析の変更も容易になる.

fMRI の解析では,全ての被験者で同じ解析を繰り返すことが多い.GUI で全ての解析を行うのは,時間がかかったり,入力ミスの原因である.さらには,GUIだと明示的には記録を残さないので,入力ミスがあったかを後から確認しずらい.



SPM Batch

このページの目的

Batch 処理をする Scipt file を作成するにしても,SPM解析一連の全てを独自に書くのは膨大すぎるので,適宜SPM の関数,構造体(計算結果が格納された変数)を利用できるようにコードを書いておく必要がある.つまり,SPM での GUI の解析とBatch での解析を行ったり来たりできるように,Script file を書けるようにすることを目的とします.

なので,下記に紹介する Batch script は解析アルゴリズムのコードを記述するのではなく,SPMが指定した方法で実験パラメータを記述していく方法を紹介します.

SPM で結果ファイルがどのように更新されるか

SPMでは前処理(Preprocessing)の結果は,新しく画像ファイル(*.img)が作られたり,対となるヘッダーファイル(*.hdr)が更新されていく.

一方で,前処理以降の解析結果は,特に変数などについては SPM.mat やDCM.mat などの構造体が変更される.ある解析によって作成された構造体に格納された値を用いて,次の解析が行われる.

SPM のBatch 処理による解析

SPMでは Batch処理するコードは,おおまかに分けて2つの方法がある.

  1. 解析アルゴリズムのプログラムコードを書いて計算し,計算結果をSPM の構造体(SPM.mat,DCM.mat)に格納する.
  2. Batch Editor に準拠した形式で入力変数だけをプログラムコードに書き,計算自体はSPMが用意したアルゴリズムでおこない構造体を作成する.

SPM5 以降では Batch Editorを利用して,Batch 処理をするコードを GUI で作成し,Script M-file (Job file と呼ばれる) として保存できるようになった.Batch Editor で作成されたコードは,一度 GUI 上で入力した変数を格納した構造体を作り,それを元に計算して,SPM.mat を作成する.「SPM での GUI の解析とBatch での解析を行ったり来たりできるように」するため,以下では,後者の方法を紹介する.

この方法では,SPM の解析アルゴリズムを理解できるわけではないので,別途 SPM のプログラムコードを読んで理解する必要もある.

Minimum Template code

Job ファイルを実行するためのテンプレートコード

  clear all;
     
  % Initialise SPM
  spm('Defaults','fMRI');
   spm_jobman('initcfg');
   
   % Making Job file
   matlabbatch{1}.spm.stats. …
   ...
   ...
    
   % Run Job file   
   spm_jobman('run', matlabbatch);
  • Making Job file で記述するコードは,Batch Editor(GUI)で作成できる.場合によっては,Batch Editor で作成し,Save Batch もしくは Save Batch & Script で保存して,ここにコピペしても良い.
  • matlabbatch{1}.spm.stats. … として何を入力するかは,Batch Editor(GUI)で表示されるているのと同じ順なので,分からなくなったら,GUIを起動してみて確認できる.

複数の解析過程を1つの Job ファイルとして,実行する.

matlabbatch{n}.…, n を順に増やしていくと,n の順番に解析が行われる.

サンプルコード

  • ここでの例では,1人分の個人解析の「モデリング」,「推定」,「差分画像の作成」の3つの解析をまとめた. cf. SPM Batch/1stAnalysis?
  % Initialise SPM
  spm('Defaults','fMRI');
   spm_jobman('initcfg');
   
   %%% fMRI Specification ---------------------------------------------------------------
   matlabbatch{1}.spm.stats.fmri_spec.dir = cellstr(spm_dir);
   matlabbatch{1}.spm.stats.fmri_spec.timing.units = 'scans'; % 'scans' or 'second'
   matlabbatch{1}.spm.stats.fmri_spec.timing.RT = 2;
     ...
     ...
   %%% fMRI Estimation ------------------------------------------------------------------
   matlabbatch{2}.spm.stats.fmri_est.spmmat = ... % SPM.mat ファイルを指定 
                     cellstr(fullfile(spm_dir,'SPM.mat'));
   %%% Contrast -------------------------------------------------------------------------
   matlabbatch{3}.spm.stats.con.spmmat = cellstr(fullfile(spm_dir,'SPM.mat'));
   % Contrast1 
   matlabbatch{3}.spm.stats.con.consess{1}.tcon.name   = 'Task1 - Task2';
   matlabbatch{3}.spm.stats.con.consess{1}.tcon.convec = ...
			[1, -1, zeros(1, 6), 1, -1, zeros(1, 6), zeros(1, 2)]; 
	...
	... 
   matlabbatch{3}.spm.stats.con.delete = 1; % delete, 1; not delete, 0 
   
   % Run Job file   
   spm_jobman('run', matlabbatch);

Result Report|統計値画像の表示

統計値画像の表示

   clear all;
   
   % Initialise SPM
   spm('Defaults','fMRI');
   spm_jobman('initcfg');
   
   %%% Result Report ---------------------------------------------------------------
   matlabbatch{1}.spm.stats.results.spmmat = cellstr(fullfile(spm_dir,'SPM.mat'));
   matlabbatch{1}.spm.stats.results.conspec.titlestr = 'Task1-2 (masked Task2 positive unc.<0.001)';
   matlabbatch{1}.spm.stats.results.conspec.contrasts = [1]; % number of con_*.img
   matlabbatch{1}.spm.stats.results.conspec.threshdesc = 'none'; % 'none' or 'FWE'l
   matlabbatch{1}.spm.stats.results.conspec.thresh = 0.001; % p-value of threshold
   matlabbatch{1}.spm.stats.results.conspec.extent = 0; % Extent voxel size
   
   % Masking
   % For image file mask
   matlabbatch{1}.spm.stats.results.conspec.mask.contrasts = {...
   	'*/fMRIanalysis/maskedImage/occipital.nii'};%
   matlabbatch{1}.spm.stats.results.conspec.mask.thresh = {};
   matlabbatch{1}.spm.stats.results.conspec.mask.mtype = 0; %Inclusive, 0; Exculusive, 1
   % For contrast mask
   % 	matlabbatch{1}.spm.stats.results.conspec.mask.contrasts = 2; % number of con_*.img 
   % 	matlabbatch{1}.spm.stats.results.conspec.mask.thresh = 0.05; % p-value of threshold
   % 	matlabbatch{1}.spm.stats.results.conspec.mask.mtype = 0; % Inclusive, 0; Exculusive, 1
   
   matlabbatch{1}.spm.stats.results.units = 1; % Data type: Volumetric, 1; Scalp-Time, 2; ...
   matlabbatch{1}.spm.stats.results.print = true; % true or false
   %%% End: Result Report ---------------------------------------------------------------
   
   %% Run job file
   spm_jobman('run', matlabbatch);
  • matlabbatch{1}.spm.stats.results.conspec.contrasts
    • 先に作成した con_*.img の番号を参照して,目的の統計値画像を入力する.
    • 多くの場合は,ここは1つのコントラスト画像を入力するが,
      Conjunction の解析(条件間で共通して活動する領野を同定する解析)をする時には,
      matlabbatch{1}.spm.stats.results.conspec.contrasts = [1, 2];
      と複数のコントラスト画像を入力する.
    • ただし,プログラムを実行すると,GUIで Conjunction か Global を聞かれるので,Conjunctionをクリックする.
      (プログラムコードとして,Conjunction を設定する方法はわからない(2011 Nov.23rd 現在)).
  • matlabbatch{1}.spm.stats.results.conspec.mask.contrasts
    • Mask 画像として,画像ファイルを選択する方法場合には,ファイル名を入力する.
    • コントラスト画像の中から選択する場合は,その番号を入力する.
  • matlabbatch{1}.spm.stats.results.print
    • turu を選択すると,結果が *.ps ファイルとして出力される.

参考 Link

最終更新日: 2014-11-21 (金) 16:14:09 (1705d)

 

TOP