1. 目的
2. リポジトリ
3. 必要なデータ
4. 注意点
5. 実行
5.1. run_FLICA.m
6. 結果
6.1. index.html
6.2. コンポーネントごとの結果(All_in_one_page)
6.3. モダリティごとの結果(FA, MD, AD, RD, etc.)
7. GBSSへの適応
7.1. index.html
7.2. コンポーネントごとの結果(All_in_one_page)
7.3. モダリティごとの結果(FA, MD, AD, RD, etc.)
1. 目的
- FLICAを用いた画像のマルチモーダル独立成分分析(ICA)
2. リポジトリ
FLICAに必要なスクリプトを次のコマンドで取得。今のところプライベートリポジトリにしています。ご興味のある方はコメントしてください。
1 | git clone https: //github .com /Hexans/FLICA_corrected .git |
3. 必要なデータ
必要なデータは、モダリティごとに全ての被験者の画像がまとめられた4D画像である。例えば、次のようなファイルを用いる。
- VBM: GM_mod_merg_s?.nii.gz
- TBSS: all_??_skeletonised.nii.gz
- FreeSurfer: ?h.thick.fsaverage.mgh and ?h.pial.area.fsaverage.mgh
- etc.
さらに、共変量(年齢・疾患グループ・性別)との相関もみることができる。共変量ごとに1列に数値をまとめテキストファイル(.txt)として保存する。
- 年齢: age.txt
- 疾患グループ: group.txt
- 性別: sex.txt
4. 注意点
NANボクセルがある場合、FLICA処理でエラーが発生する。
例えば、次のようなファイルがあったとする。
1 2 3 4 5 6 7 | . ├── all_median_FA_skeletonised.nii.gz ├── all_median_ICVF_skeletonised.nii.gz ├── all_median_ISO_skeletonised.nii.gz ├── all_median_MD_skeletonised.nii.gz ├── all_median_MVF_skeletonised.nii.gz └── all_median_OD_skeletonised.nii.gz |
NANボクセルがあるかは、FSLのfslstats
で検出できる。-M
オプションは、non zeroボクセルにおける平均値を算出するオプションである。
Method:
1 | fslstats <INPUT> -M |
次のコマンドを実行することで、すべての画像に対して、NANボクセルがありなしをチェックする。
In:
1 2 3 | for image in *nii.gz; do echo "${image} : $(fslstats $image -M)" done |
以上のコマンドを実行した例が、以下である。この場合、「all_median_ICVF_skeletonised.nii.gz」と「all_median_MVF_skeletonised.nii.gz」にNANボクセルが含まれていることが分かる。
Out:
1 2 3 4 5 6 | all_median_FA_skeletonised.nii.gz : 0.157853 all_median_ICVF_skeletonised.nii.gz : -nan all_median_ISO_skeletonised.nii.gz : 0.246872 all_median_MD_skeletonised.nii.gz : 1.141417 all_median_MVF_skeletonised.nii.gz : -nan all_median_OD_skeletonised.nii.gz : 0.516476 |
NANボクセルをゼロに置換するには、FSLのfslmaths
コマンドを用いる。
Method:
1 | fslmaths <INPUT> -nan <OUTPUT> |
すべての画像に対して、NANボクセルがある場合、0に置換する処理をするには、以下のコマンドを実行する。以下の処理が完了すると、「corrected_nan」フォルダに、NANボクセルが含まれない画像が保存される。
1 2 3 4 | mkdir corrected_nan for image in *nii.gz; do fslmaths $image -nan corrected_nan/${image} done |
NANボクセル補正後のデータに、NANが含まれていないかチェックするには、以下のコマンドを実行する。
In:
1 2 3 | for image in $( ls corrected_nan); do echo "${image} : $(fslstats corrected_nan/$image -M)" done |
「all_median_ICVF_skeletonised.nii.gz」と「all_median_MVF_skeletonised.nii.gz」にあったNANボクセルが、解消されていることが分かる。
Out:
1 2 3 4 5 6 | all_median_FA_skeletonised.nii.gz : 0.157853 all_median_ICVF_skeletonised.nii.gz : 0.422611 all_median_ISO_skeletonised.nii.gz : 0.246872 all_median_MD_skeletonised.nii.gz : 1.141417 all_median_MVF_skeletonised.nii.gz : 0.086699 all_median_OD_skeletonised.nii.gz : 0.516476 |
5. 実行
FLICAを実行するには、MATLABから次のコマンドを実行。
ICAのComponent数を被験者数の4分の1以下(Components < subjects/4)に設定し、Overfittingを避ける。また、被験者ごとのノイズ推定を省く(opts.lambda_dims = ”;)ことでもOverfittingを避けることができる。
5.1. run_FLICA.m
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 34 | %% Set up: addpath([getenv( 'FSLDIR' ) '/etc/matlab/' ]) addpath( '~/Documents/software/flica' ) %% Load data Yfiles = { 'all_FA_skeletonised.nii.gz' , 'all_MD_skeletonised.nii.gz' , 'all_AD_skeletonised.nii.gz' , 'all_RD_skeletonised.nii.gz' }; % NOTE that these should be downsampled to around 20k voxels in the mask, % per modality... hoping to increase this memory/cpu-related limitation. [Y, fileinfo] = flica_load(Yfiles); fileinfo.shortNames = { 'FA' , 'MD' , 'AD' , 'RD' }; %% Run FLICA clear opts opts.num_components = 5; opts.maxits = 100; % opts.lambda_dims = ''; # Reduce subject-noise estimation to avoid overfitting Morig = flica(Y, opts); [M, weights] = flica_reorder(Morig); %% Save results outdir = [pwd '/result/' ]; mkdir(outdir) flica_save_everything(outdir, M, fileinfo); %% Produce correlation plots clear des des.Group = load( 'group.txt' ); des.Age = load( 'age.txt' ); des.Gender = load( 'gender.txt' ); flica_posthoc_correlations(outdir, des); |
実行が成功すると次のように画像を読み込み、計算が始まる。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 | Loading "all_FA_skeletonised.nii.gz" ... Converting back to single... Generating mask... Flattening data matrix... Freeing memory... Loading "all_MD_skeletonised.nii.gz" ... Converting back to single... Generating mask... Flattening data matrix... Freeing memory... Loading "all_AD_skeletonised.nii.gz" ... Converting back to single... Generating mask... Flattening data matrix... Freeing memory... Loading "all_RD_skeletonised.nii.gz" ... Converting back to single... Generating mask... Flattening data matrix... Freeing memory... Setup... doing PCA... more setup... done (0.72 sec) Iteration 1... eta H W X.... lambda.... done updates (0.2 sec) F (0.061 sec)No previous lastF Iteration 2... eta H W X.... lambda.... done updates (0.17 sec) F (0.029 sec), dF = 6.38536e+07 Iteration 3... eta H W X.... lambda.... done updates (0.16 sec) F (0.027 sec), dF = 21559.9 Iteration 4... eta H W X.... lambda.... done updates (0.13 sec) F (0.019 sec), dF = 253.743 ... Iteration 100... eta H W X.... lambda.... done updates (0.13 sec) F (0.019 sec), dF = 253.743 |
計算が終わったら、bashでƒƒflica_report.sh
を実行することで、HTML形式で結果をまとめることができる。まとめられた結果(HTML)を見るには「index.html」を開く。
1 | flica_report.sh result # 引数としてresultフォルダを指定 |
6. 結果
6.1. index.html
index.htmlの開くと次のようにFLICAの、まとめの結果を見ることができる。
6.2. コンポーネントごとの結果(All_in_one_page)
ICAの各Componentごとの結果は、index.htmlの「All_in_one_page」から確認することができる。
6.3. モダリティごとの結果(FA, MD, AD, RD, etc.)
モダリティごとの結果は、index.htmlの「モダリティ名」をクリックすることで確認できる。以下の図は、FAの結果である。
7. GBSSへの適応
GBSSの結果に対してもFLICAが使えるか、不明であったためできるか試してみた。
特に問題なく、使えそうな感じ。
7.1. index.html
7.2. コンポーネントごとの結果(All_in_one_page)
7.3. モダリティごとの結果(FA, MD, AD, RD, etc.)