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に必要なスクリプトを次のコマンドで取得。今のところプライベートリポジトリにしています。ご興味のある方はコメントしてください。
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処理でエラーが発生する。
例えば、次のようなファイルがあったとする。
. ├── 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:
fslstats <INPUT> -M
次のコマンドを実行することで、すべての画像に対して、NANボクセルがありなしをチェックする。
In:
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:
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:
fslmaths <INPUT> -nan <OUTPUT>
すべての画像に対して、NANボクセルがある場合、0に置換する処理をするには、以下のコマンドを実行する。以下の処理が完了すると、「corrected_nan」フォルダに、NANボクセルが含まれない画像が保存される。
mkdir corrected_nan for image in *nii.gz; do fslmaths $image -nan corrected_nan/${image} done
NANボクセル補正後のデータに、NANが含まれていないかチェックするには、以下のコマンドを実行する。
In:
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:
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
%% 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);
実行が成功すると次のように画像を読み込み、計算が始まる。
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」を開く。
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.)