ANOVA君/より高度な入力方式 - 井関龍太のページ

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

ANOVA君/より高度な入力方式

Last-modified: 2015年04月12日 (日) 19:07:31 (1318d)
Top > ANOVA君 > より高度な入力方式

ワイド形式とロング形式

データを整理するとき,主に2つのタイプのまとめ方があると思います。
ひとつは,以下のような形式です。

a1 4 7 5 
a1 6 3 6 
a1 8 6 4 
a1 7 8 3 
a2 4 8 9 
a2 2 2 8 
a2 1 3 8 
a2 5 4 7 
a2 4 5 9 
a2 2 3 7 

これは,一行が一人の実験参加者のデータに対応していて,条件の違いは横並び(列)で,人及びグループ(群)の違いは縦の並び(行)で区別される形式です。
このやり方では条件が増えるにつれてデータが横に大きく広がっていくためか,ワイド形式と呼ばれることがあるようです。

一方,統計処理を行う場合には,以下のような整理の仕方が求められることもあると思います。

  s  A  B y
 s1 a1 b1 4
 s2 a1 b1 6
 s3 a1 b1 8
 s4 a1 b1 7
 s5 a2 b1 4
 s6 a2 b1 2
 s7 a2 b1 1
 s8 a2 b1 5
 s9 a2 b1 4
s10 a2 b1 2
 s1 a1 b2 7
 s2 a1 b2 3
 s3 a1 b2 6
 s4 a1 b2 8
 s5 a2 b2 8
 s6 a2 b2 2
 s7 a2 b2 3
 s8 a2 b2 4
 s9 a2 b2 5
s10 a2 b2 3
 s1 a1 b3 5
 s2 a1 b3 6
 s3 a1 b3 4
 s4 a1 b3 3
 s5 a2 b3 9
 s6 a2 b3 8
 s7 a2 b3 8
 s8 a2 b3 7
 s9 a2 b3 9
s10 a2 b3 7

これは,一行にひとつのデータのみが並ぶ形式です。
ひとつの列(この例では右端の列)のみがデータ(従属変数)を表し,他の列はすべてこのデータの性質(条件,人,群の違いなど)を表しています。
この形式では,人や条件が増えると横にはそれほどではありませんが,縦方向に大きくデータが伸びていくことになります。
そのためか,ロング形式と呼ばれています。

これら2つの形式にはどのような違いがあるのでしょうか。
見た目からすれば,ワイド形式の方がわかりやすいように思います。
条件が縦に3つ並んでいるので,この下にそれぞれの平均値やSDを表せば比較もしやすそうです。
群の違いについてはラベルを使って区別することにすれば,4番目の人まではa1グループで5番目からはa2グループということもわかり,この前後の行までで代表値をまとめて計算するかどうかを区別すればよさそうです。
何より,分散分析の文脈でいえば,ひとめでデザインが区別できます。
ワイド形式のデータをざっと見れば,被験者間要因がいくつあるのか,被験者内要因の積としての条件数がいくつあるのかがすぐにわかります。

逆に,ロング形式では,これらの点のわかりやすさはいまひとつであるように思います。
下の端まで行けば,要因数と水準数がすぐに把握できるという利点はありますが,これがどのようなデザインに対応するデータであるかは,眺めていてもすぐにはわかりません。
s1の人がどの条件にも参加しているのか,一部だけなのかを逐一チェックする必要があります。

それでは,なぜロング形式というものがあるのでしょうか。
実は,統計処理の上では,ロング形式のほうがずっと扱いやすいのです。
RやSPSSで回帰分析をしたことがある方ならわかるかと思いますが,ワイド形式でデータを並べてしまってはすぐに回帰分析を行うことができません。
いったんロング形式に直す必要があります。
それから,条件ごとの代表値を計算する場合にも,実はワイド形式よりもロング形式のほうが簡単です。
ワイド形式では見た目の分割がわかりやすいのですが,従属変数があっちやこっちの列に分散していてデータへのアクセスがたいへんです。
それに対して,ロング形式であれば,従属変数はこの列,グループ変数はこの列と決まっているので,プログラムを通して条件ごとにデータを整理するのにはつごうがよいのです(Rにtapplyという関数がありますが,これを使ってみるとよくわかります)。

ということで,ぱっと見て直感的にわかりやすいのがワイド形式,プロっぽくてコンピュータで扱いやすいのがロング形式といったところでしょうか。

ANOVA君のデータ入力方式

ANOVA君のデータ入力方式は,ワイド形式を前提としたものになっています。
この理由には,ワイド形式の利点として挙げたように,分散分析のデザインを意識しやすいということがあります。
ロング形式のデータを使おうとした場合,どれが被験者間要因で,被験者内要因かはデータの構造を一見しただけではわかりづらいように思います。
これに対して,ANOVA君で想定したルールに基づくワイド形式のデータであれば,どれがどちらの要因に当たっているかは一目瞭然です。
このような形式にデータを整理してみることで,自分が分析しようとしているデータの構造を改めて確認することにもなるのではないでしょうか。
ワイド形式を好むもうひとつの理由としては,js-STARやSPSSの入力形式に私が慣れていたからということもありますが……。

一方,Rなどの統計ソフトで扱うにはロング形式のほうが便利です。
しかしながら,せっかく作ったワイド形式のデータをいちいち手作業でロング形式に直すのはなかなかの手間です。
CRANで“wide long format”などと検索するとたくさんのパッケージがヒットするので,このような要望を持つ人は少なくないように思います。
Rの基本関数にもreshape関数がありますが,これは群のラベルが2つ以上のときにうまく動作しないので,分散分析には向きません。
そこで,ワイド形式によるデータ整理と統計処理の間をつなぐために,分散分析を想定したワイド形式のデータをロング形式に変換する関数があれば,という発想が浮かんできます。
このように,ANOVA君はそもそもワイド形式のデータフレームをロング形式に変換するための関数として作られたのです。
data.frameオプションはこの変換がうまくいったか確認するためのデバッグ用の機能でした。
(ロング形式に変換したあとはaov関数にデータを渡す予定でした。)

現在でも,anovakunという関数が行っているのは,ワイド形式のデータフレームをロング形式に変換するという作業がほとんどです(version 4.5.0以降では,この変換作業の部分もuni.long関数として切り離してしまいました)。
そのあとは,分散分析表を作る関数(anova.modeler)や下位検定を行う関数(post.analyses)にデータを送っています。
そして,実際に統計的な処理を行っているこれらの関数は,ロング形式に変換された後のデータフレームを扱っているのです(というより,ワイド形式のデータは扱うことができません)。

ロング形式によるデータ入力方式

上のような開発の経緯から,ANOVA君を利用する方の多くは,ワイド形式での処理を期待するだろうと考えていました。
しかし,必ずしもそうとは限らないようで,ロング形式でANOVA君を利用したいとの声もあるようです。
このような場合,ロング形式で作ったデータをわざわざユーザーや仲介プログラムがワイド形式に直したあとに,データを受け取ったANOVA君のほうでは再びワイド形式からロング形式に直して処理することになります。
これはあまりにも非効率的です。
ANOVA君のほうは内部的にはロング形式のデータしか扱えないのです。
ワイド形式からロング形式への変換操作をスキップすれば,ロング形式のデータでもほとんどそのまま動かせるはずです。

そこで,anovakun 4.4.0では,データ入力方式を拡張して,ロング形式のデータも扱えるようにしました。
ただし,入力の簡便さを保つため,データの作り方にいくつかの決まりを設けています。

1. 左端の列は実験参加者のラベルを表す。
2. 中間の列は各要因の各水準を表す。
3. 右端の列は従属変数を表す。

一列がひとつの要因に対応するので,要因の数だけ列が増えることになります。
各要因を表す列は,左から被験者間要因をまとめて並べ,被験者内要因は右のほうにまとめる必要があります(“AsB”などのデザインを表す文字列に対応した順番です)。
具体的には,このページの上の方にあるロング形式のデータ例のように作れば問題ないと思います。

ロング形式のデータを読み込んで実行する際には,“long = T”とオプションを指定してください。

> anovakun(dat, "AsB", 2, 3, long = T)

今回,せっかくロング形式も扱えるようにしたので,ロング形式の入力によって得られる情報を利用して少し機能を拡張してみました。
ワイド形式の場合には被験者間要因については水準名の情報を得られましたが,被験者内要因についてはこの情報を得られませんでした。
これに対して,ロング形式の場合には,すべての水準名をデータフレームに書き込むことになります(上の例でいえば,a1,a2に当たる部分です)。
また,ヘッダ情報を利用すれば,要因名の情報も得ることができます。
そこで,ロング形式のデータを入力した場合には,分散分析表にユーザーが指定した要因名(ヘッダで指定)と水準名(データフレーム中のラベルで指定)が表示されるようにしました。
データフレームにヘッダ情報が設定されていない場合(デフォルトの"V1"~のままの場合)は,アルファベットによるラベルづけが行われます。
具体的には,たとえば,以下のような形でデータフレームを作り,一行目をヘッダとして指定してあれば,要因名を“WM”と“Study”,水準名を“WM”要因については“high”と“low”,“Study”要因については“lecture”,“text”,“peer”として出力できます。

 ID  WM  Study   test
 s1 high lecture  4
 s2 high lecture  6
 s3 high lecture  8
 s4 high lecture  7
 s5  low lecture  4
 s6  low lecture  2
 s7  low lecture  1
 s8  low lecture  5
 s9  low lecture  4
s10  low lecture  2
 s1 high text     7
 s2 high text     3
 s3 high text     6
 s4 high text     8
 s5  low text     8
 s6  low text     2
 s7  low text     3
 s8  low text     4
 s9  low text     5
s10  low text     3
 s1 high peer     5
 s2 high peer     6
 s3 high peer     4
 s4 high peer     3
 s5  low peer     9
 s6  low peer     8
 s7  low peer     8
 s8  low peer     7
 s9  low peer     9
s10  low peer     7

要因名,水準名には日本語も指定できます。
日本語の変数名を用いるとRやRstudioの表示が崩れることがありますが,これは日本語に対応していないフォントをエディタやコンソールで指定しているためです。
英語用のフォントを指定している場合,アルファベットの表示には指定のフォント,日本語の表示には別のフォントが用いられるため,画面上には複数のフォントが混在することになり,表示幅を調整するのが難しくなります。
画面表示用のフォントとして,日本語フォント(特に,等幅のフォント)を指定すれば表示のずれは起こりにくくなります。
ただし,いまのところ,Linux(Ubuntu)では日本語を使うとどうしても表示がずれてしまうようです。
このような場合は,アルファベットで要因名,水準名を指定することをお勧めします。

ちなみに,ロング形式でデータを入力した場合,水準数の指定は省略できます。

> anovakun(dat, "AsB", long = T)

これは,ロング形式のデータであれば,各要因にいくつの水準があるのかは指定がなくてもデータから読み取れるからです。
このように,一般に,ロング形式のほうがワイド形式よりも入力時に得られる情報量が多いといえます。
その代わり,ロング形式では,データフレームによる指定(特に,各水準の割りつけ)を誤ることによって指定を間違える可能性が高くなるかもしれません。

なお,ロング形式によるデータ入力を行なう場合にデータフレームにデフォルト以外のヘッダ名をつけていると,ANOVA君はヘッダ名を要因名として扱います。
そこで,ヘッダ名をつけている場合には,オプションで要因名を指定する際にA~Zのラベルではなく,出力に使用される要因名(ヘッダ名)を使ってください。
たとえば,一般化イータ二乗を出力する際に“WM”という名前をつけた要因を測定要因に指定するには,以下のようにします。

> anovakun(dat, "AsB", long = T, geta = "WM")

このことは,anovatanにおいても同様です。

> anovatan(dat, "AsB", long = T, tfact = "WM")

ワイド形式によるデータ入力方式の拡張

anovakun 4.4.0では,ロング形式を使った場合に要因名,水準名を指定できるように拡張したので,ワイド形式の場合にもこれらを指定できるようにしてみました。
指定方法は,以下のようになります。

> anovakun(dat, "AsB", WM = c("high", "low"), Study = c("lecture", "text", "peer"))

ここで,「WM」や「Study」,かっこ内の文字列は任意に指定できる項目です。
左から順番に,ひとつめの要因の名前,2つめの要因の名前,……といったふうに指定します。
かっこ内が水準名に相当する文字列で,入力するデータフレームにおける各水準データの順番に一致させる必要があります。
各水準の名前を指定する際には「c()」をつけて,各水準の名前をダブルクォーテーション("")でくくるようにしてください(文字列をベクトル化するための操作です)。

指定方法はやや複雑になりますが,この方法を用いればワイド形式のデータでも,要因名,水準名を指定することができます。
この指定方法を使った場合には,水準数を明示的に指定する必要はありません(指定している水準名の数から判別できるため)。
要因名,水準名は基本的に何でもかまいませんが(日本語も可),ANOVA君の既存のオプション名(holmなど)と重複する名前は使用することができません。
どうしてもオプション名と重複する名前を使いたい場合は,ロング形式による入力を利用してください。
ちなみに,anovakun 4.4.0以降でも,これまでと同じ指定方法も使えます。

今回の変更に伴って,一般化効果量のオプションで複数の要因を測定要因に指定するときの入力方法も変更する必要がありました。
anovakun 4.4.0以降では,以下のように,c関数を利用して測定要因を指定してください。

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

測定要因がひとつの場合は,cなしでも問題ありません。

> anovakun(dat, "ABsC", WM = c("high", "low"), Time = c("AM", "PM"), Study = c("lecture", "text", "peer"), geta = "WM")

データ入力方式のまとめ

結果として,現在のANOVA君には3種類のデータ入力方式があることになります(version 4.4.0以降)。

要因名・水準名の指定方法水準数の入力オプションの指定
ワイド形式(名前の指定なし)しない必要不要anovakun(dat, "AsB", 2, 3)
ロング形式ヘッダとラベル列による不要longanovakun(dat, "AsB", long = T)
ワイド形式(名前の指定あり)実行時の指定による不要不要anovakun(dat, "AsB", WM = c("high", "low"), Study = c("lecture", "text", "peer"))

複数の指定方法を混在させることはできません。
名前をつける場合は,すべての要因及びすべての水準につけてください。

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