0. はじめに
p 値が<0.1%のときは***
、<1%のときは**
、、、などと有意性を記号で表している例を論文等でよく見かけますよね。ただ、前回で取り上げたようなt 検定では結果はp-value
として表示されるだけで、記号は振ってくれませんでした。
例:
> 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構文を使ってみる
今回の目標は有意性の記号を自動で出力させることなんですが、どの程度の有意性をどの記号であらわすかというのは、実は決まりがあるわけではありません。分野や雑誌によってそれぞれの慣習に従うことが多いようです。
この記事では、とりあえず以下のように記号を振っていくこととします。
本記事での有意性と記号の対応
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を代入しておきます。
> P <- 0.0001
if構文ではまず、ifの後ろに()
をつけて、()
内に条件を指定します。ここではPが0.001より小さいと記述します。
> if(P < 0.001)
続いて、()
の後ろに{}
をつけ、()
内の条件が真であった場合に実行する処理を、{}
内に記述します。p 値が0.001より小さいときは***
を出力したいので、
文字列を出力する関数print()
を使います。文字列なのでダブルクォーテーション" "
でくくって引数に指定すると、***
を出力してくれます!(文字列ってなんだっけ?という方は第1回へ!)
> if(P < 0.001){print("***")}
続いて、()
内の条件が偽であった場合に実行する処理を記述します。このためには、else{}
を付け加え、偽の場合の処理内容を{}
に記述します。
> if(P < 0.001){print("***")}else{print("その他の記号")}
ここまでできたら、変数Pにいろいろな数字を代入しながら実行してみましょう!
> 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行目:偽のときの処理
と読みやすくもなります。
> 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です。
> P <- 0.005
> if(P < 0.001){
+ print("***")
+ }else{
+ if(P < 0.01){
+ print("**")
+ }else{
+ print("その他の記号")
+ }
+ }
[1] "**"
あとは、これをひたすら繰り返します。
> 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回で扱ったように、これを自作関数として定義してもよいでしょう。
とりあえず関数名はSig_Symboles()
としました。これで()
内に数字を入れるとそれに応じた有意性の記号を出力してくれます。
また、こちらの記事様では、このような長いコードの改良について述べられているので興味のある方はぜひご覧ください。
> 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()
に入れたいのですが、どうやったら取り出せるでしょうか。
> 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
を簡単に取り出すことができます。
取り出せてしまえばあとは、自作関数に入れるだけです!
> 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でやる方が大変で、自分で見て記号を当てはめていった方が簡単と感じる人もいらっしゃるかなぁーとは思いつつ本記事をまとめてみました。