Matlabからanova君を呼ぶ”Ranovakun”

Matlab/Statistics Toolboxのanovan()関数がrepeated measuresに対応していないので、matlabからRのanova君を呼んじゃえという事でぱぱっと書いたものです。 単にデータを一時ファイルに書き出してanova君を呼んで出力をuicontrol()に渡しているだけなのですが、uicontrol()が改行やタブをうまく処理してくれないので小細工をしています。 Matlabでのテキスト操作がよくわからなかったのでひょっとしたらとんでもなく無駄な処理をしているかも知れませんが、一応動きます。

matlabからrepAnova()を呼ぶ関数をRrepAnovaを作成していますので、今後更新しないと思われます。

  • WindowsのMatlab2009bとR2.10.1で動作確認しています。 rscript.exeにパスが通っていて、Rの起動時にanovakun()を読み込むように設定されている必要があります
  • Windows上で32bit版と64bit版の両方がインストールされている場合、binディレクトリのrscript.exeを呼び出すとエラーになります。 bin\i386ディレクトリのrscript.exeを呼び出すようにパスを設定する と正常に動作することを確認しています。
  • Linuxでは動作確認していませんが、rscript.exeを使ってRを呼び出している行をLinux用に書きかえて\をescapeする処理を省けば多分動くと思います。

Ranovakun.m (最終更新日:2010/4/7)

更新履歴

  • 2010/4/7

    • 出力ウィンドウのリサイズとテキストのコピーに対応。
  • 2010/3/12

    • Matlab上で help Ranovakun とすると簡単な使い方が表示されるように変更。
  • 2010/2/19

    • 公開。

使い方

>> Ranovakun(data, design, numlist, ...)
data データを並べた行列を指定します。並べ方はanova君と同じです。
design anova君と同じ形式で実験デザインを指定します。例えば被験間要因が二つ、被験者内要因が一つなら’ABsC’です。
numlist 各要因の水準数を 文字列で 指定します。例えば3要因で水準数がそれぞれ3、2、4なら‘3,2,4’です。
追加のオプションを指定します。多くのMatlab関数と同様にオプション名と値の対で指定します。

output … ‘window’または’text’で出力形式を指定します。’window’ならばダイアログを開いて結果を表示します。’text’ならばMatlabのコマンドウィンドウに結果を表示します。省略した場合は’window’になります。

title … outputがwindowの場合、ダイアログのタイトル文字列を指定します。省略した場合は’RAnovakun’となります。

options … anova君に渡したいオプションを列挙した 文字列 を指定します。省略した場合は何もオプションを渡しません。
戻り値 optionsに’text’が指定されていれば、anova君の出力をそのままテキストとして返します。’window’であれば[]を返します。
その他 「コールバック関数を書くのが面倒くさい」という理由で対応していなかった出力ウィンドウのリサイズと出力のコピーですが、ふとRanovakun()をコールバック関数に指定するという セコい 方法を思いついて対応しました。 これで不便に思っていた点は大体つぶしたので、何か不具合が見つからない限り更新の予定はありません。

以下の例はsABデザインで被験者12名、Aが2水準、Bが7水準の場合です。与えるデータの行数は12、列数は2×7=14です。タイトルに’Frequency’、anova君への追加オプションとしてprep=Tとholm=Tを与えています。画面に収めるためRanovakunの呼び出しを複数行に書いていますがもちろん一行に書いて大丈夫です。

>> data

data =

  Columns 1 through 6

    0.1250    0.8083    0.7000    0.8617    0.7692    0.6286
    0.2333    0.2333    0.5254    0.7232    0.5100    0.8780
    0.0750    0.5333    0.7917    0.9000    0.8947    0.8000
    0.1008    0.4286    0.6864    0.6827    0.7586    0.8060
(以下省略)

>> size(data)

ans =

    12    14

>> Ranovakun(data,'sAB','2,7','title','Frequency',...
   'options', 'prep=T, holm=T')

ans =

     []

>>

正常に動作していれば以下のようなダイアログが表示されます。

../_images/ranovakunOutput.png

Matlab/OctaveからrepAnovaを呼ぶ”RrepAnova”

Matlab/OctaveからRのrepAnovaを呼び出す関数です。repAnovaの詳しい使い方は repAnova を見てください。

  • Windows上で32bit版と64bit版の両方がインストールされている場合、binディレクトリのrscript.exeを呼び出すとエラーになります。 bin\i386ディレクトリのrscript.exeを呼び出すようにパスを設定する と正常に動作することを確認しています。

RrepAnova.m (最終更新日:2010/3/23)

更新履歴

  • 2010/3/23

    • Ubuntu 9.10 + R 2.9.2 + Octave 3.2.2の組み合わせで動くように修正。確認してませんがLinux上のMatlabやWindows上のOctaveでも動くのではないかと思います。
  • 2010/3/12

    • 公開。

使い方

>> RrepAnova(sbj, betvar, withvar, data, labels, ...)
sbj 被験者を示すラベルが収められたn行×1列のセル配列を指定します。nは全データ数です。
betvar 被験者間要因の水準を示すラベルが収められたn行×b列のセル配列を指定します。nは全データ数、bは被験者間要因の個数です。被験者間要因がない場合は[]を指定します。
withvar % 被験者内要因の水準を示すラベルが収められたn行×w列のセル配列を指定します。nは全データ数、wは被験者内要因の個数です。被験者内要因がない場合は[]を指定します。
data 従属変数の値を格納したn行×1列の配列を指定します。nは全データ数です。
labels 被験者、被験者間要因、被験者間要因、従属変数のデータ列につけるラベルを格納した1行L列のセル配列を指定します。Lはb+w+2です。
repAnova()に渡すオプションを’オプション名’,’値’の対で列挙します。repAnova()を実行する時に ” ” が必要な値は’” “‘と書きます。例えばtitleに”error rateの比較”と指定したいならばRrepAnova( <中略> , ‘title’, ‘“error rateの比較”’)です。
戻り値 Rscriptを呼び出したときの戻り値がそのまま返されます。
その他 作者が言うのもどうかと思われますが、ラベルの作成が結構面倒くさいです。 pythonならラベルとデータが混在するテキストファイルからごっそり読み込むのも簡単なのですが、Matlabはその辺が弱いので…。 気力があればテキストファイルからrepAnovaに必要な形式でデータを読み出す関数を作るかもしれません。

以下の例は、Target(presentまたはabsdent)とISI(200ms、400ms、600ms、800ms)の2つの被験者内要因がある場合の例です。 被験者は25名、dataPresent、dataAbsentという配列にそれぞれpresentとabsentのデータが25行4列で格納されているとします。 行は被験者、列はISIに対応しています。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
data = [reshape(dataPresent,numSubject*4,1); reshape(dataAbsent,numSubject*4,1)];
lsbj = cell(200,1);
lwith = cell(200,2);
lwith(1:100,1) = repmat({'present'},numSubject*4,1);
lwith(101:200,1) = repmat({'absent'},numSubject*4,1);
for r=0:1
    for i=1:4
        for j=1:numSubject
            lsbj{r*(numSubject*4)+numSubject*(i-1)+j,1} = j;
            lwith{r*(numSubject*4)+numSubject*(i-1)+j,2} = [num2str(200*i) 'ms'];
        end
    end
end
labels = {'s','Target','ISI','data'};
RrepAnova(lsbj,[],lwith,data,labels,'prep','T','holm','T');
  • 1行目
    • reshapeを使ってデータを1列に並べています。numSubjectには被験者数(25)が入っています。
  • 2から3行目
    • 被験者名と被験者内要因の水準名を保存するlsbjとlwithを作成しています。25人×2水準×4水準=200行必要です。
  • 4から5行目
    • lwithの1列目にpresentとabsentのラベルを書きこんでいます。最初の100行はpresent、残り100行はabsentのデータです。
  • 6から13行目
    • lwithの2列目とlsbjにラベルを書き込んでいます。1行目のreshapeにより被験者1、被験者2、…被験者25の順に8回繰り返す形でデータが格納されているので、それに対応するようにlsbjにラベルを付けています。この例では被験者名に数値を使っていますが、文字列でも構いません。 同じく1行目のreshapeによりISIは200msが25行、続いて400msが25行、…800msが25行の計100行が並んでいて、その100行セットがpresent、absentの順に連なっています。これに対応するようにラベルを作成しています。
  • 14行目
    • 出力に利用するための列ラベルを指定しています。被験者名、被験者間要因、被験者内要因、データの順に書きます。 この例では被験者間要因が存在しないので、被験者名の次がいきなり被験者内要因になっています。
  • 15行目
    • RrepAnovaを呼び出します。被験者間要因はないので2番目の引数は[]です。また、anova君への追加オプションとしてprep=Tとholm=Tを与えています。

サクラエディタ用Matlabキーワードファイル

サクラエディタでぱぱっと作業することが多いのでテキトーに作りました。単にiskeyword()の戻り値を列挙しただけです。

Matlab.kwd

Matlabでエラーバー付きバープロットを描画する”barErrorbar”

タイトルの通りの関数です。「雑多なメモ」に書いた事をやっているだけの超いいかげん関数です。 help barErrorbarとすれば簡単な解説が表示されます。詳しい解説はいずれ。

barErrorbar.m (最終更新日:2010/6/10)