The One with ...

思いついたことや作業メモなどを公開しています

p値の分布を計算する

人工的に作成したデータを分析すると,統計の理解が捗ります.「p値ちっちゃい,やったー」みたいな意味のない分析するより,こっちのほうが統計初学者には勉強になるのではないか,と思います.

次のような例を考えてみましょう.

仮説検定を繰り返してp値の分布がどうなっているかを調べる

最初に正規分布に従う乱数を作ります

rnorm(10, 0, 1)

たとえばこのコードは平均0標準偏差1の正規分布に従う乱数を10個作ります.

次に,正規分布(平均0,標準偏差sd)に従う乱数列を二つ作り,その平均値をt検定する関数を定義します関数の名前はcoin1です.

#coin1
coin1<-function(n,sd){
  x <- rnorm(n, 0, sd)
  y <- rnorm(n, 0, sd)
  z<-t.test(x,y,var.equal=T)
  z$p.value}

関数testは関数coin1をk回繰り返します.

test<-function(k,n,sd){
  x <- c()   # 空の(要素数ゼロの)リストを作る
  for (i in 1:k) {
    y <- coin1(n,sd) #コイン1000回投げt検定の結果p値のみ返す
    x <- c(x,  y)   }
  x
}

最後にp値の分布を確認します.

hist(test(k=1000,n=10000,sd=5), breaks = 25)

f:id:hamada7418:20211215181454p:plain
p値の分布

仮説検定は通常,データに対して一回しか用いません.だから計算されたp値は1個です.

しかし計算された,たった一つのp値をみても,正しい仮説が何かは分かりません.帰無仮説が正しいときp値は一様分布に従います.