【FSL】Tract-Based Spatial Statistics: TBSS



1. 目的
2. TBSSとは
2.1. 拡散MRIからFA画像を計算
2.2. tbss_1_preproc:TBSSの準備
2.3. tbss_2_reg:FAを標準空間に非線形位置合わせ
2.4. tbss_3_postreg:平均FA画像を生成し、FAスケルトンを生成
2.5. tbss_4_prestats:被験者ごとのFA画像を平均スケルトンに投影
2.6. tbss_non_FA:FA画像以外の定量値をスケルトンに投影
2.7. randomise:スケルトンに投影された定量値画像を入力したGLMと並べ替え検定(permutation test)
3. おまけ


1. 目的

  • Tract-Based Spatial Statistics: TBSS

2. TBSSとは

Tract-Based Spatial Statistics (TBSS) は、白質路の統計解析をするための手法。

神経線維束の中心線(skeleton)に定量値を投影する。通常の脳画像の統計解析では、脳構造の個人差を除外するために空間的「平滑化」を用いる。しかし、平滑化の程度に原則がなく、平滑化をかけては情報があいまいになり、MRIの高空間分解能を生かせないという問題がある。一方、TBSSでは、神経線維束の中心線と思われるところにskeletonを生成し、そこに個人ごとの定量値を投影するという手法をとる。これにより、平滑化せずに群間比較をすることができるため、平滑化による問題を回避できるという利点がある。

TBSS解析では、次のような処理をする。

  1. 拡散MRIからFA画像を計算
  2. tbss_1_preproc:TBSSの準備
  3. tbss_2_reg:FAを標準空間に非線形位置合わせ
  4. tbss_3_postreg:平均FA画像を生成し、FAスケルトンを生成
  5. tbss_4_prestats:被験者ごとのFA画像を平均スケルトンに投影
  6. tbss_non_FA:FA画像以外の定量値をスケルトンに投影
  7. randomise:スケルトンに投影された定量値画像を入力したGLMと並べ替え検定(permutation test)

2.1. 拡散MRIからFA画像を計算

拡散MRIからFA画像を計算し、被験者ごとのFA画像を準備する。

ここでは、健常者10名(ID: Con0001~Con0010)と患者10名(ID: Pat0001~Pat0010)いることを想定する。

.
├── Con0001_FA.nii.gz
├── Con0002_FA.nii.gz
├── Con0003_FA.nii.gz
...
└── Pat0010_FA.nii.gz

その他の定量値画像も解析に含めたい場合は、FA画像と合わせて次のように用意する。

ここでは、MDとFWという定量値画像を用意した。この時、定量値画像ごとのフォルダを作成し、各被験者の定量値画像を格納するが、ファイル名はFA画像と全く同じにすること(例. FA画像: Con0001_FA.nii.gz, MD画像: MD/Con0001_FA.nii.gz)。

.
├── Con0001_FA.nii.gz
├── Con0002_FA.nii.gz
├── Con0003_FA.nii.gz
...
└── Pat0010_FA.nii.gz
├── FW
│   ├── Con0001_FA.nii.gz
│   ├── Con0002_FA.nii.gz
│   ├── Con0003_FA.nii.gz
│   ...
│   └── Pat0010_FA.nii.gz
└── MD
    ├── Con0001_FA.nii.gz
    ├── Con0002_FA.nii.gz
    ├── Con0003_FA.nii.gz
    ...
    └── Pat0010_FA.nii.gz

2.2. tbss_1_preproc:TBSSの準備

ファイルの準備ができたら、tbss_1_preprocコマンドでTBSSの準備をする。

tbss_1_preproc *_FA.nii.gz

処理が終わると、「FAフォルダ」と「origdataフォルダ」を生成し、それぞれにFA画像が格納される。FAフォルダには、さらにFAのマスク画像が生成される。

.
├── FA
│   ├── Con0001_FA.nii.gz
│   ├── Con0001_FA_FA_mask.nii.gz
│   ├── Con0002_FA.nii.gz
│   ├── Con0002_FA_FA_mask.nii.gz
│   ├── Con0003_FA.nii.gz
│   ├── Con0003_FA_FA_mask.nii.gz
│   ...
│   └── Pat0010_FA.nii.gz
│   ├── Pat0010_FA._FA_mask.nii.gz
├── FW
│   ├── Con0001_FA.nii.gz
│   ├── Con0002_FA.nii.gz
│   ├── Con0003_FA.nii.gz
│   ...
│   └── Pat0010_FA.nii.gz
├── MD
│   ├── Con0001_FA.nii.gz
│   ├── Con0002_FA.nii.gz
│   ├── Con0003_FA.nii.gz
│   ...
│   └── Pat0010_FA.nii.gz
└── origdata 
    ├── Con0001_FA.nii.gz
    ├── Con0002_FA.nii.gz
    ├── Con0003_FA.nii.gz
    ...
    └── Pat0010_FA.nii.gz

「FA/slicesdir/index.html」をブラウザ(e.g., Chrome)で開くことで、各被験者のFA画像一覧をみることができる。

2.3. tbss_2_reg:FAを標準空間に非線形位置合わせ

tbss_1_preprocコマンドで、全ての被験者のFA画像を1x1x1mmの標準空間に非線形的な位置合わせする。通常は、-Tオプションで標準空間にある標準FA画像(FMRIB58_FA)に位置合わせをするが、-tオプションを用いて任意の画像に位置合わせすることもできる(推奨)。また、-nオプションでは、被験者の中で最も位置合わせ先としてふさわしいFA画像を見つけ出し、そのFA画像にすべての被験者のFA画像を位置合わせすることができる。

ここでは、TBSSで推奨されている-Tオプションを指定しすべての被験者FA画像を標準FA画像(FMRIB58_FA)に位置合わせをする。

tbss_2_reg -T

処理が完了すると、FAフォルダに結果が保存される。

「FA/*_to_target_warp.nii.gz」が、標準FA画像に位置合わせするためのwarp fieldである。

2.4. tbss_3_postreg:平均FA画像を生成し、FAスケルトンを生成

先程生成した標準FA画像に位置合わせするためのwarp fieldを用いて、各被験者のFA画像を標準空間(MNI152)に移動させる。その後、平均FA画像を生成し、その平均FA画像からFAスケルトンを生成する。tbss_3_postregでは、これらの処理を-Sオプションで実行することができが、代わりに標準FA画像(FMRIB58_FA mean)とそのスケルトンを用いたい場合は-Tを指定する。

ここでは、TBSSで推奨されている-Sオプションを指定する。

tbss_3_postreg -S

処理後の画像は、「statsフォルダ」に格納される。

stats/
├── all_FA.nii.gz  # 標準空間上における各被験者のFA画像
├── mean_FA.nii.gz  # 平均FA画像
├── mean_FA_mask.nii.gz  # 平均FA画像のマスク
└── mean_FA_skeleton.nii.gz  # 平均FA画像から生成したスケルトン画像

2.5. tbss_4_prestats:被験者ごとのFA画像を平均スケルトンに投影

tbss_4_prestatsコマンドでは、まず平均FA画像から生成したスケルトン画像(mean_FA_skeleton.nii.gz)をしきい値処理(通常 0.2)をし、スケルトンのバイナリーマスク画像を生成する。次に、このスケルトンマスクからの距離マップ(distance map)が計算され、この距離マップを参考に、被験者ごとのFA画像をスケルトン画像に格納(投影)する。

tbss_4_prestats 0.2

statsフォルダに、新たに次のファイルが生成される。

stats/
├── all_FA_skeletonised.nii.gz  # スケルトンに投影されたすべての被験者のFA画像
├── mean_FA_skeleton_mask.nii.gz  # スケルトンマスク
├── mean_FA_skeleton_mask_dst.nii.gz  # スケルトンマスクからの距離マップ(distance map)
└── thresh.txt  # バイナリースケルトンマスク画像を作る際のしきい値

2.6. tbss_non_FA:FA画像以外の定量値をスケルトンに投影

tbss_non_FAコマンドで、FA画像以外の定量値をスケルトンに投影する。このとき、標準空間への移動やスケルトンを生成するためのパラメータは、FA画像で使ったものが適用される。

NONFA_LIST=$(ls -F | grep / | cut -d / -f 1 | grep -v stats| grep -v origdata)

for MAP in ${NONFA_LIST}; do
    tbss_non_FA ${MAP}
done

2.7. randomise:スケルトンに投影された定量値画像を入力したGLMと並べ替え検定(permutation test)

まず、GLMのデザインマトリックス(計画行列)とコントラストを設定する。

今回は、健常者10名(ID: Con0001~Con0010)と患者10名(ID: Pat0001~Pat0010)のデータがある。「origdataフォルダ」をみると、先に健常者10名のFA画像、次に患者10名のFA画像が並んでいることが分かる。

ls -1 origdata
Con0001_FA.nii.gz
Con0002_FA.nii.gz
Con0003_FA.nii.gz
...
Pat0010_FA.nii.gz

次に、GLMのデザインマトリックス(計画行列)とコントラストを決める設定ファイルを生成する。design_ttest2 <出力ファイル> <健常者数> <患者数>でコマンドを実行。

design_ttest2 stats/design 10 10

statsフォルダに、デザインマトリックス(design.mat)とコントラスト(design.con)が生成される。

デザインマトリックス(design.mat)の中身を確認。

/Matrixの一列目は健常者データであるかどうか、二列目は患者データであるかを0, 1で表している。行の順番は、origdataフォルダにあるファイルの順番(昇順)に対応する。したがって、これらは対応があるようにしておかなければならない。

cat stats/design.mat
/NumWaves 2
/NumPoints 20
/PPheights 1 1
/Matrix
1 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0
0 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1

コントラスト(design.con)の中身を確認してみる。

/Matrix一列目は健常者の偏回帰係数、二列目は患者の偏回帰係数に対するもので、行は別々のコントラストである。この場合、一行目は健常者>患者の検定、二行目は健常者<患者の検定に相当する。

cat stats/design.con
/NumWaves 2
/NumContrasts 2
/PPheights 1 1
/Matrix
1 -1
-1 1

デザインマトリックス(計画行列)とコントラストの確認ができたら、randomiseコマンド使ってGLMと並べ替え検定(permutation test)を実行する。

randomiseコマンドの各オプションは、次の通り。

  • -i:入力画像
  • -m:マスク画像
  • -o :出力画像
  • -o :デザインマトリックス
  • -o :デザインコントラスト
  • -n:並べ替え検定の数
  • –T2:2D最適化を用いたTFCE
  • -x:voxel-wiseのcorrected P値マップ
  • –uncorrp:un-corrected P値マップ
  • -R:統計値マップ
for MAP in FA ${NONFA_LIST}; do
    randomise -i stats/all_${MAP}_skeletonised \
        -o stats/tbss_${MAP} \
        -m stats/mean_FA_skeleton_mask \
        -d stats/design.mat \
        -t stats/design.con \
        -n 10000 --T2 -V -x --uncorrp -R
done

次のようなファイルが、生成される。

TFCEを用いた”健常群>患者群”の検定で、FWE補正をされたP値マップ(tbss_FA_tfce_corrp_tstat1.nii.gz)を確認する。ここで、得られたP値マップは1-P値のマップであることに注意する。つまり、P<.05を有意とするのであれば、P値マップで0.95-1.00の値を見ればよい

fsleyes ${FSLDIR}/data/standard/FMRIB58_FA_1mm.nii.gz \
    ${FSLDIR}/data/standard/FMRIB58_FA-skeleton_1mm.nii.gz -cm Green \
    stats/tbss_FA_tfce_p_tstat1.nii.gz -cm Red-Yellow -dr 0.95 1

スケルトンは細いため有意差が見づらい場合がある。そのような時、tbss_fillコマンドが役に立つ。

tbss_fillコマンドの基本的な使い方は、以下の通り。

tbss_fill <P値マップ> <しきい値> <平均FA画像> <出力画像>

TFCEを用いた”健常群>患者群”の検定で、FWE補正をされたP値マップ(tbss_FA_tfce_corrp_tstat1.nii.gz)の有意差があった領域のみを0.95でしきい値処理をして抽出し、その領域を膨張させる。

tbss_fill stats/tbss_FA_tfce_p_tstat1.nii.gz 0.95 stats/mean_FA stats/tbss_FA_tfce_p_tstat1_fill.nii.gz

赤く表示されている領域は、健常群が患者群よりも有意(FWE-corrected)にFA値が大きいことを示している。

3.おまけ

大量に定量値があり、それらをすべて検定する場合、有意差があったかどうかをすべて確認するのは大変である。そこで、各定量値画像のP値マップが0.95以上の値を持つかどうかを判定し、有意差があった場合のみ、tbss_fillコマンドを実行する。

for PMAP in $(ls stats/ | grep tfce_corrp); do
    PMAX=$(fslstats stats/${PMAP} -R | cut -d " " -f2)
    echo ${PMAP} >>stats/tmp1.txt
    echo ${PMAX} >>stats/tmp2.txt
    if [ $(echo "${PMAX} > 0.95" | bc) == 1 ]; then
        tbss_fill stats/${PMAP} 0.95 stats/mean_FA stats/${PMAP}_fill
    fi
done
paste stats/tmp* >stats/tmp_corrected_P_report.txt
echo -e "$(cat stats/tmp_corrected_P_report.txt)\n\n\n$(cat stats/tmp_corrected_P_report.txt | sort -r -n -k 2)" \
    >stats/corrected_P_report.txt
rm stats/tmp*

上のコマンドを実行すると、statsフォルダに各検定とそのP値マップの最大値が記された「corrected_P_report.txt」が出力される。

検定結果を、ファイル名でソート(上段)したものと、P値でソートしたもの(下段)に分けて保存している。

cat stats/corrected_P_report.txt
tbss_FA_tfce_corrp_tstat1.nii.gz    0.992000
tbss_FA_tfce_corrp_tstat2.nii.gz    0.416000
tbss_FW_tfce_corrp_tstat1.nii.gz    0.361839
tbss_FW_tfce_corrp_tstat2.nii.gz    0.997261
tbss_MD_tfce_corrp_tstat1.nii.gz    0.389816
tbss_MD_tfce_corrp_tstat2.nii.gz    0.985748


tbss_FW_tfce_corrp_tstat2.nii.gz    0.997261
tbss_FA_tfce_corrp_tstat1.nii.gz    0.992000
tbss_MD_tfce_corrp_tstat2.nii.gz    0.985748
tbss_FA_tfce_corrp_tstat2.nii.gz    0.416000
tbss_MD_tfce_corrp_tstat1.nii.gz    0.389816
tbss_FW_tfce_corrp_tstat1.nii.gz    0.361839

【FSL】Tract-Based Spatial Statistics: TBSS” へのコメント

  1.  早速のご回答、ありがとうございます。
     やはりそうなのですね。rangeをいじってしまわないよう気をつけます(うっかり変更して、間違った解釈をしてしまったことがありましたので)。

  2. お世話になってます。前回のabisではありがとうございました。
    TBSSに関してひとつ確認させてください。

    最後にFSLeyesで表示する時、記事のように入力すると、data display rangeが0.95 1となります。
    こちらの数値は「有意水準5%以下」に対応しているという認識でよろしいでしょうか。
    つまり、FSLeyesでbrightnessやcontrastをいじって、数値を変更してしまうと、正確な検定にならないという理解でお間違えないでしょうか。

    お手すきの際にご教示いただけましたら幸いです。

    • はい、そのとおりです。FSLeyesのrangeは、1-p とお考えください。
      なので、p<0.05 は、0.95-1.00 となります。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください