ANOVA君/FAQ - 井関龍太のページ

ホーム   編集 凍結 差分 バックアップ 添付 コピー 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS

ANOVA君/FAQ

Last-modified: 2018年11月08日 (木) 21:14:06 (34d)
Top > ANOVA君 > FAQ

ANOVA君に関するFAQのページです。
実際には,想定問答集です。

動作関係
使っていくなかで
豆知識
カスタマイズ

動作関係

ANOVA君が動かない

ANOVA君がまったく動作しない原因として考えられるのは,指定した要因計画の型,各要因の水準数,データフレームの形式の間に何らかの不一致がある場合です。
よくある場合としては,以下のことが考えられます。

  • 要因計画の型に「" "」をつけていない
  • 読み込んだデータフレームに被験者間要因を表すラベルが含まれていない
  • オプション指定する際に「T」をつけていない(例えば,「auto」とするのでなく,「auto = T」または「auto = TRUE」とする必要があります)

MacやLinuxで読み込みに失敗する

MacやLinuxは,Windowsとはファイルのエンコード形式が違っています。
そのため,Windowsのエンコード形式で書かれたファイルを適切に読み込めないことがあります。
ANOVA君のファイルはWindowsのエンコード形式で書かれていますが,Rで読み込む際にこの形式を明示的に指定すればMacやLinuxでも問題なく使用できます。
具体的には,ソース関数で読み込む際に,以下のようにencodingの値を“CP932”と指定してください。

> source("/user/hogehoge~/anovakun.txt", encoding = "CP932")

あるいは,ANOVA君のファイルそのものをMacやLinuxに適したエンコード形式に変換してから読み込むことでも問題を解決できます(文字コードをUTF-8,改行コードをLFにするなど)。

Rstudioで読み込めない

RstudioでANOVA君を使う場合,ツールバーの“Code”から“Source file...”を選んでANOVA君のファイルを読み込もうとしてもうまくいかないことがあります。
このオプションでは,source.with.encoding()というRstudio独自の機能が使われていますが,現行のバージョンでは一部の文字コードの自動判定に問題があるようです。
encodingの部分を「encoding = "CP932"」と指定すればうまく読み込めると思います。
あるいは,source.with.encoding()ではなく,Rにデフォルトで入っているsource()を使って読み込んでください。

エンコーディングを指定しても読み込めない

OS等の環境によりRのロケールが日本語以外に設定されていると,日本語を含むソースコードをまったく受け付けないことがあります(“CP932”を指定しても同様です)。
このような場合は,Rのロケールを日本語に設定してからANOVA君のファイルを読み込んでください。

あるいは,以下のコマンドを実行してから読み込みを行うとうまくいくかもしれません(他言語OSの環境がないため未確認)。

> Sys.setlocale(locale = "Japanese")

または,以下のコマンドを試してみてください。

> Sys.setlocale('LC_ALL','C')

どうしてもうまくいかないときは,ANOVA君のファイルに含まれるマルチバイト文字(日本語文字列)をすべて削除すれば何とかなるはずです(日本語文字列はコメントにのみ使用しているので,動作上は問題ないと思われます)。

Macで出力がうまく表示されない

Mac版のRでANOVA君を実行すると,出力が表の途中で改行されるなどして見づらいことがあります。
これは,Mac版のGUI(AQUA)のルーラー設定が狭いことによるものです。
手動でひとつずつルーラーを設定し直すと改行されないように表示できますが,毎回これをやるのは少々面倒です。
他の手段としては,(1)techオプションを指定して表形式にしないで出力する方法があります。
また,AQUAを使わずに,(2)RstudioをインストールしてRstudioから使うという方法もあります。
anovakun 4.4.0ではこの問題は軽減したものと思われます。

使っていくなかで

出力結果を保存したい

ANOVA君の出力結果を外部ファイルに保存したい場合は,Rのsink関数を使う方法があります。
sink関数の使い方は,以下の通りです。

1. ()内にファイル名を入れて,以下のようなコードをRのコンソールに入力し,エンターキーを押します。「任意の名前」の部分には好きな名前を付けることができます。「.txt」はテキストファイル形式での出力を指定するコードです。

> sink("任意の名前.txt")

2. 通常通り,ANOVA君を実行します。sink関数を用いた場合,デフォルトではコンソールには結果は出力されません(代わりに,ファイルに書き込みがされています)。計算が終わったら次のステップに進みます。計算が終わったかどうかは,マウスカーソルをRのコンソールに持っていけば確認できます。マウスカーソルが読み込み中を表す砂時計(または,リング)になったらまだ計算中です。

> anovakun(dat, "AsBC", 2, 3, 2)

3. sink関数を完了するために,以下のコードを入力して,エンターキーを押します。これでsink関数を停止したことになり,この後は,通常通り,Rのコンソールに計算結果が表示されるようになります。

> sink()

sink関数で生成したファイルは,Rが使用している作業ディレクトリの中に作られています。
このディレクトリがどこにあるかは,getwd関数を使えばわかります。
コンソールに以下のコードを入力してエンターキーを押すと作業ディレクトリの場所が表示されます。

> getwd()

また,sink関数を実行する際に,

> sink("clipboard")

と指定すると出力結果がクリップボードにコピーされます(ただし,Windows以外のOSでは指定方法が若干異なります;他のOSの場合は後述のcopy機能を利用してください)。
出力後にペースト(ctrl+v)することで,結果をエディタなどに貼り付けて使うことができます。
version 4.3.0からは“copy”機能として,クリップボードへの出力指定をANOVA君の中に組み込みました。

また,ファイルに出力したい場合は,capture.output関数を使った方法が簡単かもしれません。
以下のように,capture.outputで囲む形でANOVA君を実行してください。

> capture.output(anovakun(dat, "sAB", 2, 3), file = "output.txt")

すると,作業ディレクトリの中にfile変数で指定した名前のファイルが出力されます。
"output.txt"の部分は任意の名前をつけることができます。
一般に,copyオプションよりもcapture.outputのほうが高速に動作すると思います。

出力時に要因や水準に名前をつけたい

ANOVA君を基本的な方法で実行した場合,要因名は大文字アルファベット,水準名は小文字アルファベットと数字を組み合わせたものになります。
ただし,入力方法を変えることによって,任意の要因名や水準名を出力することもできます(anovakun 4.4.0以降)。
くわしくは,より高度な入力方式のページを参考にしてください。

3つ以上の要因の間で交互作用が見られた場合は?

3つ以上の要因の間で交互作用が見られた場合(二次以上の交互作用),ANOVA君では,自動的には下位検定を行ないません。
このような場合は,関心のある要因の水準ごとにデータを分割して,再度分散分析を行ってください。

例えば,2×3×3の要因計画で3要因の交互作用が有意であった場合,A,B,Cの3つの要因についてデータを分割できる可能性があります。
A要因の各水準ごとのパターンの違いに関心があるとすれば,a1,a2水準ごとに3×3の分析を行ってください。
(B,C要因に関心がある場合は,それぞれ,2×3の分析を3回行うことになります。)

anovakun 4.5.0以降では,単純効果の検定をサポートするための関数,anovatanを追加しました。
anovatanの使い方は基本的にはanovakunと同じですが,anovatanでは分割する要因を指定する必要があります。

例えば,2×3×3のAsBCデザインでA要因について分割する場合は以下のように指定します。

> anovatan(dat, "AsBC", 2, 3, 3, tfact = "A")

同様に,B要因を指定したい場合はtfactとして"B"を,C要因について分割したい場合は"C"を指定します。

2つ以上の要因の組み合わせについて分割したいときは,以下のようにcを使ってください。

> anovatan(dat, "ABsCD", 2, 2, 2, 3, tfact = c("A", "B"))

要因に名前をつけた場合には,その名前を使って要因を指定してください。

> anovatan(dat, "ABsC", WM = c("high", "low"), Trait = c("extraversion", "introversion"), Study = c("lecture", "text", "peer"), tfact = "WM")

毎回ANOVA君のファイルを読み込むのが面倒

分析をするたびに,毎回,メニューからソースを読み込むのは面倒かもしれません。
そこで,Rを起動した際に常にANOVA君のファイルを読み込んだ状態にするための手順を紹介します。

  1. メニューの「ファイル」から「Rコードのソースを読み込み」を選び,ANOVA君のファイルを読み込みます。
  2. コンソールに表示された,「source("C:~)」というコードをコピーします(マウスでコードをドラッグして右クリック→コピー)。このとき,「>」の部分はコピーしないように注意してください。
  3. 自分のコンピュータのRのフォルダにアクセスします(通常は,「マイコンピュータ」→「Cドライブ」または「ハードディスク」→「Program Files」→「R」)。
  4. Rフォルダの中の「Rprofile.site」というファイルを開きます(「R」フォルダの中の「etc」フォルダの中にあります)。ファイルを開くためのプログラムを選択するよう求められた場合は,テキストエディタ(「メモ帳」など)を選びます。
  5. 「Rprofile.site」の一番下の行に先ほどコピーしたコードをペーストします(右クリックして「貼り付け」)。
  6. 「Rprofile.site」を保存して,ファイルを閉じます。

これで,次回からは,Rを起動すると既にANOVA君を読み込んだ状態になっています。
読み込みに成功しているかどうかは,コンソールに「anovakun」と入力してエンターキーを押してみればわかります。
成功していれば,ANOVA君のコードの一部が表示されます(失敗している場合は,「エラー」と出力されます)。

Mac/Linuxの場合は,デフォルトのワーキングディレクトリ(Rが起動したときにデフォルトで読み込むフォルダ)の中に「.Rprofile」という名前のファイルを作り,同様にコードを書き込んでおけば同じように読み込みを自動化できます(Windowsでこちらの方法を使うことも可能です)。

なお,以上の方法でANOVA君の読み込みを自動化した場合,ANOVA君のファイルを別のフォルダに移動すると読み込みは無効になります。
フォルダを移動させた場合は,貼り付けたソースコードを削除して,もう一度最初から手順をやり直す必要があります。

ANOVA君をワークスペースに表示させたくない

ファイルから関数を読み込むと,通常,Rのデフォルトのワークスペースに読み込まれます。
Rstudioではいま読み込んでいる関数がEnvironmentのペインに表示されますが,ANOVA君のようにたくさんの関数を含むファイルを読み込むとペインが関数でいっぱいになってしまい,他の変数やデータを確認する妨げになることがあるかもしれません。
これを防ぐひとつの手段として,ANOVA君を隠し環境に読み込む方法を紹介します。

1.ANOVA君を読み込む環境を作成します。
ANOVA君のファイルを読み込む前に,以下のようにコンソールに入力してください。

> .anovakun.env <- new.env()

このコードは新しいEnvironmentを宣言するもので,“.anovakun.env”の部分は任意の名前をつけることができます。
ただし,先頭の文字を“.(ピリオド)”にしないと隠し環境にならないのでご注意ください。

2.いま作成した隠し環境にANOVA君のファイルを読み込みます。
これには,通常のsource関数を使うのではなく,以下のようにsys.source関数を使います。

> sys.source("C:~/anovakun.txt", envir = .anovakun.env)

"C:~/anovakun.txt"の部分は自分のPCでANOVA君のファイルを保存しているパスに書き換えてください。
また,envirの値は1.で宣言した隠し環境の名前に一致させる必要があります。

3.宣言した環境を使用できる状態にします。

> attach(.anovakun.env)

ここでも,かっこ内の値は1.で宣言した隠し環境の名前に一致させてください。

このようにすると,デフォルトのGlobal Environmentには何も表示されないままでANOVA君を利用できる状態になると思います。
Rstudioでは,Environmentのペインの“Global Environment”のタブをクリックすると隠し環境が作られているのが確認できます。

以上の手続きを毎回実行するのが面倒な場合は,毎回ANOVA君のファイルを読み込むのが面倒と同様の手順で,Rprofileにsource関数の代わりに上記の3行を記載しておけばR起動時に隠し環境への読み込みが行われるようになります。

豆知識

ANOVA君は何要因まで分析できる?

ANOVA君(version 4.0.0以降)は,仕様上は26要因まで分析可能です。
この制限は,要因を表すラベルとしてアルファベット26文字を用いていることによります。
具体的には,RのLETTERSとlettersという引数(関数?)を用いています。
この引数には27文字目以降は存在しないので,27以上の要因を分析しようとするとエラーになると思います。

ラベルの扱いを変更すれば27要因以上の分析も可能になることでしょう。
しかし,現実的には,27要因以上の分散分析を行う機会はほとんどないのではないかと考えています。
第一に,それだけ多数の要因がある計画では,交互作用がほとんど解釈不能の状態に陥るように思います。
それほど多数の要因を扱うような場合には,何らかの多変量解析の適用を考えた方がよいのではないでしょうか。
第二に,ANOVA君は確かに仕様上は26要因までの計画に対応していますが,実際には,そこまで莫大なデータは分析できないと思います。
具体的な計画の形にもよりますが,大体5~6要因あたりでメモリの限界に達し,それ以上の要因を含む計画では計算不能に陥ることが多くなると予想されます。

メモリの不足によりストップした場合は,多重比較の方法としてHolmの方法を指定し(負荷が軽くなります),よりメモリの多いマシンで計算してみてください。

adj.pとは?

ANOVA君(バージョン3.0.0以降)では,多重比較の結果の出力の際に「adj.p」という値が出てきます。
これは「調整済みp値(adjusted p-value)」を表しています。
多くの多重比較法は,ファミリーワイズの(多重比較全体での)タイプⅠエラー率を一定以下に抑えることを意図して作られています(別の考え方に基づく方法も近年では開発されています)。
Bonferroni系の方法では,比較の回数や型に応じて有意水準を調整することによって,エラー率の制御を実現しています(これとは別に,Tukey法など,特別な理論分布を用いる系統の方法もあります)。
調整済みp値は,この多重比較のための調整を反映した値です。
(ちなみに,Tukey法などについても,調整済みp値を計算することは可能です。くわしくは,Wright, 1992を参照してください。)

ただし,調整済みp値は,それ自体は確率ではなく,単に有意性の判定に使える便利な値であるということにご注意ください(Westfall et al., 1997, p. 299)。
したがって,調整済みp値は1になることがありますが,これは何かの確率を表しているというよりは,どういう有意水準の設定をしても,そのデータでは,その比較は有意にはならないということを意味していると思われます。

また,各比較についての調整済みp値が,例えば,0.009,0.028,0.154となったとしても,最初の比較はp<0.01,次の比較はp<0.03で有意であるといった解釈にはなりません。
多重比較の有意水準をα=0.01と設定するなら最初の帰無仮説のみが棄却され,α=0.03と設定するなら1番目と2番目の帰無仮説が棄却される,というのが妥当な解釈ではないかと思います。
つまり,個々の調整済みp値が個々の単一の比較についての情報を与えているわけではなく,常に多重比較全体についての情報を伝えていることを意識する必要があると思われます。


Westfall, P. H. (1997). Multiple testing of general contrasts using logical constraints and correlations. Journal of the American Statistical Association, 92, 299-306.
Wright, S. P. (1992). Adjusted p-values for simultaneous inference. Biometrics, 48, 1005-1013.

なぜ水準を予め入れ子状に並べておくのか

ANOVA君で分析するデータは,水準ごとに予め整理して並べておく必要があります。
これは,関数の中で水準の並べ替えを行ってしまうと,もとの水準との対応がわからなくなってしまうことがあるためです。

例えば,被験者間要因の水準ラベルとして“study”,“restudy”,“control”といった文字列を使用している場合,並べ替えを行うと,“control”,“restudy”,“study”の順に変わってしまいます。
ANOVA君では,さらに,このラベルを“a1”,“a2”,“a3”などのラベルで上書きしてしまいますので,出力を見ただけでは,ユーザーには“a1”がどの水準を指しているのかわからなくなります。

また,被験者内要因の水準を区別するには,現在の仕様で入力を求められる情報だけでなく,各水準を区別するための列ラベル(タイトル行)も入力する必要が出てきます。

これらの点を鑑みて,ANOVA君は,予め並べ替えの行われたデータを前提として分析を行う仕様にしています。

カスタマイズ

多重比較の有意水準を変えたい

ANOVA君の多重比較の際の有意水準は,デフォルトでは,5%に設定されています。
調整済みp値を出力する際には(デフォルト),多重比較全体の有意水準5%未満で棄却できる仮説にのみ「*」マークがつきます。
調整後の有意水準を表示する場合には(「criteria」オプション),全体の有意水準が5%になるように調整した値を算出し,同様に5%未満で棄却できる仮説に「*」マークがつきます。

この有意水準を他の値に変えたい場合は,ファイルの一部を書き換えてください。
ANOVA君のファイルの中にmod.Bon関数(多重比較を行なう関数)を定義している行があります。

mod.Bon <- function(dat, design, taref, bet.mse, ..., alpha = 0.05, criteria = F){

この中で,「alpha = 0.05」という部分が有意水準を設定するコードです。
この0.05という値を例えば0.01に書き換えれば,有意水準を1%として多重比較を行なうことができます。
書き換えたファイルは,「上書き保存」か「名前をつけて保存」で保存してください。
この保存後のファイルを改めてRに読み込むことで(「ソース」で読み込む)変更が有効になります。

有意水準がうまく設定されたかどうかは,結果の出力の際のプロンプトを見れば確認できます。

通常は,多重比較の結果の箇所には,

== Alpha level is 0.05. == 

と表示されています。
変更がうまくいっていれば,この部分が

== Alpha level is 0.01. == 

のように変更後の値になるはずです。

信頼区間の信頼水準を変えたい

ANOVA君のデフォルトの信頼区間の水準は95%に設定されています。
一般には95%の信頼区間を扱うことが多いと思いますが,90%の信頼区間を算出したいこともあるかもしれません。

このような場合は,ANOVA君のファイルの一部を変更してください。
以下のように,ANOVA君のファイルの中には信頼区間を計算する関数(ci.calc関数)があります。

ci.calc <- function(dat, design, factnames = NA, conf.level = 0.95, ...){

この中の「conf.level = 0.95」の数値を変更したい信頼水準の値に書き換えてください。
たとえば,90%信頼区間を計算するように変更するのであれば,「conf.level = 0.90」としてください。
変更したファイルは,「上書き保存」か「名前をつけて保存」を実行して保存してください。
保存後のファイルを再度Rに読み込むことによって(「ソース」で読み込む)変更が有効になります。

信頼水準の変更が有効になったかどうかは,信頼区間を出力する際のプロンプトを確認すればわかります。

通常は,信頼区間の出力を指定すると,以下のような表示が出力されます。

== 95% confidence intervals are calculated. ==

変更が有効である場合には,この部分に変更後の値が表示されます。

== 90% confidence intervals are calculated. ==

交互作用が有意でない場合にも単純主効果の検定を行いたい

ANOVA君は,交互作用が有意であった場合にのみ単純主効果の検定に進む仕様になっています。
一般的には,これが統計的に適切な方針であると思われますが,計画比較等でどうしても単純主効果の検定をしたいことがあるかもしれません。

ANOVA君は水準別誤差項に基づく単純主効果の検定を行うので,単純にデータを分割して手動で分析を行っても同じ結果が得られます。
しかし,多数回の繰り返し計算の中に組み込んで使いたい場合には,これでは使いづらいと思います。

そこで,ここでは,ANOVA君のファイルの一部を書き換えて,交互作用の結果にかかわらず,常に単純主効果の検定を行うように指定する方法を紹介します。

ANOVA君のファイルの中には,下位検定の設定を行うためのpost.analyses関数があります。
この関数には,以下のような一行があります。

sig.source <- internal.lab[!((anovatab$sig.col == "") | (anovatab$sig.col == "ns"))]

常に単純主効果の検定を行うようにするには,この部分を以下のように書き換えてください。

sig.source <- internal.lab[-c(grep("s", anovatab$source.col), grep("Total", anovatab$source.col))]

書き換えたファイルは,「上書き保存」か「名前をつけて保存」で保存してください。
この保存後のファイルを改めてRに読み込むことで(「ソース」で読み込む)変更が有効になります。

あるいは,anovatanを使ってデータを分割する要因を指定して分析を行うという手段もあります(詳しくは,3つ以上の要因の間で交互作用が見られた場合は?を参照)。

R以外のソフトウェアからANOVA君を使うには

最近の統計ソフトウェアには,Rと連携して使用できるものがあります(SAS,IBM SPSSなど)。
これらのソフトウェアを通してRを起動することで,他のソフトウェアのインターフェイスからANOVA君を使用できるものと思われます。

PythonからANOVA君を呼び出す試みもなされています。

PythonからANOVA君を使う

ANOVA君の更新では,下位関数間でやり取りするデータの形式を基本的に変えないようにしていますので,ANOVA君をバージョンアップしても,これらの関数は同様に利用できるものと予想されます。

TrackBack(0) | 外部リンク元 | このエントリーをはてなブックマークに追加