FSLのGLMで対応のあるt検定のdesign matrixを作成・修正する方法

私がもっているデータのひとつに縦断DTIデータがあり、東京都健康長寿医療センターの下地先生が包括脳/ABiSチュートリアルで教えてくださっているTBSSを用いて解析を行っています。(下地先生は非常にわかりやすい講義をしてくださることで人気の先生です。)

GLMでDesign matrixを作成する時にひとつ困ったことに遭遇しました。

FSLのGLM Wizardでは、対応のあるt検定のDesign matrixを簡単に作成することができます。

基本はこんな感じです。

4症例の前後の画像があるとします。画像は8つあるわけです。
(チュートリアルの受講者の方々であれば、下地先生のテキストと比較できるように、チュートリアルと同じように作成してみます)

ターミナルから

$ Glm (Macの場合は Glm_gui)

とタイプすると、以下の画像が出てきます。

ここで、

“Timeseries design”“Higher-level / non-timeseries design”に変更します。

そして、画像の数が8なので、

#inputs を 8 に変更し、Enterキーを押します。

そうすると、以下のようになります。

ここで、Wizard をクリックします。

そうすると、下のような画面が出ますので、“two groups, paired”を選択して“Process”をクリックします。

そうすると、下記のようなウィンドウが出ます。

そして、視覚的に理解しやすいように、以下のウィンドウも生成されます。

このデザインマトリクスは、ファイル名を ID_撮像回数_FA.nii.gz

とすると、

ファイル名の順番が

ID1_1_FA.nii.gz
ID2_1_FA.nii.gz
ID3_1_FA.nii.gz
ID4_1_FA.nii.gz
ID1_2_FA.nii.gz
ID2_2_FA.nii.gz
ID3_2_FA.nii.gz
ID4_2_FA.nii.gz

であると想定していることになります。

しかし、ファイル名だけでみると、

ID1_1_FA.nii.gz
ID1_2_FA.nii.gz
ID2_1_FA.nii.gz
ID2_2_FA.nii.gz
ID3_1_FA.nii.gz
ID3_2_FA.nii.gz
ID4_1_FA.nii.gz
ID4_2_FA.nii.gz

という形で並んでいたほうがありがたいです。

視覚表示では、以下のようになってもらいたいわけです。

いろいろ考えたうえで、下地先生にアドバイスを求めたところ、以下のアドバイスをいただきました。非常に有用であり、下地先生から「ブログで発信してかまいません」と承諾もいただきましたので、共有させていただきます。最初に下地先生に感謝申し上げます。

    1. 初級者編: ファイル名を変えてしまう

これは、発想の転換で、GLMで作成されるdesign matrixをそのまま使えるように、TBSSに入力するファイル名を変えてしまうというものです。そのうえで、TBSSをやり直します。

たとえば、初回をBL、フォローアップをFUとして、それをファイル名の前につけます。
そうすると、

BL_ID1_1_FA.nii.gz
BL_ID2_1_FA.nii.gz
BL_ID3_1_FA.nii.gz
BL_ID4_1_FA.nii.gz
FU_ID1_2_FA.nii.gz
FU_ID2_2_FA.nii.gz
FU_ID3_2_FA.nii.gz
FU_ID4_2_FA.nii.gz

となりますので、Glmのウィザードが作るDesign matrixと同じ並びになります。このファイルを使ってTBSSをやり直します。

    1. 中級者編: all_FA_skeletonisedの並び順を入れ替える

TBSSで作成されるall_FA_skeletonised.nii.gzは4次元画像になっていて、FA画像が最初の順番でおさめられています。これを一度3次元の複数の画像にばらして、並べ替えます。

そのために使うコマンドは、fslsplitfslmergeです。

まず、fslsplitを用いて、FA_skeletonised.nii.gzをばらします。

$ fslsplit FA_skeletonised.nii.gz

そうすると、vol0000.nii.gz, vol0001.nii.gz, vol0002.nii.gz, … vol0007.nii.gz

といったファイルができます。

これをもういちどくっつけます。

今は ファイル名の関係は以下のようになっています。

ID1_1_FA.nii.gz → vol0000
ID1_2_FA.nii.gz → vol0001
ID2_1_FA.nii.gz → vol0002
ID2_2_FA.nii.gz → vol0003
ID3_1_FA.nii.gz → vol0004
ID3_2_FA.nii.gz → vol0005
ID4_1_FA.nii.gz → vol0006
ID4_2_FA.nii.gz → vol0007

これを

vol0000
vol0002
vol0004
vol0006
vol0001
vol0003
vol0005
vol0007

と入れ替えればいいわけです。
従って次のようにします。

$ fslmerge -a all_FA_skeletonised vol0000 vol0002 vol0004 vol0006 vol0001 vol0003 vol0005 vol0007

fslmergeは最初に出力画像を指定して、その後入力画像を順番に指定するので間違えないようにしてください。

でも、同じことを何度も書くのはつらいですね。

そのときに、次の書き方があります。vol000{0,2}は、vol0000 vol0002 と同じ意味となります。

$ fslmerge -a all_FA_skeletonised vol000{0,2,4,6,1,3,5,7}
    1. 中級編: GLM SetupのPasteボタンを使ってDesign matrixを書き換える

※この機能をMacで使うためには、少し設定が必要です。X11の環境設定で「3ボタンマウスをエミュレート」をチェックする必要があります。そうすることで、「option + マウス左クリック」でペーストすることができるようになるとのことです。(kojimaさん、ご指摘ありがとうございました!)

GLM Setupのウィンドウに、Pasteというボタンがあります。そこをクリックします。

そうすると、次のような画面が出ます。

ここは自由に編集できます。
したがって、LibreOffice Calcのような表計算ソフトで行列を作ってここにコピペしてもよし、手作業で編集するもよし、いかようにでもできます。

    1. 上級編: Matlab/Octaveでdesign matrixを作成し、Text2Vestを用いてDesign matrixを作成する

今、ほしいdesign matrixは以下のようになります。

 

1 1 0 0 0
-1 1 0 0 0
1 0 1 0 0
-1 0 1 0 0
1 0 0 1 0
-1 0 0 1 0
1 0 0 0 1
-1 0 0 0 1

 

これをMatlabやOctaveで作れるのではないかと思いました。

この行列の特徴は、

      • 最初の列は1と-1をn回(今の場合は、n=4)繰り返し

これは、以下であらわせます。

n=4                 %subject数
A=[];               %行列Aを初期化
for i=1:n
    A=[A; 1; -1];   %Aの次の行に1と-1を追加
end
      • 残りの列は、2行をひとつのかたまりで考えると、k番目のかたまりは

[k-1個の0 1 n-k個の0]

であらわすことができます。たとえば、3番目のかたまりは

[3-1個の0 1 4-3個の0] ですから
[0 0 1 0]

となるわけです。

従って、これをMatlab風に書くと

[zeros(2,k-1) ones(2,1) zeros(2,n-k)]

とあらわすことができます。

これも同様にforループで考えてみると

n=4                 %subject数
B=[];               %行列Bを初期化
for k=1:n
    B=[B; [zeros(2,k-1) ones(2,1) zeros(2,n-k)]];
end

となります。

これを結合したらdesign matrixができます。

C=[A B];

その後、これをテキストファイルとして書き出します。dlmwriteというコマンドで書き出すことができます。dlmwriteの使い方は、dlmwrite(‘ファイル名’,変数,’区切り文字’)となります。今、ファイル名はdesign.txt, 区切り文字は半角スペースとしたいので、以下のようになります。

dlmwrite('design.txt',C,' ')

以上をまとめると、以下のようになります。

n=4                 %subject数
A=[];               %行列Aを初期化
for i=1:n
    A=[A; 1; -1];   %Aの次の行に1と-1を追加
end

B=[];               %行列Bを初期化
for k=1:n
    B=[B; [zeros(2,k-1) ones(2,1) zeros(2,n-k)]];
end

C=[A B];

dlmwrite('design.txt',C,' ')

最後に、Text2Vestを使います。

詳しい説明は以下のリンクにあります。
http://fsl.fmrib.ox.ac.uk/fsl/fslwiki/GLM/CreatingDesignMatricesByHand

その冒頭に以下のような記載がありました。

When the number of subjects in your study starts to grow, the FSL GLM GUI interface becomes quite slow and cumbersome to use. In these situations, you will find it much easier to create your design matrix, contrast and F-test files manually.

GLM GUIはsubject数が増えると動作がもっさりしてくるために自分でdesign matrixを作った方がいいとのことです。

作ったファイルは以下でdesign.matになります。

$ Text2Vest design.txt design.mat

これでできたdesign.matは以下のようになっていました。

/NumWaves 5
/NumPoints 8
/Matrix
1 1 0 0 0
-1 1 0 0 0
1 0 1 0 0
-1 0 1 0 0
1 0 0 1 0
-1 0 0 1 0
1 0 0 0 1
-1 0 0 0 1

きちんとしたものになっていますね。これでnが増えてもnの値を変えるだけで、簡単にdesign matrixを作成することができます。

下地先生、本当にありがとうございました!

2 thoughts on “FSLのGLMで対応のあるt検定のdesign matrixを作成・修正する方法

  1. いつも大変参考にさせていただています。
    X11の環境設定で「3ボタンマウスをエミュレート」をチェックすれば、MacでもFSLのPaste Window上で「option + マウス左クリック」でペースト可能です。参考になれば幸いです。

    • ご指摘ありがとうございます。
      そんな方法があるとは知りませんでした。
      早速ブログに反映させていただきました。

      大変助かります。今後ともよろしくお願いします。

コメントを残す