読者です 読者をやめる 読者になる 読者になる

jnobuyukiのブログ

JavaScriptとR言語を中心に研究活動に役立つwebアプリケーション技術について考えていきます。twitter ID: @j_nobuyuki

R言語を使った第1種の過誤のシミュレーション

心理学では、データに基づく仮説の証明に統計学を利用します。帰無仮説と呼ばれる、当初の仮説とは正反対の仮定から始めて、それが確率的に非常に低いことを示し、その結果から当初の仮説の妥当性を確認するというロジックになっています。しかし、「確率的に」と上でも言っているように、実際には何の差もない二つの条件に誤って「差がある」という結論を下してしまうことがあります。それを第1種の過誤と呼びます。今回は、R言語を使ったシミュレーションで第1種の過誤が生じる頻度を計算してみます。

シミュレーションの概要

groupAとgroupBという2群を比較しますが、両群のデータはも平均0、標準偏差1の正規分布からランダムサンプリングによって生成します。つまり、正しくは差がないという状況です。これを誤って差があるとしてしまう頻度を調べます。

ランダムサンプリング

R言語正規分布している母集団からランダムにサンプルを生成するにはrnorm()という関数を用います。引数は3つでnはサンプル数、meanは母集団の平均値、sdは母集団の標準偏差です。

rnorm(n = 10,mean = 0,sd = 1)

とすると、 1.66974645 -0.03602431 1.19748089 -0.70848808 1.55271553のような出力がなされます。

t検定

2群の独立したデータの差を検証する際にはt検定という検定を用います。
R言語での関数はt.test()です。引数は2つで両群のサンプルを示します。
出力では、両群の平均値、t値、p値が出力されます。p値は両群の平均値の差が0であるという帰無仮説が正しい確率です。典型的にはp値が0.05以下もしくは0.01以下の場合に帰無仮説を棄却します。

シミュレーション

今回は、両群のサンプル数とシミュレーションの回数を変数で可変になるようにしました。numSampleとnumSimを変えるとそれぞれ異なるサンプル数とシミュレーション回数の結果を表示できます。

numSample = 10
numSim = 100

alpha05 <- 0
alpha01 <- 0
meanA <- rep(0,numSim)
meanB <- rep(0,numSim)
tarr <- rep(0,numSim)

for (i in 1:numSim){
groupA <- rnorm(numSample, mean = 0, sd = 1)
groupB <- rnorm(numSample, mean = 0, sd = 1)

sim <- t.test(groupA, groupB, var.equal = TRUE)
#print(sim)

meanA[i] <- sim$estimate[1]
meanB[i] <- sim$estimate[2]
tarr[i] <- sim$statistic
if (sim$p.value < 0.05){alpha05 <- alpha05 + 1}
if (sim$p.value < 0.01){alpha01 <- alpha01 + 1}
}

print(mean(meanA))
print(mean(meanB))
print(mean(tarr))
print(alpha05)
print(alpha01)

試しにシミュレーションを走らせてみたところ以下のような結果になりました。

print(mean(meanA))
[1] 0.04469798
> print(mean(meanB))
[1] 0.01053113
両群の平均値は0の近くにあります。

> print(mean(tarr))
[1] 0.03491842
tがほとんど0なので全体としては、両群に差がないことを示唆しています。


> print(alpha05)
[1] 3
それでも棄却率を0.05に設定した場合、第1種の過誤が3回発生しました。

> print(alpha01)
[1] 0
>
棄却率を0.01に設定した場合は、第1種の過誤が発生しませんでした。

まとめ

このように、本来完全に一致した母集団からのサンプルでも、差がないことを100%予測することが出来ません。同じデータで何回も差の検定をする場合には、第1種の過誤に注意しましょう。