ひゃまだのblog

ひゃまだ(id:hymd3a)の趣味のブログ

Rのスクリプトで等分散の検定をしてからT検定をする

(2023-12-05 初稿 - 2023-12-14 修正)

はじめに

先日、T検定を行わなければならなくなり、少し調べたら、等分散の検定をしてからT検定を行うのが良いらしいとのこと。

筆者の頭ではすぐに忘れてしまいそうなので、今後のためにRのスクリプトを作ることにしたので、メモを残す。

テストデータ

まずは、テストするデータ。

id Value Method
1 0.6527 M1
2 0.7222 M1
3 0.6250 M1
4 0.7361 M1
5 0.7361 M1
6 0.6666 M1
7 0.7870 M2
8 0.7893 M2
9 0.7893 M2
10 0.7731 M2
11 0.7754 M2
12 0.7500 M2

 

データの対応がある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%水準で有意差ありだね。

いろいろなデータで試してみてね。

関連ページ