(2023-12-05 初稿 - 2023-12-14 修正)
はじめに
先日、T検定を行わなければならなくなり、少し調べたら、等分散の検定をしてからT検定を行うのが良いらしいとのこと。
筆者の頭ではすぐに忘れてしまいそうなので、今後のためにRのスクリプトを作ることにしたので、メモを残す。
テストデータ
まずは、テストするデータ。
データの対応があるT検定
最初は、データ対応ありだと、等分散の検定をしなくて良くてシンプルだから、データの対応のあるT検定をやってみる。
データ対応ありとは、ある人に薬を投与する前と後のデータなど、データが対をなしている場合。
早速、t-test-pair.RというRscriptを作って、検定してみる。
#[Usage]
# $ Rscript t-test-pair.R data-file.csv
args <- commandArgs(trailingOnly=T)
data <- read.table(args[1], sep=",", header=T)
attach(data)
# 対応あるt検定
res <- t.test(Value ~ Method, data, paired=TRUE)
res
上記スクリプトを実行すると、以下のような結果に。 t.testの引数で、paired=TRUEになっているところがミソだね。
$ Rscript t-test-pair.R t-test.csv
Paired t-test
data: Value by Method
t = -4.1441, df = 5, p-value = 0.008961
alternative hypothesis: true mean difference is not equal to 0
95 percent confidence interval:
-0.14188429 -0.03324904
sample estimates:
mean difference
-0.08756667
この結果は、p-valueが0.01を下回っているから、1%水準で有意差あり。
等分散の検定をしてからT検定をする
ようやく、本題の等分散の検定を行ってからT検定を行うスクリプトを作成するよ。
読み込んだcsvファイルから、変数M1とM2にそれぞれの値をベクトルとして代入する。
var.testが等分散のテストで、やはり p-valueが0.05を下回っていれば、等分散が等しいという仮設が棄却されて、Weltchの検定を行う。
0.05以上であれば、等分散であるT検定を行うよ。
### t-test.R
#[Usage]
# $ Rscript t-test.R data-file.csv
args <lt;- commandArgs(trailingOnly=T)
data <lt;- read.table(args[1], sep=",", header=T)
attach(data)
# select vector
M1 = data[ data$Method=="M1", "Value"]
#M1
M2 = data[ data$Method=="M2", "Value"]
#M2
rslt_vartest <lt;- var.test(M1,M2)
rslt_vartest
#names(rslt_vartest)
p_vartest <lt;- rslt_vartest$p.value
#p_vartest
if ( p_vartest <lt; 0.05 ) {
# 等分散でない Welch
res <lt;- t.test(Value ~ Method, data)
} else {
# 等分散
res <lt;- t.test(Value ~ Method, data, var.equal=TRUE)
}
res
読み込んだcsvファイルをベクトルに変換するのに、少し苦労したけど、後はそれほど難しくないよね。
実際に実行してみると、以下のようになる。
$ Rscript t-test.R t-test.csv
F test to compare two variances
data: M1 and M2
F = 9.9692, num df = 5, denom df = 5, p-value = 0.02465
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
1.395006 71.244056
sample estimates:
ratio of variances
9.969248
Welch Two Sample t-test
data: Value by Method
t = -4.2729, df = 5.9931, p-value = 0.00526
alternative hypothesis: true difference in means between group M1 and group M2 is not equal to 0
95 percent confidence interval:
-0.13772634 -0.03740699
sample estimates:
mean in group M1 mean in group M2
0.6897833 0.7773500
結果は、やはり1%水準で有意差ありだね。
いろいろなデータで試してみてね。