見出し画像

【統計の勉強】多群比較の手順④〜検定手順をif文に起こす

【追記:2020年5月29日】コントロールの有無のところを今後の流れも含めて検討し直しています。

こんにちは。実験データを自分で解析できるようになりたい!と思って統計プログラミング言語であるRを勉強している、生命科学系研究者のえいこです。

最近は多群比較について勉強しています。

今回は、多群比較の勉強の第四回目。前回書いたフローチャートを元にif文を書いてみようと思います。

多群比較の手順の勉強をして、私が自己判断で書いたフローチャートはこちら。

画像1

これを元にif文を作っていきます。

前回の記事で、データの正規性を確かめているのでその後からコードを書いていきます。

Shapiro-wilk検定のp値によってif分岐をする

Shapiro-wilk検定の帰無仮説は「正規性に従う」なので、有意水準を0.05とした場合、p値が0.05を下回ると帰無仮説は棄却されて「正規分布ではない」という判断をします。

Shapiro-wilk検定のp値の取り出して、if文を書いていくのは2群検定でもやっているので、これを参考にして書いていきます。

3群比較なのでpの値が3つ出てきますが、同じです。

1つでもpの値が0.05よりも小さい場合は「ノンパラメトリック検定」に行くようにif文を作ります。

if (shapiro[["control"]][["p.value"]]<0.05
   |shapiro[["A"]][["p.value"]]<0.05
   |shapiro[["B"]][["p.value"]]<0.05){
 #non parametric
 print("non parametric")
 print("Kraskal wallis")
 } else {
 #parametric
   print("parametric")
   print("Levene test") #分散の検定
 }

という感じで、最初はif文の中に検定方法を直接入れるのではなく、どんな検定をしていくのかを”print()”関数を使って出力して行くようにしています。

これで、第一層目のif分岐が完成しました!

だけど、少しだけ第二層目の準備も書いてあるのです。

ノンパラメトリックの場合は、「Kruskal wallis 検定」で中央値に差があるかどうか検定していきます。

パラメトリック検定の場合は、「Levene 検定」を使って等分散性の確認をしていきます。

Levene検定の結果からさらにif分岐をする

ノンパラメトリックの「Kruskal wallis 検定」はいずれにしてもやることになるので置いておきます。

パラメトリック検定の場合、「Levene 検定」で等分散性を確認できなかった場合は「Welchのt検定をBonferroni補正する」という手順に進んでいきます。

では、Rで「Levene 検定」ってどうすれば良いのでしょう?

上のサイトを参考にして、「Levene 検定」をしていきます。ここでは、2種類のパッケージを使って「Levene 検定」をしていますが、ほかのサイトなどを見ると”car”パッケージを使っている人の方が多そうなので、”car”を使うことにしました。

まずは、パッケージをインストールして”car”を呼び出します。

install.packages("car")
library(car)

で、「Levene 検定」するための関数は、“leveneTest()”(center=meanを忘れずに!)

levene<-leveneTest(data$value~data$group, center=mean)
levene

として実行すると...

画像2

leveneTestの結果はdata.frameの形で保存されていて、pの値は1行目の3列目にあることがわかります。このpの値を取り出すのは、こんなコードを書いておけば良いのです。

dpval<-levene[1,3]

“dpval”という変数の中に、leveneTestのpの値が入るようになりました。

“dpval”の値が有意水準よりも、大きいか小さいかでif分岐していけばOKです。

で、書いたコードがこちら

if(dpval<0.05){
     print("Dunnett")
     print("Tukey-Kramer")
     }
   } else {
     print("Bonferroni")
   }

最後に、比較対象群の有無で検定を分けていきたいと思います。

比較対照群の有無でif文を分岐する

ノンパラメトリック検定の場合、比較対照があればSteel、比較対照群がなければSteel-Dwassを採用しようと思っています。

パラメトリック検定の場合、比較対照があればDunnett、比較対照群がなければTukey-Kramerを採用することにします。

【2020年5月29日 追記】
コントロールの有無に関しては、こちらの記事でコントロール有無をif文分岐で検索しているので、こちらの値を使うことにします。

controlの有無を手動で宣言しなくても良いコードに変更しています!

ただ、コントロール有無で検定方法を分岐するのは必要。

まずは、比較対照群(control)があるかどうかをまず宣言しておきます。

#with control or not?#
control <- 1 #in case of w/o control, write "0"

比較対照がある場合は、1、ない場合は0と書くようにしておきます。

で、どうやってif分岐すると...

パラメトリック検定の場合は、

  if(contro==1){
   print("steel")
 } else if (control==0){
   print("Steel-Dwass")
 }

ノンパラメトリック検定の場合は、

 if(control==1){
   print("Dunnett")
   } else if (control==0) {
   print("Tukey-Kramer")
   }

このコードを該当する場所に書いておきます。

完成したコードで、作ったデータを使ってif文を回してみます。

すると...

画像3

と出力されました。

次回は、それぞれの検定に関数を調べて今回作ったif文に入れていこうと思います。

それでは、また!

いいなと思ったら応援しよう!

eiko_programming
最後までお読みいただきありがとうございます。よろしければ「スキ」していただけると嬉しいです。 いただいたサポートはNGS解析をするための個人用Macを買うのに使いたいと思います。これからもRの勉強過程やワーママ研究者目線のリアルな現実を発信していきます。