library(infer)の話
R Advent Calendar 2018の2日目の記事です。今回は、統計的仮説検定や区間推定といった統計的推測をtidyverse styleでコーディングできるinferパッケージについて紹介します。
# inferパッケージのインストールとロード
install.packages("infer") # インストール
library(infer) # ロード
1. 早速試してみよう
Rにデフォルトで入っているsleepというデータセットには、2種類の睡眠薬を同じ10名の患者に投与したときの睡眠時間の長さが記録されています。
# sleepデータセットの確認
head(x = sleep, n = 5) # sleepデータセットの頭5行を確認
・extra列:睡眠時間の長さ
・group列:睡眠薬の種類
・ID列:患者のID
投与された睡眠薬の種類によって睡眠時間の長さの母平均が異なる傾向にあるかを考えてみることにしましょう。これは対応のある母平均の差の検定とその区間推定の出番です。これまでは次のようにして検定のスクリプトを書いてきました。
# 対応のある母平均の差の検定・区間推定:statsパッケージ
t.test(formula = extra ~ group, data = sleep, paired = TRUE)
一方で、inferパッケージでは次のように記述します。
# 対応のある母平均の差の検定・区間推定:inferパッケージ
library(dplyr)
sleep %>%
mutate(group = factor(group)) %>% # group : "1" or "2"
t_test(formula = extra ~ group, order = c("1", "2"), paired = TRUE)
現在、inferパッケージではt_test関数以外にもchisq_test関数があり、同様に検定や推定を行うことが出来ます。なお、後で検定の結果を可視化するために、より異なる書き方を紹介します。
2. 比較
2.1 返り値の型:t.test関数の返り値はlistですが、t_test関数の返り値はtibbleで返ってきます。素晴らしいです。
2.2 order引数:なお、個人的にt_test関数に感じる魅力はorder引数です。例えば、性別に"M"と"F"という値があるとしましょう。これまでのt.test関数は、暗に性別=="F"の標本平均から性別=="M"の標本平均を引いた差を検定統計量や区間推定の計算に用いていました。これまではこの順序を変えるためにはfactorをいじっていたわけですが、これをorder引数によって陽に指定できるようになりました。個人的にはその方が自然に感じています。
是非、以下のデータで結果を比較してみてください。
# 例のためのデータフレーム
性別 <- c("M", "M", "M", "F", "F", "F")
身長 <- c(178, 172, 165, 170, 165, 158)
data <- data_frame(性別, 身長)
# t.test関数(statsパッケージ)
t.test(formula = 身長 ~ 性別, data = data)
# t_test関数(inferパッケージ)
data %>%
t_test(formula = 身長 ~ 性別, order = c("M", "F"))
3. 検定の可視化
例えば、先程のsleepデータセットへの対応のある母平均の差の検定について別の書き方を紹介して、検定の可視化を行ってみましょう。
# t_test関数を用いない別のやり方
res <-
sleep %>%
mutate(group = factor(group)) %>%
specify(formula = extra ~ group) %>%
calculate(stat = "t", order = c("1", "2"), paired = TRUE)
res
検定結果の可視化は
・visualize関数:calculate関数での計算結果を入力に帰無分布を描く。
・shade_p_value関数:p値を可視化する。
によって提供されています。これらの関数はggplot2ライクに用います。
# 帰無分布の可視化
viz <-
res %>%
visualize(method = "theoretical")
viz
# p値の計算
viz + shade_p_value(obs_stat = res, direction = "two_sided")
4. おわりに
これまで、inferパッケージを用いて対応のある母平均の差の検定について書かれたものを見たことが無かったので、今回の記事として書いてみました。既出だったらすみません。
inferパッケージはまだごく僅かな統計的仮説検定しかカバーしていませんが、まだまだ進化を遂げる余地のありそうな部分を多く感じていて、inferパッケージの発展を心から楽しみにしています。これからもinferパッケージの発展をウォッチして、微力ながら普及に貢献できればと思っています。
明日は@gigamoriさんの「xgboostのチューニングまわりの細かいこと」です。楽しみですね!ではみなさま、Enjoy!
サポートをいただいた場合、新たに記事を書く際に勉強する書籍や筆記用具などを買うお金に使おうと思いますm(_ _)m