1. 目的
2. GBSSとは
2.1. データの準備
2.2. 解析パラメータの設定
2.3. gbss_1_T1wpreproc
:T1WIの前処理
2.4. gbss_2_DWIwpreproc
:拡散定量値の前処理
2.5. gbss_3_skelpreproc
:拡散定量値をスケルトンに投影
2.6. randomise
:スケルトンに投影された定量値画像を入力したGLMと並べ替え検定(permutation test)
3. おまけ
1. 目的
- Gray matter-Based Spatial Statistics: GBSS
2. GBSSとは
Gray matter-Based Spatial Statistics(GBSS)は、灰白質の統計解析をするための手法。TBSSの灰白質版。
灰白質の中心線(skeleton)に定量値を投影する。通常の脳画像の統計解析では、脳構造の個人差を除外するために空間的「平滑化」を用いる。しかし、平滑化の程度に原則がなく、平滑化をかけては情報があいまいになり、MRIの高空間分解能を生かせないという問題がある。一方、GBSSでは、灰白質の中心線と思われるところにskeletonを生成し、そこに個人ごとの定量値を投影するという手法をとる。これにより、平滑化せずに群間比較をすることができるため、平滑化による問題を回避できるという利点がある。
GBSS解析では、次のような処理をする。
- データの準備
- 解析パラメータの設定
gbss_1_T1wpreproc
:T1WIの前処理gbss_2_DWIwpreproc
:拡散定量値の前処理gbss_3_skelpreproc
:拡散定量値をスケルトンに投影randomise
:スケルトンに投影された定量値画像を入力したGLMと並べ替え検定(permutation test)
2.1. データの準備
まず、次のデータを準備する。
- b0フォルダ:b0 (DWI, b=0 s/mm^2)
- T1wフォルダ:3D-T1WI
- 拡散定量値:FA, MD, FW, etc.
フォルダ構造は次のようにする。
ここでは、健常者10名(ID: Con0001~Con0010)と患者10名(ID: Pat0001~Pat0010)いることを想定する。各フォルダに入れるファイル名は同じにする必要がある(例:FA/Subj001.nii.gz, T1w/Subj001.nii.gzは同じファイル名)。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | . ├── FA │ ├── Con0001.nii.gz │ ├── Con0002.nii.gz │ ├── ... │ └── Pat0010.nii.gz ├── FW │ ├── Con0001.nii.gz │ ├── Con0002.nii.gz │ ├── ... │ └── Pat0010.nii.gz ├── MD │ ├── Con0001.nii.gz │ ├── Con0002.nii.gz │ ├── ... │ └── Pat0010.nii.gz ├── T1w │ ├── Con0001.nii.gz │ ├── Con0002.nii.gz │ ├── ... │ └── Pat0010.nii.gz └── b0 ├── Con0001.nii.gz ├── Con0002.nii.gz ├── ... └── Pat0010.nii.gz |
2.2. 解析パラメータの設定
解析に用いるパラメータを設定する。
PEDIR
、ECHOSPACING
はepi_reg
コマンドのパラメータであり、それぞれ位相エンコード方向とecho spacing timeを指定する。SKELETON_THR
はスケルトン化する際のしきい値である。
1 2 3 4 5 | MAP_LIST=$( ls | grep - v b0 | grep - v T1w | grep - v stats) SUBJ_LIST=$( ls T1w | cut -d . -f1) PEDIR= '-y' # Phase encoding direction: "epi_reg" config ECHOSPACING= '0.0380544' # Echo spacing time (s): "epi_reg" config SKELETON_THR=0.2 # Skeleton threshold |
2.3. gbss_1_T1wpreproc
:T1WIの前処理
T1WIの前処理内容は、次の通り。
- 脳頭蓋除去
- 灰白質をセグメント
- 灰白質を標準脳(MNI152)に位置合わせ
- 標準空間上の各被験者の灰白質を平均化
以上の処理内容を実行するために、関数gbss_1_T1wpreproc
を定義。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | function gbss_1_T1wpreproc() { echo "T1w preprocessing..." # T1w preprocessing for SUBJ in ${SUBJ_LIST}; do ## Segment GM ### Skull-stripping bet T1w/${SUBJ} T1w/${SUBJ}_skull_stripped -f 0.3 -R -S -B ### Segment T1w into CSF/GM/WM fast -t 1 -g -B -b -p -o T1w/${SUBJ}_fast T1w/${SUBJ}_skull_stripped ## Register GM to MNI ### Register T1w to MNI flirt -ref ${FSLDIR} /data/standard/MNI152_T1_2mm_brain \ - in T1w/${SUBJ}_fast_restore \ -omat T1w/${SUBJ}_indiv2MNI.mat fnirt -- in =T1w/${SUBJ}_fast_restore \ --aff=T1w/${SUBJ}_indiv2MNI.mat \ --cout=T1w/${SUBJ}_indiv2MNI_warp \ --config=T1_2_MNI152_2mm ### applywarp to GM and move it into MNI applywarp --ref=${FSLDIR} /data/standard/MNI152_T1_2mm_brain \ -- in =T1w/${SUBJ}_fast_pve_1 \ --warp=T1w/${SUBJ}_indiv2MNI_warp \ --out=T1w/${SUBJ}_fast_pve_1_inMNI & done ## Create 4D all_GM image ### GM_pve1 in MNI are merged into one volume mkdir stats fslmerge -t stats /all_GM $(imglob T1w/*_fast_pve_1_inMNI.nii.gz) ### Create merged GM_pve1 (all_GM) mask and apply it to all_GM fslmaths stats /all_GM -max 0 -Tmin -bin stats /mean_GM_mask -odt char fslmaths stats /all_GM -Tmean stats /mean_GM } |
関数が定義できたら、実行する。
1 | gbss_1_T1wpreproc |
処理が完了すると、statsフォルダにすべての被験者の灰白質画像がまとめられた「all_GM.nii.gz」とそれを平均化した「mean_GM.nii.gz」が生成される。
2.4. gbss_2_DWIwpreproc
:拡散定量値の前処理
拡散定量値の前処理の過程は、次の通り。
- b0をT1WIに位置合わせ
- b0 to T1WIとT1WI to 標準脳のWarp Fieldを使って、拡散定量値マップを標準空間に移動
- 標準空間上にあるすべての被験者の拡散定量値マップをひとつの4D volume dataにまとめる
- 平均灰白質マスク
mean_GM_mask
で、3の拡散定量値マップをマスク処理
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | function gbss_2_DWIwpreproc() { echo "Diffusion MAP preprocessing..." # Diffusion MAP preprocessing for SUBJ in ${SUBJ_LIST}; do ## Register b0 to MNI ### Register b0 to T1WI epi_reg --epi=b0/${SUBJ} \ --t1=T1w/${SUBJ} --t1brain=T1w/${SUBJ}_skull_stripped \ --echospacing=${ECHOSPACING} --pedir=${PEDIR} \ --wmseg=T1w // ${SUBJ}_fast_seg_2.nii.gz \ --out=b0/${SUBJ}_BBR for MAP in ${MAP_LIST}; do ### applywarp to diffusion map and move it to T1w based on epi_reg flirt - in ${MAP}/${SUBJ} \ -out ${MAP}/${SUBJ}_inT1 \ -ref T1w/${SUBJ}_skull_stripped \ -init b0/${SUBJ}_BBR.mat -applyxfm ### applywarp to dMAP in T1w and move it to MNI applywarp --ref=${FSLDIR} /data/standard/MNI152_T1_2mm_brain \ -- in =${MAP}/${SUBJ}_inT1 \ --warp=T1w/${SUBJ}_indiv2MNI_warp \ --out=${MAP}/${SUBJ}_inMNI done done ## 4D all_${dMAP} for MAP in ${MAP_LIST}; do ### Merge dMAP in MNI into one volume, all_${MAP} fslmerge -t stats /all_ ${MAP} $(imglob ${MAP}/*_inMNI.nii.gz) ### Masking dMAP in MNI using mean GM mask fslmaths stats /all_ ${MAP} -mas stats /mean_GM_mask stats /all_ ${MAP} done } |
関数が定義できたら、実行する。
1 | gbss_2_DWIwpreproc |
処理が完了すると、拡散定量値の種類に応じてstatsフォルダに「all_
以下は、標準空間上における灰白質領域のFA画像である。
2.5. gbss_3_skelpreproc
:拡散定量値をスケルトンに投影
拡散定量値をスケルトンに投影するまでの手順は、次の通り。
- 平均灰白質画像からスケルトンを生成
- 灰白質スケルトンをしきい値処理をしてスケルトンマスクを生成
- スケルトンの距離マップ(distance map)を生成
- 各拡散定量値マップを、スケルトンに投影
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 | function gbss_3_skelpreproc() { echo "Projecting MAP into skeleton..." # Skeletonize dMAP ## Create GM skeleton tbss_skeleton -i stats /mean_GM -o stats /mean_GM_skeleton ## threshold GM skeleton fslmaths stats /mean_GM_skeleton -thr ${SKELETON_THR} -bin stats /mean_GM_skeleton_mask ## Create skeleton distancemap fslmaths stats /mean_GM_mask -mul -1 -add 1 -add stats /mean_GM_skeleton_mask stats /mean_GM_skeleton_mask_dst distancemap -i stats /mean_GM_skeleton_mask_dst -o stats /mean_GM_skeleton_mask_dst for MAP in ${MAP_LIST}; do ## Project masked dMAP in MNI into skeleton tbss_skeleton -i stats /mean_GM \ -p ${SKELETON_THR} \ stats /mean_GM_skeleton_mask_dst \ ${FSLDIR} /data/standard/LowerCingulum_1mm \ stats /all_ ${MAP} \ stats /all_ ${MAP}_skeletonised done } |
処理が完了すると、statsフォルダに灰白質のスケルトンmean_GM_skeleton.nii.gz
、灰白質のスケルトンの距離マップmean_GM_skeleton_mask_dst.nii.gz
、拡散定量値が投影されたスケルトンall_<MAP>_skeletonised.nii.gz
が保存される。
2.6. randomise
:スケルトンに投影された定量値画像を入力したGLMと並べ替え検定(permutation test)
まず、GLMのデザインマトリックス(計画行列)とコントラストを設定する。
今回は、健常者10名(ID: Con0001~Con0010)と患者10名(ID: Pat0001~Pat0010)のデータがある。これらのファイルを昇順に並び替えると、先に健常者10名の画像、次に患者10名の画像の順に並ぶ。
Con0001.nii.gz
Con0002.nii.gz
Con0003.nii.gz
...
Pat0010.nii.gz
次に、GLMのデザインマトリックス(計画行列)とコントラストを決める設定ファイルを生成する。design_ttest2 <出力ファイル> <健常者数> <患者数>
でコマンドを実行。
1 | design_ttest2 stats /design 10 10 |
statsフォルダに、デザインマトリックス(design.mat)とコントラスト(design.con)が生成される。
デザインマトリックス(design.mat)の中身を確認。
/Matrixの一列目は健常者データであるかどうか、二列目は患者データであるかを0, 1で表している。行の順番は、被験者ファイルの順番(昇順)に対応する。したがって、これらは対応があるようにしておかなければならない。
1 | 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一列目は健常者の偏回帰係数、二列目は患者の偏回帰係数に対するもので、行は別々のコントラストである。この場合、一行目は健常者>患者の検定、二行目は健常者<患者の検定に相当する。
1 | 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:統計値マップ
1 2 3 4 5 6 7 8 | for MAP in ${MAP_LIST}; do randomise -i stats /all_ ${MAP}_skeletonised \ -o stats /gbss_ ${MAP} \ -m stats /mean_GM_mask \ -d stats /design .mat \ -t stats /design .con \ -n 10000 --T2 -V -x --uncorrp -R done |
次のようなファイルが、生成される。
TFCEを用いた”健常群>患者群”の検定で、FWE補正をされたP値マップ(gbss_FA_tfce_corrp_tstat1.nii.gz)を確認する。ここで、得られたP値マップは1-P値のマップであることに注意する。つまり、P<.05を有意とするのであれば、P値マップで0.95-1.00の値を見ればよい。
1 2 3 | fsleyes ${FSLDIR} /data/standard/MNI152_T1_2mm_brain \ stats /mean_GM_skeleton -cm Green \ stats /gbss_FA_tfce_p_tstat1 -cm Red-Yellow -dr 0.95 1 |
スケルトンは細いため有意差が見づらい場合がある。そのような時、tbss_fill
コマンドが役に立つ。
tbss_fill
コマンドの基本的な使い方は、以下の通り。
1 | tbss_fill <P値マップ> <しきい値> <平均FA画像> <出力画像> |
TFCEを用いた”健常群>患者群”の検定で、FWE補正をされたP値マップ(gbss_FA_tfce_corrp_tstat1.nii.gz)の有意差があった領域のみを0.95でしきい値処理をして抽出し、その領域を膨張させる。
1 | tbss_fill stats /gbss_FA_tfce_p_tstat1 0.95 stats /mean_GM stats /gbss_FA_tfce_p_tstat1_fill |
赤く表示されている領域は、健常群が患者群よりも有意(FWE-corrected)にFA値が大きいことを示している。
3. おまけ
大量に定量値があり、それらをすべて検定する場合、有意差があったかどうかをすべて確認するのは大変である。そこで、各定量値画像のP値マップが0.95以上の値を持つかどうかを判定し、有意差があった場合のみ、tbss_fill
コマンドを実行する。
01 02 03 04 05 06 07 08 09 10 11 12 | 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_GM 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値でソートしたもの(下段)に分けて保存している。
1 | cat stats /corrected_P_report .txt |
gbss_FA_tfce_corrp_tstat1.nii.gz 0.992000
gbss_FA_tfce_corrp_tstat2.nii.gz 0.416000
gbss_FW_tfce_corrp_tstat1.nii.gz 0.361839
gbss_FW_tfce_corrp_tstat2.nii.gz 0.997261
gbss_MD_tfce_corrp_tstat1.nii.gz 0.389816
gbss_MD_tfce_corrp_tstat2.nii.gz 0.985748
gbss_FW_tfce_corrp_tstat2.nii.gz 0.997261
gbss_FA_tfce_corrp_tstat1.nii.gz 0.992000
gbss_MD_tfce_corrp_tstat2.nii.gz 0.985748
gbss_FA_tfce_corrp_tstat2.nii.gz 0.416000
gbss_MD_tfce_corrp_tstat1.nii.gz 0.389816
tbss_FW_tfce_corrp_tstat1.nii.gz 0.361839
この方法論で解析を行い論文化する場合、citation にはどのように記載させて頂くのがよろしいでしょうか?
先行研究で、この方法論で前処理、解析が行われたものはありますでしょうか?
https://pubmed.ncbi.nlm.nih.gov/29226284/
https://pubmed.ncbi.nlm.nih.gov/31128227/
あたりをご参考にされてはいかがでしょうか?