タグ:select

第4章では統計を扱っています。
その中で何度か分散分析のを紹介してます。

【4-10】Rで分散分析(一元配置分散分析)を行う方法
【4-12】Rで1要因反復測定分散分析(repeated-measures-ANOVA)を行う方法①
【4-12】Rで1要因反復測定分散分析(repeated-measures-ANOVA)を行う方法②

Rで分散分析を行う関数はいくつかあり、今までaov関数、lm関数→anova関数、Anova関数など紹介してきました。
ただRにはANOVA君という分散分析に特化したスクリプトがあります。

ANOVA君を使えばどんな形式の分散分析でも行え、多重比較も一気にできます。

今回はANOVA君を紹介します。



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.被験者間要因と被験者内要因と分散分析のデザインについて
分散分析を行う上で大切なのが被験者間要因と被験者内要因についてです。

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

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

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

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

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

ANOVA君を使うためにはこのデザインの名付け方とデータの並べ方が鍵になります。

3.ANOVA君の導入

ANOVA君は通常のインストールでは行なえません。

ANOVA君の作者である井関龍太さんのホームページでダウンロードする必要があります。



上記記事でtxtファイルを保存します。
保存場所は作業フォルダに入れておくとすぐに使えますが、どこでも大丈夫です。
作業フォルダはgetwd関数を使えばわかります。()内は何も入れません。

getwd()


RstudioでCode→Source Fileでダウンロードしたファイルを指定すればOKです。
スクリーンショット 2019-11-28 7.54.56


4.ANOVA君を使うためのデータの準備

ANOVA君を使うには次の情報が大切です。
①何デザインか?
②デザインに併せたデータの並び順にする

①何デザインか?

今回は以下の列があります。

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


【4-12】Rで1要因反復測定分散分析(repeated-measures-ANOVA)を行う方法①ではBのみで分散分析を行いました。この場合は被験者間要因がありませんのでsAデザインとなります。

【4-12】Rで1要因反復測定分散分析(repeated-measures-ANOVA)を行う方法②では被験者間要因がA被験者内要因がBなのでAsBデザインとなります。

分散分析には一元配置とか二元配置とか反復測定とか混合モデルとかいろいろあるのですが、なれない方はまず上記のデザインが付けられることを優先してもいいと思います。その後書籍で二元配置とか出てきた時にそのデータをみながら「あぁ、これは○○デザインのことだな」と理解できればいいと思います。

②デザインに併せたデータの並び順にする
そしてANOVA君はデザインの順にデータを並べることが必須です。

これはtidyverseパッケージのselect関数を使えばできます。
スクリーンショット 2019-11-25 22.48.23

今はW0,W1,W2,sexの順に並んでいます。

もしsAデザインならsexを消し、W0,W1,W2のみの列にします。
select関数は【2-4】Rで指定した列や行だけを取り出すselect関数、slice関数、filter関数を紹介しますで紹介しています。

今回はgrip_anovakun_1_wideという変数名を付けました。なんでも大丈夫です。
まずtidyverseパッケージを読み込んでから行います。

library(tidyverse)

grip_anovakun_1_wide <- grip_rep_anova %>% select(W0, W1, W2)

スクリーンショット 2019-12-02 23.30.22

もしAsBデザインならsex,W0,W1,W2の並び順にする必要があります。

grip_anovakun_2_wide <-
  grip_rep_anova %>% 
  select(sex, W0, W1, W2)

スクリーンショット 2019-12-02 23.32.04

これでデータができました。

5.ANOVA君を使う

ANOVA君で分散分析を行うにはanovakun関数を使います。

anovakun(データ, "デザイン", 各要素のグループの数)

ポイントはAやBの要素の数を入れることです。
スクリーンショット 2019-12-02 23.49.02
anovakun(grip_anovakun_1_wide, "sA", 3)
anovakun(grip_anovakun_2_wide, "AsB", 2, 3) anovakun(grip_anovakun_2_wide, "AsB", sex = c("F", "M"), time = c("W0", "W1", "W2"))

6.結果の見方
今回の結果をそれぞれ表示します。

①sAデザインの場合
anovakun(grip_anovakun_1_wide, "sA", 3)

スクリーンショット 2019-12-02 23.56.16

sAデザインと書いています。
AがW0,W1,W2だったので、a1,a2,a3と表記されます。
まず、それぞれの平均と標準偏差が書いてあります。

スクリーンショット 2019-12-03 0.03.43
つぎに反復測定分散分析に必要な球面性の検定を行っています。
球面性の検定に関しては【4-12】Rで1要因反復測定分散分析(repeated-measures-ANOVA)を行う方法①をご参照ください。

スクリーンショット 2019-12-03 0.03.48
そして分散分析表です。
sAデザインは要素が1つしかないので交互作用はありません。

スクリーンショット 2019-12-03 0.03.54
有意差があれば多重比較を行います。
多重比較をは何も指定しないとShafferの方法になります。
もしHolmの方法を行いたい!という場合は holm = TRUEを付け加えます。
anovakun(grip_anovakun_1_wide, "sA", 3, holm = TRUE)

②AsBデザインの場合
anovakun(grip_anovakun_2_wide, "AsB", sex = c("F", "M"), time = c("W0", "W1", "W2"))
スクリーンショット 2019-12-03 0.31.54
最初に各群の平均・標準偏差が書かれています。
スクリーンショット 2019-12-03 0.32.01
反復測定分散分析にひつような球面仮定性についてみています。


スクリーンショット 2019-12-03 0.33.01
次に分散分析表がでています。
今回みたいのはsex x timeの部分です。
timeで有意差がでているので時間経過の影響はあるようですが、その傾向は男女で違うようです。

スクリーンショット 2019-12-03 0.33.08
timeで有意差が出ていたので男女合わせたtimeで多重比較の結果が出ています。

スクリーンショット 2019-12-03 0.33.19
次はsex x timeの交互作用についてです。
今回みたいのは下のtime at Ftime at Mです。
女性・男性それぞれ時系列に差があるようです。

sex at W0 ~ W2はW0においてFとMに差があるか?という意味ですが今回知りたいことではありません。

スクリーンショット 2019-12-03 0.33.29
男女ともに時系列で有意差が見られたのでそれぞれの多重比較の結果が出ています。

どちらもW0 < W1 < W2で大きいようです。


7.まとめ

今回はANOVA君について紹介しました。

Rで分散分析を行うならANOVA君はあまりにも有名なので是非試してみてください!




Rで集計やグラフ作成を行う場面は多くあります。

その際、元の表から分析に使いたい列や行だけを抽出したり、「男性だけを取り出す」みたいに様々な条件にあった行だけを抽出することが必要になります

今回はRで指定した列や行だけを取り出すselect関数、slice関数、filter関数を紹介します。
これらはtidyverseパッケージ内にあるdplyrパッケージの機能です。



今回使う架空のデータは前回と同じものを使用します。

年齢、性別、病名が入っています。
下のコードをまとめてスクリプトにコピペして実行してください。
library(tidyverse)
set.seed(1) 年齢 <- floor(rnorm(100,60,20)) 性別 <- sample(c("男性","女性"),100,replace = TRUE) 病名 <- sample(c("脳梗塞", "脳出血", "骨折", "靭帯損傷","心筋梗塞"), 100, replace = TRUE) data <- data.frame(年齢,性別,病名) head(data)

スクリーンショット 2019-02-10 22.48.49



1.指定した列を抽出するselect関数

select(データの変数名, 選択する列)

スクリーンショット 2019-02-13 20.15.20


select関数では縦の列を抽出します。

列名または列番号で選択します(" "をつけなくてOK)。

もしくは使わない列を選ぶこともできます。

そのため以下の3つのコードは全て同じ結果になります。
data_A <- data %>% 
  select(1,2)
head(data_A)

data_A <- data %>% 
  select(年齢,性別)
head(data_A)

data_A <- data %>% 
  select(1,性別)
head(data_A)

data_A <- data %>% select(-3) head(data_A)

列名で指定する場合は""で囲む必要はないですが、大文字や小文字など間違えないことが大切です。

また列番号の場合「何列目かなんてわからない…」ということもよくあります。

列名と列番号の一覧を知りたい時はt関数とnames関数を使うと便利です
t(names(data))
スクリーンショット 2019-02-13 20.28.22



応用編

応用①
もし列名が連番ならを使います。1番目〜5番目なら1:5と書きます。
select(1:5)

応用②
もっと選びたい列があって1番目と5番目〜10番目と13番目を使いたい場合は以下になります。
select(1, 5:10, 13)

応用③

インデックスという考え方で、選ぶ列番号を入れた変数を予め作成する方法があります。

data %>%
index <- c(1, 5:10, 13)
select(index)
スクリーンショット 2019-02-13 23.31.02


先にindexという変数名を作り、そこに指定する列を選びます。

Rを紹介する本やサイトではindexindという変数名で見かけることがありますが、もちろん好きな変数名で構いません。

indexの便利なところはindexを変えるだけで、本体のコードは1つも変わらないところにあります。

スクリーンショット 2019-02-13 21.08.16

このような考え方は色々な場面で使われます。

特に繰り返しの作業で効果を発揮します。



2.指定した行を抽出するslice関数

slice(データの変数名選択する列)

slice関数はselect関数の行バージョンです。

ただ条件で絞るのはslice関数でなく次に紹介するfilter関数になります。

silce関数は10万桁あって処理に時間かかるから、いきなり全部使わず1000行だけ切り取って、プログラムが動くかどうかテストしてみようみたいな場合に使えます。

他にも下のようなExcelをファイルを読み込むことになってしまい、1行目いらない!下の平均の行いらない!など切り取る列が決まってるときに使います。

スクリーンショット 2019-02-13 21.47.00

slice(2:7)はslice(-1,-8)でもOKです。



3.指定した条件を抽出するfilter関数

filter(データの変数名条件1,条件2)

filter関数は条件にあった行を抽出します。

data_B <- data %>% 
  filter(病名 %in% c("骨折", "靭帯損傷"))
head(data_B)
スクリーンショット 2019-02-13 21.45.33


前回の記事でも出ましたが、条件を付ける場合は演算子を使います。

スクリーンショット 2019-02-11 2.04.40
使い方に自身がない場合はRで数値を複数のカテゴリーに分類するifelse関数、case_when関数、cut関数を紹介しますをご参照ください。


複数の条件で絞る場合

filter関数で複数条件の場合は3つ方法があります。

, でつなぐ

filter関数はfilter(データの変数名条件1,条件2)という形式なので、カンマを使ってつなげることができます。

data_B <- data %>% 
  filter(病名 %in% c("骨折", "靭帯損傷") ,
         性別 == "女性" ,
         年齢 < 60)

%>%でつなぎ、filter関数を重ねる

filter関数は複数あって悪いことはないので、素直に%>%でつなげる方法ことも可能です。
メリットとしてはとりあえずわかりやすいのと、考えた順にコードを追加できるところでしょうか。

下のコードで①と同じ結果になります。
スクリーンショット 2019-02-13 21.56.55


&| で条件を付け加える

& や | でつなぐこともできます。演算子の前後に , は入れません。
今までの方法は全て「かつ」という意味でつないでいたので、「または」の意味でつなぎたい時は | でつなぎましょう。

これも①②と同じ結果になります。
スクリーンショット 2019-02-13 23.10.11



まとめ

今回はselect関数、slice関数、filter関数を紹介しました。

これらの関数は集計やグラフを作成するときによく使います。

今後も出てくる予定なのでわからなくなったら復習に使ってください。




↑このページのトップヘ