2016/07/24

2020/05/04

Rでt検定行う方法とそのまま使える自作関数

R言語入門

ライター:

ここでは、Rでt検定を行う方法について解説していきます。t分布に従うと仮定して、ときには複雑な式を使って標準化する必要もあるt検定ですが、Rを使えば一瞬で出来てしまいます。

t検定には対応の無い検定としてスチューデントのt検定、ウェルチの検定、ウィルコクソン検定があります。そして対応のある検定もあり、いろいろな種類がありますが、全てR上で簡単なプログラムによって行うことが出来ます。

・t分布のグラフを描きたい方は、Rでt分布のグラフを描く方法【dt()の使い方】を参考にしてください。
・t検定の理論的な内容については、t検定とは?種類と手順を解説!でまとめています。

※R言語入門のトップページはこちら

一標本の母平均のt検定

まず、一標本の母平均の検定のプログラムは次のようになります。

プログラム

#検定に使うリストの生成
change <- c(1.1,-1,-1.5,-8.5,0.9,1.2,5.9,-5.4,-7.3,-2.3)

t.test(change, mu=0) #両側検定
t.test(change, mu=0, alternative=”greater”) #片側検定(上側)
t.test(change, mu=0, alternative=”less”) #片側検定(下側)

関数t.test()の引数として、検定に使うリストと、帰無仮説(mu=任意の母平均値)を渡します。また、特に何も指定しない場合は、両側検定になり、片側検定がやりたい場合は、alternative=”greater”かalternative=”less”をオプションに設定しましょう!

対応の無い二標本のt検定

次に対応の無い検定についてです。今回解析に使う2群のベクトルデータa,bを用意ます。これらが正規分布に従うと仮定してt検定を行っていきます。

プログラム
a <- c(10,12,9,15,8,2)
b <- c(20,18,14,23,16)

等分散仮定、sudentのt検定

二つの標本データの母分散が等しいと仮定した検定を、行っていきましょう。ここで使う関数は”t.test()”であり、引数には検定に使いたい二つのベクトルと、オプションで”var=T”(TRUEでも可)を指定して、等分散仮定を行います。

プログラム

t.ans1 <- t.test(a,b,var=T)
t.ans1

Two Sample t-testdata: a and b
t = -3.659, df = 9, p-value = 0.005244
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-14.348420 -3.384914
sample estimates:
mean of x mean of y
9.333333 18.200000

結果から、t値が-3.659であり、p値が0.005244なので、有意水準が1%でも5%でも有意差が認められ、

\(H_0:\)二つのデータの母集団の母平均は等しい

という帰無仮説は棄却されます。

不等分散仮定、ウェルチの検定

ウェルチの検定では不等分散仮定の上でt検定を行います。なのでstudentとの違いはオプションで”var=F”(FALSEでも可)を指定することです。関数は同じく”t.test()”を使います。

プログラム

t.ans2 <- t.test(a,b,var=F)
t.ans2

Welch Two Sample t-testdata: a and b
t = -3.7409, df = 8.9963, p-value = 0.004622
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-14.228736 -3.504597
sample estimates:
mean of x mean of y
9.333333 18.200000

結果から、t値が -3.7409であり、p値が00.004622なので、有意水準が5%でも1%でも有意差が認められ、今回も

\(H_0:\)二つのデータの母集団の母平均は等しい

という帰無仮説は棄却されます。

ノンパラメトリック、ウィルコクソン検定

ウィルコクソン検定では関数”wilcox.test()”を使います。引数に検定に使いたい二つのベクトルをとります。

プログラム

t.ans3 <- wilcox.test(a,b)
t.ans3

Wilcoxon rank sum testdata: a and b
W = 1, p-value = 0.008658
alternative hypothesis: true location shift is not equal to 0

これまた、有意差が認められる結果となりました。

p値のみを抽出したい場合

ここでp値3種類の結果のp値のみを抽出したい場合は、

”結果の変数$p.value”

と書きます。すると以下のようになります。

プログラム
t.ans1$p.value
[1] 0.005243572
t.ans2$p.value
[1] 0.004622328
t.ans3$p.value
[1] 0.008658009

対応のある二標本のt検定

まずは今回の検定用のベクトルc,dを作成します。

プログラム
c <- c(10,11,6,3,19,14)
d <- c(16,15,8,4,21,12)

対応のある通常のt検定

通常のt検定は”t.test()”で行います。この際対応があるのでオプションとして”paired=T”(TRUEでも可)を指定します。

プログラム

t.ans1 <- t.test(c,d,paired=T)
t.ans1Paired t-testdata: c and d

t = -1.9554, df = 5, p-value = 0.1079
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-5.015003 0.681670
sample estimates:
mean of the differences
-2.166667

ウィルコクソン検定

ウィルコクソンの場合は”wilcox.test()”を用い、先ほどと同様にやはり”paired=T”をオプションで指定します。

プログラム
t.ans2 <- wilcox.test(c,d,paired=T)
t.ans2
Wilcoxon signed rank test with continuity correctiondata: c and d
V = 3, p-value = 0.1378
alternative hypothesis: true location shift is not equal to 0

3種のt検定を行なって結果を出力する自作関数

今回の記事で紹介した3種のt検定を行なって、結果を出力を行う自作関数を作ったのでお役立てください。引数は、

t_fun(ベクトル1,ベクトル2,出力ファイル名,検定に使うものの名前)

として使います。

プログラム

t_fun <- function(da1,da2,fn,name){
ans1 <- t.test(da1,da2,var=T)
ans2 <- t.test(da1,da2,var=F)
ans3 <- wilcox.test(da1,da2)
ave1 = ave(da1)[1]
sd1 = sd(da1)
ave2 = ave(da2)[1]
sd2 = sd(da2)
dif = abs(ave1ave2)
result <- c(name,ave1,sd1,ave2,sd2,dif,ans1$statistic,ans1$p.value,ans2$statistic,ans2$p.value,ans3$statistic,ans3$p.value)
names(result) = c(“m/z名”,“平均1”,“標準誤差1”,“平均2”,“標準誤差2”,“平均の差”,“等分散t”,“等分散p”,“不等分散t”,“不等分散p”,“ウィルコクソンW”,“ウィルコクソンp”)
write.table(t(result),fn,append=T,quote=F,sep=“,”,row.names=F,col.names=T,fileEncoding=“CP932”)
write.table(“”,fn,append=T,quote=F,sep=“,”,row.names=F,col.names=F,fileEncoding=“CP932”)
}

 

※R言語入門のトップページはこちら

(totalcount 49,430 回, dailycount 84回 , overallcount 16,630,867 回)

ライター:

R言語入門

single-banner

COMMENT

コメントを残す

メールアドレスが公開されることはありません。
*は必須項目です。




CAPTCHA