生物系のためのR超入門 (11) 【if構文の使い方・有意性のアスタリスクを振る】

# 0. はじめに
*p* 値が<0.1%のときは`***`、<1%のときは`**`、、、などと有意性を記号で表している例を論文等でよく見かけますよね。ただ、[前回](https://qiita.com/Surku/items/36121c0d1dba84a5ceb7)で取り上げたような*t* 検定では結果は`p-value`として表示されるだけで、記号は振ってくれませんでした。

例：
```R
> A<-c(0.7, -1.6, -0.2, -1.2, -0.1, 2.4, 2.7, 0.8, 0.0, 2.0)
> B<-c(1.9, 0.8, 1.1, 0.1, -0.1, 4.4, 5.5, 1.6, 4.6, 3.4)

> t.test(A,B)

	Welch Two Sample t-test

data:  A and B
t = -2.2711, df = 16.466, p-value = 0.03688
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -3.4376978 -0.1223022
sample estimates:
mean of x mean of y 
     0.55      2.33 
```

まあ、自分で`p-value`を見てどの記号を当てはめるか判断できますが、量が多いと大変だったり、見間違えが怖かったりしますよね。今回は、if構文を使って有意性のアスタリスクを自動で振ることにチャレンジしましょう！

## 0-1. この記事の到達目標
- if構文を使いこなせるようになる。
- *t* 検定の結果からp-valueを取り出し、それに応じた有意性の記号を振る。

## 0-2. 初めて登場する関数・構文
- if(条件式){真のときの処理}else{偽のときの処理}
    - 条件に応じて処理内容を変えることができます。 
- print("文字列")
    - 文字列を出力します 


# 1. if構文を使ってみる

今回の目標は有意性の記号を自動で出力させることなんですが、どの程度の有意性をどの記号であらわすかというのは、実は決まりがあるわけではありません。分野や雑誌によってそれぞれの慣習に従うことが多いようです。
この記事では、とりあえず以下のように記号を振っていくこととします。

:::note
**本記事での有意性と記号の対応**
*p*< 0.001 :  `***`
*p*< 0.010 : `**`
*p*< 0.050 : `*`
*p*< 0.100 : `†`
*p*>=0.100：`N.S.`
:::

## 1-1. 1つのif構文を使ってみる
早速if構文を使ってみましょう。
まずは単純化のために、*p* 値が0.001より小さいときは`***`を出力し、0.001より大きいときは`その他の記号`と出力するプログラムを書いてみます。

とりあえず、変数Pを用意してこの中に*p* 値を代入することとします。
ここでは0.001より小さくなるように、0.0001を代入しておきます。

```R
> P <- 0.0001
```
if構文ではまず、ifの後ろに`()`をつけて、`()`内に条件を指定します。ここでは**Pが0.001より小さい**と記述します。

```R
> if(P < 0.001)
```
続いて、`()`の後ろに`{}`をつけ、`()`内の条件が**真**であった場合に実行する処理を、`{}`内に記述します。*p* 値が0.001より小さいときは`***`を出力したいので、
文字列を出力する関数`print()`を使います。**文字列**なのでダブルクォーテーション`" "`でくくって引数に指定すると、`***`を出力してくれます！（文字列ってなんだっけ？という方は[第1回](https://qiita.com/Surku/items/cec1002d6f6daf5c107c)へ！）
```R
> if(P < 0.001){print("***")}
```
続いて、`()`内の条件が**偽**であった場合に実行する処理を記述します。このためには、`else{}`を付け加え、偽の場合の処理内容を`{}`に記述します。
```R
> if(P < 0.001){print("***")}else{print("その他の記号")}
```
ここまでできたら、変数Pにいろいろな数字を代入しながら実行してみましょう！

```R
> P <- 0.0001
> if(P < 0.001){print("***")}else{print("その他の記号")}
[1] "***"

> P <- 0.1
> if(P < 0.001){print("***")}else{print("その他の記号")}
[1] "その他の記号"

```
意図したとおりに動いてくれているので、前述のようなif構文の書き方でも悪くはないのですが、下記のように改行することが後々のことを考えて望ましいです。
1行目：条件式
2行目：真のときの処理
4行目：偽のときの処理
と読みやすくもなります。

```R
> if(P < 0.001){
+   print("***")
+ }else{
+   print("その他の記号")
+ }
```

## 1-2. 複数のif構文を使ってみる
前項では`***`か`その他の記号`かの2つの選択肢しかありませんでしたが、if構文の中にif構文を組み入れることで、選択肢を増やすことができます。

次に、`**`も出力できるようにif構文を増やしてみましょう。
`**`は*p* 値が0.001よりも**大きく**かつ0.01より**小さい**ときの記号なので、`P < 0.001`の条件は**偽**です。したがって、偽のときの処理、2個めの`{}`内にさらに先ほどと同様のif構文を作ればOKです。

```R
> P <- 0.005
> if(P < 0.001){
+   print("***")
+ }else{
+     if(P < 0.01){
+       print("**")
+     }else{
+         print("その他の記号")
+     }
+   }
[1] "**"
```

あとは、これをひたすら繰り返します。

```R
> if(P < 0.001){
+   print("***")
+ }else{
+     if(P < 0.01){
+       print("**")
+     }else{
+         if(P < 0.05){
+           print("*")
+         }else{
+             if(P < 0.10){
+               print("†")
+             }else{
+                 print("N.S.")
+             }
+         }
+     }
+ }
```
こんな感じで、計4つのif構文を含んだ長いコードになってしまいました。
長くてみにくいので[第9回](https://qiita.com/Surku/items/8e572a979ad2af1c0848)で扱ったように、これを自作関数として定義してもよいでしょう。
とりあえず関数名は`Sig_Symboles()`としました。これで`()`内に数字を入れるとそれに応じた有意性の記号を出力してくれます。

また、[こちら](https://qiita.com/doikoji/items/37870503d7705a6dd546)の記事様では、このような長いコードの改良について述べられているので興味のある方はぜひご覧ください。

```R
> Sig_Symboles <- function(P){
+   if(P < 0.001){
+     print("***")
+   }else{
+     if(P < 0.01){
+       print("**")
+     }else{
+       if(P < 0.05){
+         print("*")
+       }else{
+         if(P < 0.10){
+           print("†")
+         }else{
+           print("N.S.")
+         }
+       }
+     }
+   }
+ }

> Sig_Symboles(0.03)
[1] "*"
> Sig_Symboles(0.07)
[1] "†"
> Sig_Symboles(0.20)
[1] "N.S."
```

# 2. *t* 検定の結果から有意性の記号を振る
今までは*p* 値を手入力していましたが、ここからは*t* 検定の結果から*p* 値を取り出して、それに応じた有意性の記号を出力させてみましょう。

ここで、冒頭でもお見せした*t* 検定の例を再びお見せします。
結果の真ん中あたりに、`p-value = 0.03688`というメッセージがあります。
この数値を取り出して、先ほど作った有意性の記号を出力してくれる`Sig_Symboles()`に入れたいのですが、どうやったら取り出せるでしょうか。
```R
> A<-c(0.7, -1.6, -0.2, -1.2, -0.1, 2.4, 2.7, 0.8, 0.0, 2.0)
> B<-c(1.9, 0.8, 1.1, 0.1, -0.1, 4.4, 5.5, 1.6, 4.6, 3.4)

> t.test(A,B)

	Welch Two Sample t-test

data:  A and B
t = -2.2711, df = 16.466, p-value = 0.03688
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -3.4376978 -0.1223022
sample estimates:
mean of x mean of y 
     0.55      2.33 
```

実は以下のように書くと、`p-value`を簡単に取り出すことができます。
取り出せてしまえばあとは、自作関数に入れるだけです！

```R
> A<-c(0.7, -1.6, -0.2, -1.2, -0.1, 2.4, 2.7, 0.8, 0.0, 2.0)
> B<-c(1.9, 0.8, 1.1, 0.1, -0.1, 4.4, 5.5, 1.6, 4.6, 3.4)

> t.test(A,B)[["p.value"]]
[1] 0.03688067
> Sig_Symboles(t.test(A,B)[["p.value"]])
[1] "*"

```

# 3. おわりに
今回は、人間が*p* 値を見てどの有意性の記号を当てはめるか判断できることを、Rを使ってやってみました。もしかしたら、if構文に慣れるまではRでやる方が大変で、自分で見て記号を当てはめていった方が簡単と感じる人もいらっしゃるかなぁーとは思いつつ本記事をまとめてみました。