SPMの結果から閾値をこえる領域のすべての座標を求める方法

最近、ある方にこういう依頼を受けました。

「SPMの結果から閾値を超えるクラスターの全領域名が知りたい」

このためには、まず、閾値を超えるクラスターの座標を知る必要があります。
SPMの構造体には、座標がすべて入っています。

SPMで結果を出した後に、Matlabのコマンドウィンドウに以下をタイプするだけでOKです。

xSPM.XYZmm

SPMの統計結果は xSPM という構造体におさめられています。
xSPMとタイプすると構造体の内容を見ることができます。

>> xSPM

xSPM = 

  フィールドをもつ struct:

          swd: 'ワーキングディレクトリ'
        title: 'コントラストのタイトル'
            Z: [1×1102 double]
            n: 1
         STAT: 'T'
           df: [1.0000 250.0000]
      STATstr: 'T_{250}'
           Ic: 2
           Im: []
           pm: []
           Ex: []
            u: 3.1232
            k: 100
          XYZ: [3×1102 double]
        XYZmm: [3×1102 double]
            S: 70831
            R: [1 41.5028 447.2876 1.2207e+03]
         FWHM: [3.6448 3.8374 3.7707]
            M: [4×4 double]
           iM: [4×4 double]
          DIM: [3×1 double]
          VOX: [3 3 3]
         Vspm: [1×1 struct]
    thresDesc: 'p<0.001 (unc.)'
         VRpv: [1×1 struct]
           Pp: [1×116 double]
           Pc: [1×58 double]
           uc: [4.8405 Inf 62.0000 62.0000]
        units: {'mm'  'mm'  'mm'}

これを改めてみると、SPMのResultsに出てくる内容がほぼ網羅されていることがわかります。

Z: [1×1102 double] はZ値が1102個あるということです。つまり、閾値を超えるボクセルが1102ボクセルあるということがわかります。
u: 3.1232 は p<0.001, uncorrectedに相応するT値、k: 100 はextent thresholdです。
XYZ: [3×1102 double]には、ボクセルの位置が入っており、XYZmmに、そのMNI座標が入っています。

とこんな感じでいろいろな情報が入っています。

XYZmmは3×1102ですから、3行1102列の行列です。
これは扱いにくいので、転置してあげると扱いやすくなります。

>&gt; A=xSPM.XYZmm;
>&gt; A'

ans =

    -9    54    21
    -6    54    24
    -9    54    24
   -12    54    24
    -6    57    24
    -9    57    24
   -12    57    24
   -15    57    24
 (…以下、この例の場合では1102行の出力が続きます)

こうやってすべての座標を得ることができました。

SPMでは、統計の結果はデフォルトでは、8mm離れたピーク領域しか表示されませんが、このような方法を使えば自分が気になっている領域が入っているかどうかを確認できます。