2つの平均値の比較:対応のないt検定

MikuHatsune2011-12-10

数学いらずの医科統計学PART6 CHAPTER30をRでやってみる。
対応のないt検定については、ただひたすらRだけをやる特別講義でも扱っている。
 
Frazier EP, et al (2006)は、神経伝達物質であるノルアドレナリンが、どの程度膀胱括約筋を弛緩させるか測定した。

old   <- c(20.8, 2.8, 50, 33.3, 29.4, 38.9, 29.4, 52.6, 14.3)
young <- c(45.5, 55, 60.7, 61.5, 61.1, 65.5, 42.9, 37.5)
boxplot(list(old, young))


ここで、
・2つの平均値の差に対する信頼区間
・2つの平均値が同一であるとする帰無仮説を検定するp値
を考え、対応のないt検定について学ぶ。
t検定は、裏で正規分布を考えているパラメトリック手法である。ノンパラメトリック手法はいつか触れる。(以前やったことのあるブートストラップ法とは違う手法たち)
 
Rに放り込むとこうなる。ここでは、平均値の差が等しいという帰無仮説を、両側検定で考えている。

t.test(old, young, altenative="two.sided", conf.level=0.95)

	Welch Two Sample t-test

data:  old and young 
t = -3.6242, df = 13.778, p-value = 0.002828
alternative hypothesis: true difference in means is not equal to 0 
95 percent confidence interval:
 -37.501081  -9.590586 
sample estimates:
mean of x mean of y 
 30.16667  53.71250 

p値は0.003である。帰無仮説は棄却される。
 
2つの平均値の差に対する信頼区間を考える。

datamean <- sapply(list(old, young), mean)
stdev <- sqrt(unlist(lapply(list(old, young), var)))
n     <- unlist(lapply(list(old, young), length))
ciw   <- qt(0.975, n) * stdev / sqrt(n)
d.error    <- ciw   # 誤差範囲のデータ
d.error.x <- (0.2 + 1) * 1:length(datamean) - 1/2   # エラーバーを表示する位置(x座標)
barplot(datamean, names.arg=d.names, ylim=c(0,70), main="mean and 95%CI error bar")
arrows(d.error.x, datamean, d.error.x, datamean + d.error, angle=90)
arrows(d.error.x, datamean, d.error.x, datamean - d.error, angle=90)


95%CIのエラーバーが重ならないので、統計学的に差がある、ということになる。
 
論文でよくエラーバーが付いているが、あれはなんだ?
標準偏差(SD)をくっつけていることがある。これはデータ観測点の散らばりなので、重なっている/いないが何か結論をもたらしてくれるわけではない。
 
標本平均の標準誤差(SEM)をくっつけていることがある。これは標準偏差を標本数で割るため、標準偏差より幅は小さくなる。このため、もしエラーバーが重なるなら、p値はかなり大きい。
重ならない場合は、結論はよくわからない。

par(mfrow=c(1, 3))
# 95%信頼区間
datamean <- sapply(list(old, young), mean)
stdev <- sqrt(unlist(lapply(list(old, young), var)))
n     <- unlist(lapply(list(old, young), length))
ciw   <- qt(0.975, n) * stdev / sqrt(n)
d.error    <- ciw   # 誤差範囲のデータ
d.error.x <- (0.2 + 1) * 1:length(datamean) - 1/2   # エラーバーを表示する位置(x座標)
barplot(datamean, names.arg=d.names, ylim=c(0,70), main="mean and 95%CI error bar")
arrows(d.error.x, datamean, d.error.x, datamean + d.error, angle=90)
arrows(d.error.x, datamean, d.error.x, datamean - d.error, angle=90)

# SD
d.names   <- c("old", "young")
d.error   <- datasd   # 誤差範囲のデータ
d.error.x <- (0.2 + 1) * 1:length(datamean) - 1/2   # エラーバーを表示する位置(x座標)
barplot(datamean, names.arg=d.names, ylim=c(0,70), main="mean and sd error bar")
arrows(d.error.x, datamean, d.error.x, datamean + d.error, angle=90)
arrows(d.error.x, datamean, d.error.x, datamean - d.error, angle=90)

# SEM
datasem   <- unlist(lapply(list(old, young), sd))/unlist(lapply(list(old, young), length))
d.names   <- c("old", "young")
d.error   <- datasem   # 誤差範囲のデータ
d.error.x <- (0.2 + 1) * 1:length(datamean) - 1/2   # エラーバーを表示する位置(x座標)
barplot(datamean, names.arg=d.names, ylim=c(0,70), main="mean and sem error bar")
arrows(d.error.x, datamean, d.error.x, datamean + d.error, angle=90)
arrows(d.error.x, datamean, d.error.x, datamean - d.error, angle=90)

 
エラーバーの話について、このような記事を教えて頂きました。
研究者の多くはエラーバーの意味をろくに理解していない