Page 1
パッケージmosaicを用いたランダム化に基づく推測
Daniel Kaplan*1 Nicholas J. Horton*2 Randall Pruim*3
Macalester College Amherst College Calvin College
St. Paul, MN Amherst, MA Grand Rapids, MI
2013年 8月 17日版
日本語訳 荒木 孝治
目次
1 はじめに 1
2 背景と設定 3
2.1 Rと RStudio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.2 設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
3 Lockの問題 4
4 平均と比率を超えて 12
4.1 線形モデルでのランダム化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
4.2 複数の説明変数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.3 シミュレーションと分散分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
5 シミュレーションを利用する他の方法 20
6 謝辞 22
7 参考文献 22
1 はじめに
mosaicパッケージは,現代的な計算技術により可能となった方法で,統計学とモデリング(のみなら
ず,代数学)を教えることを支援するために開発された.我々の目標は,入門レベルの大学レベルの学
生が利用可能な効率的な計算を提供することにある.低価格で高速な計算環境と,Rのような強力でフ
リーなソフトウェアが広く利用可能となったため,接近可能性に関する速度を制約する因子は知性であ
る:アイデアが明確に表現され,理解される記法を与える.
本稿の目的は,mosaicパッケージを用いることによりランダム化に基づく統計的推測を行う方法を
説明することにある.本パッケージは,学生が学び,一般化するのが容易なアプローチを支援する.こ
*1 [email protected] *2 [email protected] *3 [email protected]
1
Page 2
のため,次の考え方に基づく.
� 学生は,できるだけ少ないコマンドで統計を実行できる.
� 基本的なコマンドは,プログラミングのオペレーションではなく,統計のオペレーションに関連
すべきである.ループやカウンター,加算器といったプログラミングの余計な負荷をできるだけ
避ける.
� ブラックボックスは,概念的に簡単なオペレーションを実行すべきである.その出力は検証可能
でなければならない.
� 文は,単に高レベルのプロシージャの名前ではなく,統計学の論理的構造を例証すべきである.
� 簡単な記述統計量-平均,計数,比率-から一般化線型モデルといったより複雑な手法へと一般
化される簡単な道筋が分かるようにすべきである.
このパッケージを用いると,学生は,George Cobbが統計的推測の “3 Rs”,つまり,Randomization
(ランダム化),Replication(繰り返し),Rejection(棄却)(Cobb,2007)と呼ぶオペレーションを実
行することができる.様々な方法で 3Rを組み合わすことにより,学生は,単に機械的に公式を適用す
るのではなく,推測の論理を一般化し,自分のものにする方法を学ぶことができる.
Terry Speed(2001)は,統計学におけるシミュレーションの役割の変化について述べている.
かつて,シミュレーションは,数学ができない時に利用するものであった.現在では,全ての統
計分析はシミュレーションにより実行することができる.
統計学における最も重要なオペレーションは,サンプリングであることに間違いはない.つまり,母
集団からランダム標本を理想的に抽出することである.残念なことに,サンプリングは手間と時間がか
かるため,教師は理論的な説明を好み,サンプリングの実際の役割に重きを置かない.さらに,大部分
の統計学のテキストで用いられている代数の記法は,サンプリングの明白な記法を提供しない.
しかし,コンピュータを用いると,効率と記法に関するこうした障害を克服することができる.サン
プリングに対して,私たちのコースにおける統計的概念の中で中心的な役割を正しく与えることがで
きる.
並べ替え検定とブートストラッピングを用いるリサンプリングに基づく推測は,入門およびそれ以上
の統計学に対してますます重要な技術の集合である.
異なるソフトウェアのアプローチを教育者が比較しやすくするために,Robin Lock と同僚が
USCOTS (United States Conference on Teaching Statistics) 2011で一連の問題を提起した.これ
は,ブートストラッピングと離サンプリングに関連するものであるが,http://www.causeweb.org/
uscots/breakout/breakout3_6.php で参照できる.
このパッケージは,mosaic パッケージの目的の 1 つは,プログラミングの深遠な局面をマスター
しなくても素人でも容易に利用することのできる基本的なコマンドを提供することである.パッ
ケージおよび本イニシアティブのさらなる情報に関しては,プロジェクト MOSAIC のウェブサイト
(www.mosaic-web.org)を参照のこと.ブートストラッピングと並べ替え検定は,推定と検定に対する
強力で洗練されたアプローチであり,漸近的な結果を見つけることが難しかったり,見つけたとしても
満足できなかったりするという多くの状況においても実行することができる(Efron and Tibshirani,
1993; Hesterberg et al 2005).ブートストラッピングでは,母集団からの復元抽出を用いて,関心の
ある統計量を繰り返し計算することにより標本分布を経験的に構成する.2群の比較のための並べ替え
検定では,グループのラベルを並べ替え,それに対する標本統計量(例えば,新しいラベルに対応する
2群の差)を計算することにより帰無仮説における分布を経験的に構成する.
Lockの無作為化の問題を用いて mosaicパッケージの利用法を示す.そして,Lockの問題という簡
2
Page 3
単な設定を超えて,mosaicのオペレーションが無作為化の論理をより複雑なモデルへと容易に一般化
できることを示す.
2 背景と設定
2.1 Rと RStudio
R はオープンソースの統計環境であり,入門統計を教えるために多くの組織で利用されている.い
くつかある特長のなかで特に,R を用いると,初心者に対して発展した専門的な統計学へ進展するた
めの合理的な道を提供しながら,ランダム化を通じた統計的推測の概念を例示するのが容易になる.
RStudio(http://www.rstudio.org)は,システムの利用を容易にする Rの統合開発環境である.
2.2 設定
パッケージ mosaicはインターネットより取得可能であり,システムの標準的な機能を利用すること
により,Rにインストールすることができる(これは一度行うだけでよい).
install.packages("mosaic")
一旦インストールすると,パッケージを利用するときにロードしなければならない(これはセッショ
ン毎に必要である).パッケージをロードすることに加えて,次のコマンドでは数値を表示する桁数も
設定している.
require(mosaic)
options(digits = 3)
上記のようなコマンドは,Rのセッションを開始するたびに自動的に実行されるように設定ファイル
として学生に渡すこともできる.
mosaic パッケージは,R の中で機能するので,学生にデータセットを提供するのに R が持つデー
タを扱うどの機能でも利用することができる.特に,read.csv() といった R の関数は,ウェブサイト
の URL を通じてデータファイルにアクセスすることをサポートしている.そのため,学生個人のコ
ンピュータにデータファイルをダウンロードする必要はない.URLは長く,わかりにくいことが多い
ので,mosaicは,簡単な名前によりデータファイルを参照することができる fetchData() 関数を提供
している.fetchData()により自動的にチェックされるウェブサイトに Lockの問題に関連したデータ
ファイルを置いている.(教師は,スタートアップファイルコマンドにより自分自身のサイトを指定す
ることができる.これにより,教師は,自分自身のサイトにファイルを置くと,直ちに学生が利用可能
となる.)
では,Lockのデータセットの 1つをインターネットからダウンロードしてみよう.
mustangs <- fetchData("MustangPrice.csv")
3
Page 4
## 完全なファイル名を与える.検索は不要.
3 Lockの問題
Lockの問題は,Robin Lock他により 2011年に提案された統計的推測に関する一連の簡単な問題で
あり,講師がランダマイゼーションソフトウェアの有用性を比較することをできるようにすることを目
的とする.
Lockの問題 1.平均のブートストラッピング(中古ムスタングデータ)
学生が集めたインターネットのウェブサイトで売り出されているムスタング(Mustang)の中
古車価格データ.ファイルMustangPrice.csvに,価格(単位:1000ドル),年,走行距離(1000
マイル)のデータがある.中古ムスタングの平均価格(1000ドル)の 90%信頼区間を作れ.
学生は,計算する前にデータを吟味することを学ぶ必要がある.このために,Rの標準的なツールを
利用することができる.2つの理由から,latticeスタイルのグラフィックス関数の利用を推奨する.
1. mosaicで用いられるものと一貫性のある構文を利用している.
2. より複雑な設定に自然と拡張することができる.
histogram(~Price, data = mustangs)
ここでの基本的な latticeの記法は, — ~を含む “モデル式”と,利用するデータセットを指定する
data= — ,mosaic全体で利用されている.例えば,標本平均は次のようにして求める.
mean(~Price, data = mustangs)
## [1] 16
Rをよく知っている人は,なぜ次のように書かないのか疑問に思うだろう.
4
Page 5
mean(mustangs$Price)
もちろん,次のようにして同じ計算を行うことができる.
mean(~Price, data = mustangs)
上記のコマンドを利用するのは,次のステップを期待しているからである.つまり,ランダム化やモ
デリングといったさらなるオペレーションへの入門である.
リサンプリングは,復元ランダムサンプリングともいうが,ランダム化における重要な演算である.
redample()関数は,これを実行する.基本的な利用方法を,小さなデータを用いて示す.
simple = c(1,2,3,4,5)
resample(simple)
## [1] 2 1 1 5 4
resample(simple)
## [1] 1 3 5 3 1
resample(simple)
## [1] 5 1 3 5 2
データフレームに適用したとき,resample()はランダムに行を選択する.これを例示する.
resample(mustangs)
## Age Miles Price orig.ids
## 10 1 1.1 37.9 10
## 20 14 102.0 8.2 20
## 19 12 117.4 7.0 19
## 25 14 115.1 4.9 25
## 19.1 12 117.4 7.0 19
## 6 15 111.0 10.0 6
## ... and so on
左の列にあるケース番号を見ると,ケース 19が 2回選択されていることがわかる.
平均に関する 1回のリサンプリング試行は次により実行できる.
5
Page 6
mean(~Price, data=resample(mustangs))
## [1] 20.5
1回の試行はほとんど意味が無いが,リサンプリング無しの場合と異なる結果を通常得ることを示す
ために学生に計算させるのは良い考えである.
コマンドを繰り返すことにより別の試行を行うことができる.
mean(~Price, data = resample(mustangs))
## [1] 12.3
さらに 5回,同一のコマンドを実行する.
do(5) * mean(~Price, data = resample(mustangs))
## $result
## [1] 14.6 15.5 16.1 17.9 14.5
##
## attr(,"row.names")
## [1] 1 2 3 4 5
## attr(,"class")
## [1] "do.data.frame"
次に,1000回のリサンプリングを行い,trialsというオブジェクトに結果を保存する.
trials <- do(1000) * mean(~Price, data = resample(mustangs))
このリサンプリングの分布をプロットするのは簡単である.
histogram(~ result, data = trials, xlab = "平均ムスタング価格(単位:千ドル)")
この分布から信頼区間を求める最も簡単な方法は,その目的に合った演算を行うことである.
confint(trials, level = 0.90, method = "quantile")
## name 5 % 95 %
## 1 result 12.5 19.5
6
Page 7
confint(trials, level = 0.90, method = "stderr")
## name lower upper
## 1 result 12.4 19.5
confint()関数はブラックボックスである.講師がこれを紹介するとき,一般目的の演算を用いてあ
る程度詳細に信頼区間の背後にある計算を示したくなるだろう.confint()は 2つの基本的なアプロー
チ,つまり,分布のパーセント点に基づくものと正規理論に基づくものを実装している.
� パーセント点を用いた 90%信頼区間の計算
qdata(c(.05, .95), result, data = trials)
## 5% 95%
## 12.5 19.5
� 正規理論と標準誤差を用いる.先ず適切な自由度に対応する t∗ の限界値を計算する.あるいは,
簡単にするため,または t∗ とどれくらい違っているかを示すために z∗ を用いる.いずれにし
ろ,信頼率を裾の確率に適切に変換する必要がある.信頼率 90%は,裾の確率 0.95に対応する.
tstar <- qt(.95,df = 24)
zstar <- qnorm(0.95)
誤差限界は次のようになる.
tstar * sd(~result, data = trials)
## [1] 3.68
zstar * sd(~result, data = trials)
## [1] 3.54
信頼区間を求めたいとき,こうした一連のコマンドを利用することの意味はほとんどない.そのため
7
Page 8
に confint()があるのである.演算を抽象化し,利用者が level(水準)と method(方法)(“quantile”
または “stderr”)を指定するだけで,水準を裾の確率に変換する必要はない.誤差限界の計算の詳細な
手順をどの程度繰り返すべきかという範囲は,環境と講師の目標に依存するので,講師が決定する必要
がある.Rと mosaicは両方のアプローチをサポートする.
Lockの問題 2: 比率の検定(NFLの延長時間)
National Football League(NFL)では,規定時間の終了時にゲームが同点の場合,勝利者を
決定するのに延長時間を利用する.延長時間に得点をあげたチームがゲームの勝者となる.コイ
ン投げは,どちらのチームが最初にボールを持つかを決定する.
コイン投げに勝つことは有利なのか? 1974年から 2009年のシーズンのデータでは,コイン
投げの勝者は 428回のゲームのうち 240回勝ったことになっている.これを NFLのサンプルと
して,延長ゲームでコイン投げの勝者が半数以上勝つかどうかを検定する.
全体として,入門的な学生は,ボールの所有はゲームの結果と関係がないとすると,428回のゲームの
約半数がコイン投げに勝ったチームが勝利することを理解している.問題は,240回の勝利が 428回の
うちの “約”半数となっているかどうかということである.統計的推定では,サンプリングの変動の中
で,“428/2=214”と 240を比較する.
スタイル 1 2項分布の組み込みオペレータの利用
帰無仮説が成立する状況で 428回のゲームのランダムサンプルを抽出するシミュレーションを行い,
240回以上勝つという結果を与える試行の比率を見る.
prop(rbinom(100000, prob=0.5, size=428) >= 240)
## TRUE
## 0.00699
結果より,もし帰無仮説が正しいとき,コイン投げの勝者が 240回以上勝つことはありそうにないこ
とがわかる.次のシミュレーションでは結果が少し異なる.試行回数を増やすことにより変動を小さく
することができる.
prop(rbinom(100000, prob=0.5, size=428) >= 240)
## TRUE
## 0.00655
シミュレーションではなく厳密に確率計算を行うことによりバラツキを避けたいときもある.しか
し,正確に計算するには,“240以上”ということに対応する分布の裾を反映する限界点を調整する必要
がある.これは,観測数から 1を引くことを意味する.
8
Page 9
pbinom(239, prob=0.5, size=428)
[1] 0.993
正確な確率計算を行いたい場合でも,乱数の生成の論理を説明したくなるだろう.
スタイル 2 コイン投げをシミュレートする.
コイン投げは統計学のコースの要であり,mosaicパッケージはランダムなコイン投げの結果を表に
する機能をもつ.
do(1) * rflip(428)
## $n
## [1] 428
##
## $heads
## [1] 206
##
## $tails
## [1] 222
##
## attr(, "row.names")
## [1]
## attr(,"class")
## [1] "do.data.frame"
1000回試行し,コイン投げで 428回のうち 240回以上勝つ比率を数える.
trials <- do(1000) * rflip(428)
prop(trials$heads >= 240, data=trials)
## TRUE
## 0.009
histogram(~heads, groups = (heads >= 240), data = trials)
観測された 240 勝というのは,帰無仮説の元での結果とは判断しにくい.groups =オプションによ
り網掛けした領域は,結果を視覚的に強化するのに役立つ.
Lockの問題 3:2群からの平均の並べ替え検定(睡眠と記憶)
記憶に関する実験(Mednicj et al, 2008)において,学生は 24語のリストが与えられ,記憶
するように指示される.学生は,語を聞いた後,ランダムに 2 つのグループに分けられる.12
人から構成される 1つのグループは,1.5時間昼寝し,もう 1つのグループは,眠らず,カフェ
9
Page 10
インの錠剤が与えられる.次のデータは,休憩後,参加者が記憶していた語数を示す.2つの処
理の間の平均記憶数に違いがあるかどうかを検定せよ.
sleep <- fetchData("SleepCaffeine.csv")
## 完全なファイル名を与える.検索は不要.
The Sleep group seems to have remembered somewhat more words on average:
mean(Words ~ Group, data=sleep)
## Caffeine Sleep
## 12.2 15.2
obs <- diff(mean(Words ~ Group, data=sleep))
obs
## Sleep
## 3
bwplot(Words ~ Group, data=sleep)
帰無仮説の状態を作るために,Wordsに対応する Groupをスクランブルする.
10
Page 11
diff(mean(Words ~ shuffle(Group), data = sleep))
## Sleep
## -1.17
これは 1回の試行にすぎない.再度試行する.
diff(mean(Words ~ shuffle(Group), data=sleep))
## Sleep
## 0.333
帰無仮説の元での分布を得るために,さらに多くの試行を行う必要がある.
Lockの問題 4:相関のブートストラッピング
問題 1におけるムスタングの中古価格データは,走行距離(単位:1000マイル)に関するデー
タを含んでいる.価格と走行距離との相関の 95%信頼区間を求めよ.
cor(Price, Miles, data = mustangs)
## [1] -0.825
trials <- do(1000) * cor(Price, Miles, data = mustangs)
quantiles <- qdata(c(.025, .975), result, data = trials)
## 2.5% 97.5%
## -0.928 -0.720
histogram(~result, data = trials, groups=cut(result, c(-Inf, quantiles,
Inf)), nbin = 30)
trials <- do(1000) * diff(mean(Words ~ shuffle(Group), data = sleep))
histogram(~ Sleep, groups=(Sleep >= obs), data=trials,
xlab="帰無仮説の元での\n平均の差の分布")
この検定に対する片側 p 値は,観測された差またはそれ以上となる結果を生み出す試行の比率であ
る.平均の差が観測値以上となる試行数を求めることにより,片側 p値を計算することができる.1000
11
Page 12
回のうち 35回のみがそうなっているので,p値は 0.035である.母集団において,2つのグループが
同じ母平均を持つということはなさそうであると結論づけることができる.
4 平均と比率を超えて
Lockの問題は,多くの入門応用統計のコースで扱われる平均,比率,平均の差,比率の差といった
記述統計に関するものである.しかし,そのような基本統計量をより一般的な線形モデルの文脈で紹介
することは意味がある.
通常,線形モデルといえば,回帰の文脈で解釈される.例えば,LockのMustangの価格データセッ
トでは,車の価格と走行距離との間には関係があると思われる.
散布図を描くと次のようになる.
xyplot(Price ~ Miles, data = mustangs)
図より,価格と走行距離の間には明確な関係があることがわかる.Lockの問題では相関係数により
この関係の強さを数値化している.
12
Page 13
回帰では,変数間の直線的な関係を調べる.Rの組み込み関数である lm()は,この計算を行う.
lm(Price ~ Miles, data = mustangs)
##
## Call:
## lm(formula = Price ~ Miles, data = mustangs)
##
## Coefficients:
## (Intercept) Miles
## 30.495 -0.219
利用されている記法は,散布図を作成するものと同じである.結果より,1000マイル走る毎に中古
車価格は 219ドル安くなる(あるいは,データの単位を利用すると,0.2188千ドル).いい換えると,
Mustangの価値は,1マイル当たり約 22セント安くなる.効果の大きさで記述することができるとい
うことは,相関係数ではなく回帰で記述する利点である.回帰の記法の利点は他にもあるが,それは後
に説明する.今は,平均や比率,平均の差,比率の差といった伝統的な計算に対するフレームワークと
して回帰を利用することを強調しておきたい.
1マイル当たり 22セントというのは,“効果の大きさ”と考えることができる.学生(車の購入者)
にとって,相関係数が 0.82であるというより,はるかにわかりやすい.
Mustangの平均価格は,次のように通常の方法で計算できる.
mean(Price, data = mustangs )
##
## [1] 16
同じ結果を線型モデルを用いて得ることができる.
lm(Price ~ 1, data = mustangs)
## Call:
## lm(formula = Price ~ 1, data = mustangs)
## Coefficients:
## (Intercept)
## 16
この意味はよく分からないかもしれない.lm()において,記号 ~ は目的変数と説明変数を指定する
ために用いられる.Price ~ Milesにおいて,目的変数は Priceで,説明変数は Milesである.走行距
離は車によって異なる.走行距離のこの変動が,価格の変動の説明に用いられる.
Price ~ 1において,1は説明変数がないこと,あるいは少し別の表現をすると,車は全て同じであ
ることを意味する.関数 mean()で,これと同じ記法を利用することができる.
13
Page 14
mean(Price ~ 1, data = mustangs)
## 1
## 16
なぜか?これにより,異なるグループに対する平均を計算できるように記法を拡張することができ
る.例示のため,後で睡眠を取るのとカフェインを摂取することにより単語の記憶する能力を比較する
という Lockの sleep (睡眠)データを考える.
グループを無視したときの記憶された単語の平均は次のようになる,
mean(Words ~ 1, data=sleep )
## 1
## 13.8
層別して計算するには,説明変数を利用する.
mean(Words ~ Group, data = sleep )
## Caffeine Sleep
## 12.2 15.2
慣習として,回帰はMustangデータにおける Milesのような数値の説明変数を利用する手法として
導入された.これに対して層別の平均は,sleep データの Group のような質的変数に対して利用され
る.しかし,回帰の手法を質的変数に適用することも可能である.
lm(Words ~ Group, data = sleep )
##
## Call:
## lm(formula = Words ~ Group, data = sleep)
##
## Coefficients:
## (Intercept) GroupSleep
## 12.2 3.0
mean()で報告された情報と lm()の結果との違いは,その出力の形式にある.lm()の場合,GroupSleep
の係数は,2つのグループの間の差となっている.
14
Page 15
diff(mean(Words ~ Group, data = sleep ))
## Sleep
## 3
関数 lm()を用いて,比率や比率の差を計算することができる.1次医療無作為化臨床試験における
健康評価とリンケージにおける患者に関する情報を含むデータセット HELPrctを用いて示す.ホーム
レスであると報告された人々の比率を考える.
prop(homeless ~ 1, data = HELPrct)
## homeless:
## 0.461
ホームレスの患者の比率は,性別で異なるようである.男性の方がホームレスになりやすいようで
ある.
prop(homeless ~ sex, data = HELPrct )
## homeless:female homeless:male
## 0.374 0.488
これらの 2つの比率の差は次のようになる.
diff(prop(homeless ~ sex, data = HELPrct ))
## homeless:male
0.115
lm()関数を用いて同じ結果を得ることができる.(”homeless” または ”housed”のどの水準の比率を
求めたいかを指定する必要がある.)
lm(homeless == "homeless" ~ 1, data = HELPrct )
##
## Call:
## lm(formula = homeless == "homeless" ~ 1, data = HELPrct)
##
##Coefficients:
## (Intercept)
15
Page 16
0.461
mean()や prop(),diff()が同じ結果を与えるのになぜ lm()を用いるのか.それは,lm()の方が拡
張性が高いからである.lm()では,質的および量的な説明変数に対して適用でき,さらに重要なこと
は,lm()は,複数の説明変数を利用できる.
mean()や prop()を用いるときでさえ,記法 ~1 を用いた方が良い理由がある.それは,計算は応答
変数の変動を説明することを試みているわけではない,利用される説明変数はないということを強調
する.
lm(homeless == "homeless" ~ sex, data = HELPrct)
##
## Call:
## lm(formula = homeless == "homeless" ~ sex, data = HELPrct)
## Coefficients:
## (Intercept) sexmale
## 0.374 0.115
4.1 線形モデルでのランダム化
lm() でランダム化を実行するには,mean() や prop() と同じスタイルで行えばよい.例として,
Mustangデータにおいて走行距離の変化に応じた価格の変化のリサンプリングに対する信頼区間を次
に示す.
trials <- do(1000) * lm(Price ~ Miles, data = resample(mustangs))
confint(trials)
## name lower upper
## 1 Intercept 24.889 36.034
## 2 Miles -0.277 -0.163
## 3 Sigma 2.969 9.033
## 4 r.squared 0.518 0.884
あるいは,HELPrctデータを用いて男性と女性の間のホームレス率の違いを並べ替え検定すること
ができる.
nulldist <- do(1000) * lm(homeless == "homeless" ~ shuffle(sex), data=HELPrct)
prop(~ abs(sexmale) > 0.1146, data = nulldist)
## TRUE
## 0.059
16
Page 17
4.2 複数の説明変数
回帰モデルで,複数の説明変数を利用することができる.例えば,Mustangsの価格に Ageと Miles
がどれくらい関係しているかを調べることができる.
trialsmod1 <- do(1000) * lm(Price ~ Age, data = resample(mustangs))
trialsmod2 <- do(1000) * lm(Price ~ Miles, data = resample(mustangs))
trialsmod3 <- do(1000) * lm(Price ~ Miles + Age, data = resample(mustangs))
第 1のモデルは,Price(価格)は 1年当たり 1000から 2000ドル減少することを示す.
confint(trialsmod1)
## name lower upper
## 1 Intercept 23.78 37.150
## 2 Age -2.29 -1.181
## 3 Sigma 4.01 11.395
## 4 r.squared 0.27 0.756
第 2のモデルは,1マイル当たり 16− 28セント減少することを意味する.
confint(trialsmod2)
## name lower upper
## 1 Intercept 24.576 36.325
## 2 Miles -0.279 -0.159
## 3 Sigma 2.809 9.059
## 4 r.squared 0.520 0.891
第 3のモデルは,各説明変数を互いの文脈の中に置き,Ageは Milesの代理であることを示す.
confint(trialsmod3)
## name lower upper
## 1 Intercept 25.453 36.0534
## 2 Miles -0.323 -0.0948
## 3 Age -0.973 0.7159
## 4 Sigma 2.684 9.1336
## 5 r.squared 0.520 0.9100
17
Page 18
この結果を解釈する 1つの方法は,Milesで調整するとき,Ageの効果はほとんどないということで
ある.Milesと Ageに対する信頼区間が膨張するのは,これらの説明変数の共線性の結果である.
4.3 シミュレーションと分散分析
分散分析を考える 1つの方法は,あるモデル項が他のモデル項の文脈において,ランダムな “ごみ”
よりも良いということをデータで示すことである.例えば,Mustangsの Priceの Milesを含むモデル
における Ageの役割を考えよう.分散分析の 1つの出力を次に示す.
anova(lm(Price ~ Miles + Age, data = mustangs))
## Analysis of Variance Table
##
## Response: Price
## Df Sum Sq Mean Sq F value Pr(>F)
## Miles 1 2016 2016 46.94 7e-07 ***
## Age 1 4 4 0.09 0.77
## Residuals 22 945 43
## ---
## Signif. codes: 0 ’***’ 0.001 ’**’ 0.01 ’*’ 0.05 ’.’ 0.1 ’ ’ 1
Ageの p値は,Ageはモデルに寄与していないことを示唆する.しかし,異なる結論を示唆する異な
る分散分析の出力もある.
anova(lm(Price ~ Age + Miles, data = mustangs))
## Analysis of Variance Table
## Response: Price
## Df Sum Sq Mean Sq F value Pr(>F)
## Age 1 1454 1454 33.9 7.4e-06 ***
## Miles 1 565 565 13.2 0.0015 **
## Residuals 22 945 43
## ---
## Signif. codes: 0 ’***’ 0.001 ’**’ 0.01 ’*’ 0.05 ’.’ 0.1 ’ ’ 1
2つの分散分析の結果の違いを,いくつかの方法で説明することができる.例えば,モデルの入れ子
になった逐次的な出力である ANOVAを考えることにより,モデルの項の記載の順序が違いを生み出
すのである.例えば,これらのモデルの R2 の変化は,Ageは Milesほどは寄与していないことを示唆
する.
18
Page 19
do(1) * lm(Price ~ Miles, data = mustangs)
## $Intercept
## [1] 30.5
##
## $Miles
## [1] -0.219
##
## $Sigma
## [1] 6.42
##
## $r.squared
## [1] 0.68
##
## attr(,"row.names")
## [1] 1
## attr(,"class")
## [1] "do.data.frame"
do(1) * lm(Price ~ Miles + Age, data = mustangs)
## $Intercept
## [1] 30.9
##
## $Miles
## [1] -0.205
##
## $Age
##
## [1]-0.155
##
## $Sigma
## [1] 6.55
##
## $r.squared
## [1] 0.68
##
## attr(,"row.names")
## [1] 1
## attr(,"class")
## [1] "do.data.frame"
ここで,do()はランダム化なしに,単に,結果を比較しやすいようにフォーマットするために利用し
ている.説明変数として Ageを追加すると,R2 の値が少し大きくなっている(0.680から 0.681へ)こ
とに注意.
Ageをシャフルすると,帰無仮説の元で期待されるものと比べて R2 の実際の変化を生み出すことが
できる.
19
Page 20
trials1 <- do(1000) * lm(Price ~ Miles + shuffle(Age), data = mustangs )
confint(trials1)
## name lower upper
## 1 Intercept 25.704 35.451
## 2 Miles -0.232 -0.206
## 3 Age -0.581 0.565
## 4 Sigma 6.059 6.787
## 5 r.squared 0.660 0.727
Price ~ Miles + Ageより得られる R2 の値は,Ageをシャフルしたとき観測される値の範囲に入っ
ている.
Milesをシャフルすると,結果は非常に異なる.
trials2 <- do(1000) * lm(Price ~ shuffle(Miles) + Age, data = mustangs )
confint(trials2)
## name lower upper
## 1 Intercept 24.7016 35.631
## 2 Miles -0.0772 0.081
## 3 Age -1.8770 -1.563
## 4 Sigma 7.6286 8.571
## 5 r.squared 0.4580 0.567
R2 = 0.681は信頼区間のはるか外側にあるので,Milesに関する帰無仮説は棄却される.
5 シミュレーションを利用する他の方法
リサンプリングとシャフリングという基本的な手法は,信頼区間と p値の生成のみではなく,統計学
の他の多くの概念を例示するために利用できる.例えば,t分布や F分布といった分布の起源を示すた
めに有益である.
例として,HELPrctデータにおける homeless(ホームレス)と sex(性別)の独立性の χ2 検定を考
える.この簡単な検定に対する帰無仮説の元での p 値の分布を作り出すためのシミュレーションは次
のようになる.
1. 検定を実行する.例えば,
chisq.test(tally( ~ homeless + sex, data = HELPrct, margins = FALSE))
##
## Yatesの連続修正を行った Pearsonのカイ二乗検定
##
## data: tally(~homeless + sex, data = HELPrct, margins = FALSE)
## X-squared = 3.87, df = 1, p-value = 0.04913
20
Page 21
2. 関心のある統計量を抽出するためにコマンドを修正する.今の場合,p値を抽出するには次のよ
うにする.
pval(chisq.test(tally( ~ homeless + sex, data = HELPrct, margins = FALSE)))
## p.value(p値)
## 0.0491
3. 帰無仮説の状況を作るためにランダム化を行う.
pval(chisq.test(tally( ~ shuffle(homeless) + sex, data=HELPrct, margins=FALSE)))
## p.value(p値)
## 0.976
4. 帰無仮説の元での分布を得るために繰り返す.
trials = do(1000)* pval(chisq.test( tally( ~ shuffle(homeless) + sex, data=HELPrct,
margins=FALSE)))
厳密にいうと,最後のステップのみが必要である.他は単にステートメントの構成の仕方,およ
び,各要素が全体の中でのような役割を果たしているかを示すためのものである.
学生は,帰無仮説の元で,p値は 0.05より少し大きい位であると考えるてしまう.帰無仮説の元
での p値の分布は 0から 1の一様分布である,あるいは,帰無仮説が真のときでさえ,(p < 0.05
のときに)帰無仮説を棄却する確率は約 5%であることを知ると学生は驚くであろう.
prop(~(p.value < 0.05), data=trials)
## TRUE
## 0.052
histogram( ~p.value, data=trials, width = 0.05)
21
Page 22
おそらくより重要なのは,シミュレーションのアプローチにより,より発展的で適切なモデルと検定
へとスムーズに移行できることである.そこで,よく用いられる χ2 検定ではなく,age(年齢)を共変
量とするロジスティック回帰といったより現代的で柔軟な手法を適用してみよう.
trials = do(1000) * glm(homeless=="homeless" ~ age + sex, data = resample(HELPrct),
family = "binomial")
confint(trials)
## name lower upper
## 1 Intercept -2.363803 -0.3915
## 2 age -0.000953 0.0482
## 3 sexmale 0.035213 0.9432
6 謝辞
初期の草稿に対するコメントをもらった Sarah Anokeに感謝する.また,USCOTSにおけるリサン
プリングを実例するセッションをオーガナイズした St. Lawrence大学の Robin Lockにも感謝する.
MOSAICプロジェクトはUS National Science Foundationより支援を受けている(DUE-0920350).
本パッケージとこのイニシアティブに関する追加情報については,MOSAICプロジェクトのウェブサ
イト(www.mosaic-web.org)を参照.
7 参考文献
� G. W. Cobb, The introductory statistics course: a Ptolemaic curriculum?, Technology In-
novations in Statistics Education, 2007, 1(1).
� B. Efron & R. J. Tibshirani, An Introduction to the Bootstrap, 1993, Chapman & Hall, New
York.
� T. Hesterberg, D. S. Moore, S. Monaghan, A. Clipson & R. Epstein. Bootstrap Methods
and Permutation Tests (2nd edition), (2005), W.H. Freeman, New York.
� D.T. Kaplan, Statistical Modeling: A Fresh Approach, 2nd edition, http://www.
mosaic-web.org/StatisticalModeling.
� S.C. Mednicj, D. J. Cai, J. Kanady, S. P. Drummond. “Comparing the benefits of caffeine,
naps and placebo on verbal, motor and perceptual memory”, Behavioural Brain Research,
2008, 193(1):79-86.
� T. Speed, “Simulation”, IMS Bulletin, 2011, 40(3):18.
22