タグ:検定

第4章は統計を扱います。


今回も「シロート統計学」のハルさんとコラボレーションすることとなりました。


シロート統計学はEZRを使った統計分析をわかりやすく解説されています。


 


第4章はシロート統計学で使われていたEZRをRで行うとどうなるのか?といった視点で進めていきます。


今回使うデータもハルさんのサイトと同じものを使わせでいただく事になりました。それぞれ見比べることで参考にしてみてください!


まずはハルさんのサイトをご覧ください。
ここで行っている解析をRで実施する方法を紹介します。


1.データの準備

今回は前回のデータを使います。記事の1~4までをご準備ください。


もし前回の記事を見るなんて面倒くさい!という方は以下のコードを実行してください。
(このコードはデータの保存場所が今までのの記事と違います)

#データのダウンロード
url <- "https://haru-reha.com/wp-content/uploads/2018/05/demo-repeated-measures-anova.xlsx"
destfile <- "demo-repeated-measures-anova.xlsx" #今まで第4章の記事を読まれて実践されてる方は destfile <- "data/demo-repeated-measures-anova.xlsx"
download.file(url, destfile) #データの読み込み library(readxl) grip_rep_anova <- read_excel("data/demo-repeated-measures-anova.xlsx", range = "B2:E32") View(grip_rep_anova)

スクリーンショット 2019-11-25 22.48.23
前回は
ある運動プログラムを行い、0週目・1週目・2週目で握力を測定した、ということを想定した仮想データとなっています。今回は握力の経時的検討に加えて男女の群分けも行います。

2.被験者間要因と被験者内要因と分散分析のデザインについて
分散分析を行う上で大切なのがvについてです。
スクリーンショット 2019-11-24 6.33.40
被験者間要因はいわゆる対応のないデータのことで被験者全体をA法、B法の2つに割り振るといった方法です。なので同じ人がA法とB法を行うことはありません。
被験者内要因はいわゆる対応のあるデータのことで同じ人が繰り返し測定します

そして被験者間要因は列の左側に、被験者内要因は列の右側に並べると後々分析しやすくなります。
また被験者間要因は縦に、被験者内要因は横につなげるとEZRで分析を行うには都合がいいです。

仮に下のデータがあったとします。
スクリーンショット 2019-11-24 6.35.12
この並びが分散分析を行う上での基本的な形になります。

要因が3つ(sex, treatment, 繰り返し)あるのでABC
被験者間要因と被験者内要因の間にsを付ける

上記の場合はABsCデザインと言います。
また被験者間要因と被験者内要因が両方あるデザインを混合計画とも呼んだりします。


今回は以下のようになります。

被験者間要因:sex(A
被験者内要因:W0,W1,W2の繰り返し(B


今回のExcelではsexの列が1番右にありますが被験者間要因を左、被験者内要因を右に書くのが習わしのようなのでAsBデザインということになります。

被験者内要因(改善の傾向)に性別が影響しているかどうかを見たいということになります。

3.反復測定分散分析(repeated measures ANOVA)を行う

前回の記事で正規分布の確認を行いましたので、早速反復測定分散分析を行います。

反復測定分散分析を行うには主に2つの方法があります。

1.carパッケージのAnova関数を使う(EZRもcarパッケージを使ってる)
2.ANOVA君を使う

ANOVA君は井関龍太さんが作成した分散分析に特化したスクリプトです。
使い方に特徴がありますが使えるようになると慣れると簡単でどの方法よりも詳細に分析できます。

ここではまず1の方法を紹介します。

反復測定分散分析を行うには次の方法になります。




①carパッケージを読み込む
ここは前回の記事と全く同じです。
まずはcarパッケージを読み込みます。
carパッケージはEZRをインストールする時に一緒にインストールされています。
もしインストールしていなければ先にインストールします。

install.packages("car")


その後library関数で呼び出します。

library(car)


②被験者要因を指定するdata.frameを準備する
ここは前回の内容と全く同じです。
今回のデータではsexの列は「MとFの2つのデータがある」とパソコンは読み取れますがW0,W1,W2はwideデータとなっているため「この3列が繰り返しのデータである」ことがパソコンは読み取れません。それがわかるためのものを2つ作ります。

まず繰り返しの順番がわかるtimeというベクトルを作ります。
このデータはfactor型である必要があるためfactor関数を使います。
そしてtimeのデータをdata.frame型に変更したidataを作ります。

 スクリーンショット 2019-11-24 10.11.33
そして大事なのがlevels = です。levels = を指定しないとfacorは五十音順になります。
今回は問題ないのですがもしpre,mid,postのように列名を付けるとlevels = を使わないとmid→post→preの順番になってしまいます。
factor関数に関しては【1-10】Rでよく使われる型について説明します。
 

③lm関数でモデルを作る
スクリーンショット 2019-11-25 23.38.40
次に分析するためのモデルを作ります。ここが前回の記事と唯一違うところです。

モデルはlm関数を使います。model(名前は何でもいい)という変数名に結果を入れます。

被験者内要因は3列になっているのでcbind関数でつなげます。
被験者間要因は~の右に入れます。もし被験者間要因が複数あれば * でつなぎます(交互作用を見たい場合)。もし交互作用を見ない場合は + でつなぎます。

そして必ず大切なのがcontrasts = の箇所です。
数学的には反復測定分散分析はタイプⅢ平方和というものを計算します。
詳しい話は井関龍太さんの記事にありますが、contrasts = を設定しないと正しいタイプⅢ平方和を計算してくれないため、この設定が必要となります。
使い方はcontrasts = list(〇 = contr.sum, △ = contr.sum, □ = contr.sum)のようにlist内で指定します。


④Anova関数で分散分析を実行する
スクリーンショット 2019-11-25 23.40.16
ここは前回の記事と全く同じです。
反復測定分散分析を行う時はcarパッケージのAnova関数を使います。Aは必ず大文字です。
res(resultの略、何でも良い)という変数名に結果を入れます。

Anova(lm関数で作ったモデル, idata = ◯◯, idesign = ~ ◯◯, type = "Ⅲ")

lm関数で作ったモデル:先程作ったmodel
idata:先程つくったidata
idesign:先程作ったtime(timeの前に を付けます)
type:"Ⅲ"または3とする(反復測定分散分析の場合は必ずⅢ)

スクリーンショット 2019-11-24 12.08.02

⑤summary関数で結果を表示する

summary(Anova関数の結果, multivariate = FALSE)

multivariate = FALSEと入れるとEZRと同じ結果が表示されます。

①〜⑤をまとめると以下になります

library(car)
time <- factor(c("W0", "W1", "W2"), levels = c("W0","W1", "W2"))
idata <- as.data.frame(time)
model <- lm(cbind(W0,W1,W2) ~ sex, 
            data = grip_rep_anova, 
            contrasts = list(sex = contr.sum))
res <- Anova(model, idata = idata, idesign = ~time, type = 3)
summary(res, multivariate = FALSE)


行が長くて大変ですが実は色の部分以外はコピペ可能です。
(被験者間要因があればまた変わります。次回記事で紹介します)
スクリーンショット 2019-11-25 23.51.29

結果はまずMauchlyの球面仮定を確認し、有意差がなければ上、あれば下をチェックします。

sex→握力は性別により変化する
time→握力は時間経過により変化する
sex:time→交互作用(時間経過に伴う握力の改善の程度は男女で異なるか)

スクリーンショット 2019-11-26 0.16.54
結果はEZRと同じになりました。

4.まとめ
今回は2要因以上ある反復測定分散分析を行いました。
前回の記事との違いは被験者間要因があるかどうかでした。
被験者間要因があるとcontrasts = 設定が必要になりますので注意が必要です。

そして前回・今回はEZRと同じ方法のcarパッケージのAnova関数を使いました。
ただどうしてもコードが長くなってしまいます。
ただRにはのANOVA君という分散分析に特化した非常に有名なスクリプトがあります。


次回はANOVA君を使った分散分析を紹介します。

5.今回使ったコード


#データのダウンロード
url <- "https://haru-reha.com/wp-content/uploads/2018/05/demo-repeated-measures-anova.xlsx"
destfile <- "demo-repeated-measures-anova.xlsx" #今まで第4章の記事を読まれて実践されてる方は destfile <- "data/demo-repeated-measures-anova.xlsx"
download.file(url, destfile) #データの読み込み library(readxl) grip_rep_anova <- read_excel("data/demo-repeated-measures-anova.xlsx", range = "B2:E32") View(grip_rep_anova)

#sexの列もいれた反復測定分散分析 library(car) time <- factor(c("W0", "W1", "W2"), levels = c("W0","W1", "W2")) idata <- as.data.frame(time) model <- lm(cbind(W0,W1,W2) ~ sex, data = grip_rep_anova, contrasts = list(sex = contr.sum)) res <- Anova(model, idata = idata, idesign = ~time, type = 3) summary(res, multivariate = FALSE)





第4章は統計を扱います。


今回も「シロート統計学」のハルさんとコラボレーションすることとなりました。


シロート統計学はEZRを使った統計分析をわかりやすく解説されています。


 


第4章はシロート統計学で使われていたEZRをRで行うとどうなるのか?といった視点で進めていきます。


今回使うデータもハルさんのサイトと同じものを使わせでいただく事になりました。それぞれ見比べることで参考にしてみてください!


今回はMcNemar検定を紹介します



まずMcNemar検定についてはハルさんのサイトをご参照ください。



また1.準備〜4.データの読み込みまでは【4-1】Rでt検定を行う方法と全く同じ流れになります。
もし1〜4まででわからない部分があれば確認してみてください。

 

1.準備

第4章は毎回ExcelデータをダウンロードしてRを使うのでプロジェクトで管理して行うことを勧めています。

 

ここではR練習というプロジェクトを作り、Excelファイルを入れるためのdataフォルダを作っています。
これを前提に次から進めていきます。
スクリーンショット 2019-10-20 7.54.14


2.スクリプトファイルの作成

次にRのコードを書くためのスクリプトファイルを作ります。
スクリーンショット 2019-11-08 14.29.27




3.データのダウンロード

今回もハルさんのサイトのデータを使わせていただきます。

デモデータ(McNemar検定)

この章ではRを使ってダウンロードしています。


download.file(url = “ファイルのURL”,
        destfile = “保存したい場所/ファイル名”)
urlはデモデータで右クリック → リンクのアドレスをコピー
destfileは保存場所と保存のファイル名を指定します。


実際のコードは以下になります。
前回のコードのURL(" "の中)とdestfileのdata/以降を変更するだけでOKです。
#データのダウンロード
url <- "https://haru-reha.com/wp-content/uploads/2018/04/demo-mcnemar-test.xlsx"
destfile = "data/demo-mcnemar-test.xlsx"

download.file(url, destfile)

スクリーンショット 2019-11-05 11.18.20


dataフォルダにダウンロードできたことを確認します。




4.データの読み込み

データを読み込みます。
今回は【4-0】第4章を進めていく上での準備で行った方法で進めます。

View Fileでデータを確認します。

スクリーンショット 2019-11-07 23.37.11


データが入っているセルを確認します。
B2からC22までデータが入っています(B2:C22と表記)
スクリーンショット 2019-11-07 23.39.39




次にImport Datasetでデータを取り込みます。
スクリーンショット 2019-11-07 23.37.11



Import画面ではName, Sheet,Rangeを指定します。

Name:ハルさんのサイトではBWでしたがbwとします(大文字・小文字は別物とされます)
Sheet:このExcelは1つしかデータがないのでDefaultのままでOK
Range:先ほど確認したB2:C22

スクリーンショット 2019-11-07 23.40.57



Importボタンを押す前に右にあるコードをコピーしスクリプトファイルに貼り付けることも忘れずに行います。
library(readxl)
bw <- read_excel("data/demo-mcnemar-test.xlsx", 
                 range = "B2:C22")
View(bw)

データが正しく入っていることを確認します。
スクリーンショット 2019-11-07 23.41.15



これでデータの取り込みは完成です。


5.データテーブルの作成

Fisherの正確検定と同様にまずはデータテーブルを作成してみます。
データテーブルを作成するのはtable関数でした。
table(bw$Before, bw$After)
スクリーンショット 2019-11-08 6.14.43

これでデータテーブルができました。後で使うのでtable_bwという名前を付けておきます。
(必須ではありません)
table_bw <- table(bw$Before, bw$After)

6.McNemar検定を行う

次にMcNemar検定を行います。McNemar検定はmcnemar.test関数をを使います。

ncnemar.test関数は2つの記述方法があります。

①集計前の表(Excelの形式)を使う
今回のExcelの形でmcnemar.test関数を使う事ができます。

mcnemar.test(1列目, 2列目)
mcnemar.test(bw$Before, bw$After)

②集計後の表(テーブル形式)を使う
先程のテーブル形式(table_bw)をそのまま使うこともできます。
他にも既にExcelで集計してしまった場合です。

mcnemar.test(tableデータ)
mcnemar.test(table_bw)
スクリーンショット 2019-11-08 12.39.55

どちらもEZRと同じ結果になります。


7.まとめ

今回はRでMcNemar検定を行う方法を紹介しました。
Fisherの正確検定、カイ二乗検定、McNemar検定は似た使い方ですので続けて記事を見られた方は行いやすかったかもしれません。

またこのページの最後に連続補正について紹介しています。

次回は分散分析に移ります。



8.今回のコード
#データのダウンロード
url <- "https://haru-reha.com/wp-content/uploads/2018/04/demo-mcnemar-test.xlsx"
destfile = "data/demo-mcnemar-test.xlsx"

download.file(url, destfile)

library(readxl)
bw <- read_excel("data/demo-mcnemar-test.xlsx", 
                 range = "B2:C22")
View(bw)

#テーブルの作成
table_bw <- table(bw$Before, bw$After)
table_bw

#McNemar検定
mcnemar.test(bw$Before, bw$After)

mcnemar.test(table_bw)

9.(追記)連続修正による正規近似
McNemar検定はカイ二乗検定を元に近似値を求めています。


mcnemar.test関数はデフォルトで連続修正を用いた正規近似を用いています。
もし連続修正を用いない場合はcorrect = FALSEを付ける必要があります。
mcnemar.test(bw$Before, bw$After, correct = FALSE)

サイトによって連続補正を付けるか付けないか意見はあるようです。

連続補正あり(厳しめな検定、第1種の過誤を生みやすい)
直接検定
連続補正なし(甘めな検定、第1種の過誤が減る)


総じて言うと上記の傾向のようですが、気になる方は下記をご参照ください。



こちらでは連続補正を施したほうが近似値が良くなるとありました。
この近似はかなり正確なことと、p値がだいたい0.01くらいまでは連続修正を施した方が近似が良くなることがわかると思います。 そのためウィルコクソンの1標本検定と違って、通常はzoの値によらず全て連続修正を施します。


Rコマンダーのサイトでは理由は書いてありませんでしたが、correct = FALSEと言っています。
mcnemar.test(.Table, correct=FALSE)を追記して下さい。

マ ッ チドペ アにおける 2 × 2表の検定の第 1種の 過誤 ... - J-Stage


https://www.jstage.jst.go.jp › article › jscswabun › _pdf › -char

こちらの記事では連続補正をすると第1種の過誤が生まれやすいので無条件に使うには連続補正を行わないほうが良いといった記載がありありました。



こちらの記事ではnデータ数によって連続補正あり・なしを指定しています。



また、もともとはパソコンの性能上厳密な検定ができずカイ二乗検定をつかって近似値を求めていたようですが、二項検定やパッケージを使ってp値を厳密に計算することもできるようです。それに関しては奥村先生の記事をご参照ください。






第4章では統計の中でも検定を扱っています。

ここまでいろいろな検定を行ってきましたが、グラフを作る時はどうするでしょうか?

【4-6】Rのt検定の結果からp値や信頼区間の数値を取り出す方法では検定した結果を取り出す方法を紹介しました。

今回は取り出したデータで95%信頼区間のグラフを作る方法を紹介します。

データとt検定のコードは以下になります。
前回の記事でこのコードの解説をしていますのでわからない場合は先に確認をお願いします。


set.seed(2019)
male <- rnorm(50, 170, 10)
set.seed(2019)
female <- rnorm(50, 165, 10)
height <- c(male, female)
sex <- c(rep("male", length(male)), rep("female", length(female)))
dat_height <- tibble(height, sex)
head(dat_height)

res_height <- t.test(height ~ sex, var = TRUE, data = dat_height)


1.データを取り出す
まずはp値、95%信頼区間のデータを取り出してみます。
これも前回の記事で紹介しています。

p:p値
conf.low:95%信頼区間の小さい方
conf.high:95%信頼区間の大きい方
p <- res_height$p.value
conf.low <- res_height$conf.int[1]
conf.high <- res_height$conf.int[2]
p conf.low conf.high
スクリーンショット 2019-11-07 18.28.31
この数字をグラフに乗せると小数点が多すぎるのでround関数で丸めます。
今回はp値は小数点第3位、95%信頼区間は小数点第2位までにしてみます。
p <- round(res_height$p.value, 3)
conf.low <- round(res_height$conf.int[1], 2)
conf.high <- round(res_height$conf.int[2], 2)
p conf.low conf.high
スクリーンショット 2019-11-07 18.32.21
これでグラフに貼り付けやすくなりました。

2.グラフを作成する

今回はうまくいかないグラフも載せることでグラフを作る流れもお見せできればと思います。
目標は以下のようなグラフを作ることです。
スクリーンショット 2019-11-07 22.35.17


第3章で使ってきたtidyverseパッケージのggplot関数を使います。
もしggplotの使い方がわからない場合はこちらをご参照ください。




最初にtidyverseパッケージを呼び出します。
library(tidyverse)
まずグラフを作ってみます。
今回使うのはgeom_errorbar関数を使います。
geom_errorbar関数はaes関数の中に3つの要素が必要です。

x
:x軸
ymin:エラーバーの最小値
ymax:エラーバーの最大値

x軸に値するものは今回ないので空欄にしておきます。
yminとymaxはconf.lowとconf.highになります。

x:""
ymin:conf.low
ymax:conf.high

ggplot() +
  geom_errorbar(aes(x = "", ymin = conf.low, ymax = conf.high))
スクリーンショット 2019-11-07 20.35.07
なんだかすごいグラフができました。
まずは横向きにします。
グラフを横向きにするのはcoord_flip関数です。()には何も入れません。
ggplot() +
  geom_errorbar(aes(x = "", ymin = conf.low, ymax = conf.high)) +
  coord_flip()
スクリーンショット 2019-11-07 20.36.15
これで横向きになりましたが線が幅長いので短くします。
width = で指定します。今回は0.1にしました。widthはaes関数の外に配置します。
ggplot() +
  geom_errorbar(aes(x = "", ymin = conf.low, ymax = conf.high), width = 0.1) +
  coord_flip()
スクリーンショット 2019-11-07 20.39.18
これでエラーバーっぽくなりました。
今度は数値を入れます。
文字を打ち込むのでgeom_text関数を使います。
geom_text関数のaes()では3つ指定します。
coord_frip()を使っているのでx軸が縦、y軸が横になっていることに注意します。

x:文字を置くx軸の位置→今回は空欄
y:文字を置くy軸の位置→conf.lowとconf.highの2つ
label:実際の文字→conf.lowとconf.highの2つ


conf.lowとconf.highの2つのデータを入れるのでc関数でつなげます。

x:""
y:c(conf.low, conf.high)
label:c(conf.low, conf.high)

ggplot() +
  geom_errorbar(aes(x = "", ymin = conf.low, ymax = conf.high), width = 0.1) +
  geom_text(aes(x = "", y = c(conf.low, conf.high), label = c(conf.low, conf.high))) +
  coord_flip()
スクリーンショット 2019-11-07 20.51.35
数字が出てきましたがグラフとぶつかってしまいます。
vjust =で調整します。
上に上げるときはマイナスの値を入れます。今回は試してみて-1.5にしました。
ggplot() +
  geom_errorbar(aes(x = "", ymin = conf.low, ymax = conf.high), width = 0.1) +
  geom_text(aes(x = "", y = c(conf.low, conf.high), label = c(conf.low, conf.high)), vjust = -1.5) +
  coord_flip()
スクリーンショット 2019-11-07 22.24.29
これでグラフができましたが、y軸(グラフを横にしたから下がy軸になっている)の名前を変えてみます。labs関数を使って「95%信頼区間」と入れてみます。xも消します(空欄にする)。
ggplot() +
  geom_errorbar(aes(x = "", ymin = conf.low, ymax = conf.high), width = 0.1) +
  geom_text(aes(x = "", y = c(conf.low, conf.high), label = c(conf.low, conf.high)), vjust = -1.5) +
  labs(x = "", y = "95%信頼区間") + 
  coord_flip()
スクリーンショット 2019-11-07 21.00.00
Windowの場合はこれで完成かもしれませんが、Macだと日本語が□□□と豆腐になってしまいます。
Macの方はtheme_◯◯関数base_family = を指定します。
今回はヒラギノ角ゴproW3を指定します。
ggplot() +
  theme_gray(base_family = "HiraKakuPro-W3") +
  geom_errorbar(aes(x = "", ymin = conf.low, ymax = conf.high), width = 0.1) +
  geom_text(aes(x = "", y = c(conf.low, conf.high), label = c(conf.low, conf.high)), vjust = -1.5) +
  labs(x = "", y = "95%信頼区間") + 
  coord_flip()
スクリーンショット 2019-11-07 21.03.37
今回のt検定は2群の差が0と仮定していました。0のラインで赤線を足してみます。
y軸に垂直な線を引くにはgeom_hline関数を使います。
かならずいるのはyintercept = です。color = は付けなければ黒になります。
aesは付けなくて大丈夫です。

geom_hline(yintercept = ◯, color = "色名")

ggplot() +
  theme_gray(base_family = "HiraKakuPro-W3") +
  geom_hline(yintercept = 0, color = "red") +
  geom_errorbar(aes(x = "", ymin = conf.low, ymax = conf.high), width = 0.1) +
  geom_text(aes(x = "", y = c(conf.low, conf.high), label = c(conf.low, conf.high)), vjust = -1.5) +
  labs(x = "", y = "95%信頼区間") + 
  coord_flip()
スクリーンショット 2019-11-07 22.35.17

3.まとめ
今回は検定の結果から値を取り出してグラフを作成しました。

グラフの要素を1つずつ追加しました。ブログに書かれているコードは長くて読みにくいかもしれませんが、「今度はこの要素を付け加えたい」という順番にコードを書けばその通りにグラフができるのもRの特徴の1つです。

今回の順番は1例ですので順番を変えて1つずつ作ってみていただければggplotの理解も深まりやすいと思います。



第4章では統計の中でも検定を扱っています。

ここまでいろいろな検定を行ってきましたが、グラフを作る時はどうするでしょうか?

スクリーンショット 2019-10-27 21.42.47

これは【4-1】Rでt検定を行う方法で行ったt検定の結果です。
p値があり、下には95%信頼区間、その下には各グループの平均が記載されています。

p = 0.00975
95%信頼区間:-12.154877 〜 -1.745123
A:28.12
B:35.07

この数値をグラフなどにするには手で打ち直すかコピペをすることが多いと思います。
今回はこの数値がどこに入っているのか?どうやって取り出せばいいのかという話です。

今回は架空のデータを使いますがもし第4章を実践された方はそのデータでも大丈夫です。


1.使うデータ

こんなデータを作りました。
男性:50人、平均170cm、標準偏差10cm
女性:50人、平均165cm、標準偏差10cm

set.seed(2019)
male <- rnorm(50, 170, 10)
set.seed(2019)
female <- rnorm(50, 165, 10)
height <- c(male, female)
sex <- c(rep("male", length(male)), rep("female", length(female)))
dat_height <- tibble(height, sex)
head(dat)

rnorm関数(個数、平均、標準偏差)を指定すると疑似データを作ってくれます。
heightの列に男女のデータをc関数でくっつけ100人のデータにします。
sexの列は(男性,男性,男性,,,,女性,女性,女性,,,,,)としたいのでrep関数を使いました。
rep(繰り返したいもの, 回数)と使います。
tibble関数でheightとsexをつなげました。

2.t検定をする

これをt検定してみます。
t検定は【4-1】Rでt検定を行う方法で紹介しています。


等分散かどうかはそもそも等分散になるようデータを作りましたのでvar = TRUEを付けます。

t.test(height ~ sex, var = TRUE, data = dat_height)
スクリーンショット 2019-11-06 20.37.39

ここまでできました。

このままだとデータは取り出せません。結果を変数に入れます。
今回はres_heightとします
res_height <- t.test(height ~ sex, var = TRUE, data = dat_height)

3.結果からデータを取り出す

すると右上のEnvironmentタブに結果が格納されます。
スクリーンショット 2019-11-06 20.59.45


スクリーンショット 2019-11-06 21.05.31

データをみるとList of 10とあります。
リストというのはExcelのシートが10個あって、それぞれにデータが入っているというイメージです。
一番左がExcelでいうシート名です。
スクリーンショット 2019-11-07 0.13.47


リストの各データを呼び出すのは$もしくは[[ ]]を使います。
p値はp.valueに入っていますのでこうなります。
スクリーンショット 2019-11-07 0.30.11
res_height$p.value

res_height[["p.value"]]
スクリーンショット 2019-11-07 1.06.18

もし小数点以下を四捨五入したい場合はround関数を使います。

round(res_height$p.value, 3)

round(res_height[["p.value"]], 3)
スクリーンショット 2019-11-07 1.06.07


95%信頼区間はconf.intに入っています。
ただそのまま出すと2つのデータが出てきます(95%信頼区間の最小と最大)。
それぞれの値を取り出すには[ ] を使います。[[ ]]ではないので注意してください。
[ ]は【1-12】Rで特定の条件にあう要素を抜き出す方法で紹介しましたが、条件式ではなくただの数値をいれると◯番目のデータを取り出してくれます。

[1]だと1つ目のデータ(つまり最小)
[2]だと2つ目のデータ(つまり最大)が取り出せます。

res_height$conf.int[1]
res_height[["conf.int"]][2]
スクリーンショット 2019-11-07 1.03.41

そして点推定である各平均はestimateに入っています。
res_height$estimate
res_height$estimate[1]
res_height[["estimate"]][2]
スクリーンショット 2019-11-07 2.04.43



4.データを取り出すメリット
結果をコピペしても問題はないのですが、こうすることでのメリットがあります。

それはもし後でデータが変わったとしてもコード自体は何も変えなくていいことです。
考えたくはありませんが、後でデータが増えた、実は個々の数値が間違ってた等あると結果も変わります。しかしデータをコードで取り出しておくと、データが変わっても自動的に数値が更新されるのでミスする可能性が減ります。元データを修正するだけでいいというのはExcelやEZRでは簡単にはできません。

5.まとめ
今回は検定の結果からデータを取り出す方法を紹介しました。
検定の種類によっては取り出し方が違うこともありますが、まずは結果が格納されたデータをみるとヒントがあるかもしれません。

次回は取り出した値を使って95%信頼区間のグラフを作る方法を紹介します。



第4章は統計を扱います。


今回も「シロート統計学」のハルさんとコラボレーションすることとなりました。


シロート統計学はEZRを使った統計分析をわかりやすく解説されています。


 


第4章はシロート統計学で使われていたEZRをRで行うとどうなるのか?といった視点で進めていきます。


今回使うデータもハルさんのサイトと同じものを使わせでいただく事になりました。それぞれ見比べることで参考にしてみてください!


今回はFisherの正確検定を紹介します



まずFisherの正確検定についてはハルさんのサイトをご参照ください。



また1.準備〜4.データの読み込みまでは【4-1】Rでt検定を行う方法と全く同じ流れになります。
もし1〜4まででわからない部分があれば確認してみてください。

 

1.準備

第4章は毎回ExcelデータをダウンロードしてRを使うのでプロジェクトで管理して行うことを勧めています。

 

ここではR練習というプロジェクトを作り、Excelファイルを入れるためのdataフォルダを作っています。
これを前提に次から進めていきます。
スクリーンショット 2019-10-20 7.54.14


2.スクリプトファイルの作成

次にRのコードを書くためのスクリプトファイルを作ります。
スクリーンショット 2019-11-05 11.14.15


3.データのダウンロード

今回もハルさんのサイトのデータを使わせていただきます。

デモデータ(Fisherの正確検定)

この章ではRを使ってダウンロードしています。


download.file(url = “ファイルのURL”,
        destfile = “保存したい場所/ファイル名”)
urlはデモデータで右クリック → リンクのアドレスをコピー
destfileは保存場所と保存のファイル名を指定します。


実際のコードは以下になります。
前回のコードのURL(" "の中)とdestfileのdata/以降を変更するだけでOKです。
#データのダウンロード
url <- "https://haru-reha.com/wp-content/uploads/2018/04/demo-fishers-exact-test.xlsx"
destfile = "data/demo-fishers-exact-test.xlsx"

download.file(url, destfile)

スクリーンショット 2019-11-05 11.18.20


dataフォルダにダウンロードできたことを確認します。




4.データの読み込み

データを読み込みます。
今回は【4-0】第4章を進めていく上での準備で行った方法で進めます。

View Fileでデータを確認します。

スクリーンショット 2019-11-05 11.19.37



データが入っているセルを確認します。
B2からC24までデータが入っています(B2:C42と表記)
スクリーンショット 2019-11-05 11.21.29



次にImport Datasetでデータを取り込みます。
スクリーンショット 2019-11-05 11.19.37


Import画面ではName, Sheet,Rangeを指定します。

Name:ハルさんのサイトと同じsexとします(大文字・小文字は別物とされます)
Sheet:このExcelは1つしかデータがないのでDefaultのままでOK
Range:先ほど確認したB2:C42

スクリーンショット 2019-11-05 11.24.14


Importボタンを押す前に右にあるコードをコピーしスクリプトファイルに貼り付けることも忘れずに行います。
library(readxl)
sex <- read_excel("data/demo-fishers-exact-test.xlsx", 
                  range = "B2:C42")
View(sex)

データが正しく入っていることを確認します。
スクリーンショット 2019-11-05 11.25.14


これでデータの取り込みは完成です。


5.データテーブルの作成
データの要約は【2-6】Rでgroup_by関数とsummarize関数を使ってグラフ作成に必要な統計量(平均や標準偏差など)を求めるで紹介しました。
group_by関数とsummarize関数を使って要約するならこうなります。
ExcelのSexの列のSが大文字なので注意が必要です。
#データの要約
library(tidyverse)
sex %>% 
  group_by(category, Sex) %>% 
  summarize(n = n())
スクリーンショット 2019-11-05 11.39.34

これでもいいのですが、EZRのようにtable形式にしたい場合はtable関数を使います。

table(sex$Sex, sex$category)
スクリーンショット 2019-11-05 11.39.46




6.Fisherの正確検定を行う

Fishsrの正確検定を行うにはfisher.test関数を使います。そのままでわかりやすいです。
列名を2つ指定するだけです。

fisher.test(1列目, 2列目)

fisher.test(sex$Sex, sex$category)
スクリーンショット 2019-11-05 11.39.59

EZRで0.205なので今回の結果を四捨五入すると同じ結果です。


95%信頼区間も出ているのでグラフを作ってみました。結果ではtrue odds ratio is not equal to 1、つまりオッズ比が1であるかどうかで判断してるので1で線を引きます。

スクリーンショット 2019-11-05 15.30.46

95%信頼区間が1を挟んでいますのでpは0.05以上と判断できます。
今回の信頼区間はかなり広いことも読み取れます。
95%信頼区間はデータ数が増えると幅が狭くなります。


(追記)
7.χ二乗検定を行うには

χ(カイ)二乗検定を行うにはchisq.test関数を使います。
fisherをchisqに変えるだけで中身は同じです。
chisq.test(sex$Sex, sex$category)


8.まとめ
今回はFisherの正確検定を紹介しました。

【4-1】から進めている方は少しずつ慣れてきたでしょうか。
このサイトはそのため第1章から順に読むと徐々に知識が追加され、途中で復習できるよう構成しています。もしわからない箇所が多ければサイトマップを見ていただければ別の発見があるかもしれません。

次回は検定の結果から(p値や信頼区間)のデータを取り出す方法を紹介します。

 


9.今回使ったコード

今回使ったコードをまとめて置いておきます。
95%信頼区間のコードも置いています。

#データのダウンロード
url <- "https://haru-reha.com/wp-content/uploads/2018/04/demo-fishers-exact-test.xlsx"
destfile = "data/demo-fishers-exact-test.xlsx"

download.file(url, destfile)


library(readxl)
sex <- read_excel("data/demo-fishers-exact-test.xlsx", 
                  range = "B2:C42")
View(sex)

#データの要約
library(tidyverse)
sex %>% 
  group_by(category, Sex) %>% 
  summarize(n = n())

#データテーブルの作成
table(sex$Sex, sex$category)

#fihsrの正確検定
fisher.test(sex$Sex, sex$category)


#グラフの作成
res <- fisher.test(sex$Sex, sex$category)

ggplot()+
  geom_errorbar(aes(x = "", ymin = res$conf.int[1], ymax = res$conf.int[2]), width = 0.1) +
  geom_text(aes(x = "", y = res$conf.int[1], label = round(res$conf.int[1], 2)), vjust = -1) +
  geom_text(aes(x = "", y = res$conf.int[2], label = round(res$conf.int[2], 2)), vjust = -1) +
  geom_point(aes(x = "", y = res$estimate)) +
  geom_text(aes(x = "", y = res$estimate, label = round(res$estimate, 2)), vjust = -1) +
  geom_hline(yintercept = 1, color = "red") +
  labs(x = "", y = "") +
  coord_flip()

#χ二乗検定
chisq.test(sex$Sex, sex$category)



↑このページのトップヘ