R logo

統計について何もわからないまま研究を始めた頃、最初に覚えた合言葉:パラメトリックで2群比較はt検定、3群以上の比較は分散分析(Analysis of variance, ANOVA)。

 



 

とゆーことで、今回はANOVAをRで行う時の覚え書き。

 

分散分析の前提条件は下記3点。

  • N数が十分に多い
  • 分散が等しい
  • 正規分布

分散はBartlett検定で、正規性はShapiro-wilk検定で。

カテゴリー変数 連続変数 生存曲線


群の平均値の比較


Fisher 正確検定
カイ二乗検定
正規性の検定 シャピロウィルク検定
(Shapiro-wilk test)
コルモゴロフ–スミルノフ検定
(Kolmogorov-Smirnov test)
リリフォース検定
(Lilliefors test)
2群




分散の検定 F検定
(F test)
正規分布 対応なし スチューデントのt検定
(Unpaired t-test)
対応あり 対応のあるt検定
(Paired t-test)
非正規分布 対応なし マン-ホイットニーのU検定
(Mann-Whitney U test)
対応あり ウィルコクソン符号付順位検定
(Wilcoxon signed rank test)

3群以上
分散の検定 バートレット検定(Bartlett test)
ルビーン検定(Levene test)
 
正規分布 対応なし 分散分析
(factorial ANOVA)
log-rank 検定
対応あり 反復分散分析
(measured ANOVA)
非正規分布 対応なし クラスカル・ウォリス検定
(Kruskal-Wallis test)
対応あり フリードマン検定
(Friedman test)
多変量回帰 ロジスティック回帰 重回帰 Cox 回帰
共分散 共分散分析(ANCOVA)
多変量分散 多変量共分散分析(MANCOVA)

ANCOVA を R で行う方法: 準備

マウスの病理Xの数が、処置A、処置B、処置Cでどう変わるか調べる。

  • 目的変数(response variables):病理X
  • 説明変数(explanatory variables):処置(A,B,C,D)

パッケージをインストール

"tidyverse" パッケージ

今回の関数を使う前段階のデータ整理で必須(モデルでは使わない)。

install.packages("tidyverse")
library("tidyverse")

"car" パッケージ

3番目の手法 "Anova()" で使用。

install.packages("car")
library("car")

ANOVA を R で行う方法色々

R で ANOVA を行う用法は、いくつかあり、それぞれ少しずつ異なる。

  • aov()
  • anova()
  • car::Anova()
  • oneway.test()

それぞれの関数の違い

大まかな違いは下記のような感じ。

等分散を仮定しているかどうか

  • aov(): 等分散を仮定
  • anova(): 等分散を仮定
  • car::Anova(): 等分散を仮定
  • oneway.test(): 等分散を仮定しないウェルチの分散分析

平方和のタイプの選択

平方和のタイプには、Type I~IVまで4種類あり、多くの統計ソフトでは Type III を使用しているらしい。

Rの場合は、

  • aov(): Type I
  • anova(): Type I
  • car::Anova(): Type を選択できる
  • oneway.test(): Type I

aov() と anova() の場合、平方和はタイプIとなっており、自由に選択できない。

これに対して、carパッケージのAnovaは、機能の中で平方和のタイプを指定できる。

2元配置以上の分散分析の場合、この平方和の選択で結果が異なる事があるので問題となるが、1元配置分散分析では問題は発生しない。

aov() と anova() の違い

aov は内部に線形モデルのlm関数を含んでおり、1元時配置分散分析で使用。回帰係数、適合値、残渣などを生成する。

lm オブジェクトの拡張のような感じ。

anova() は一般的な関数で、一元配置分散分析で使用する時は、lm()やaov()でモデルを構築し、それをanova()関数に与える。

方法1:aov() を使う

aov() はRの標準パッケージ。

aov(目的変数 ~ 説明変数, data = データフレーム)

のような形で使用する。

下記例では、

  • 目的変数: Pathology
  • 説明変数: Group
  • データフレーム: df

として使用した場合

# aov() を使った方法
model <- aov(Pathology ~ Group, data = df)
summary(model)

出力例

r-one-way-anova-1

上記 "Pr(>F)" は 0.00748 なので、このデータフレームでは「群間の平均値に差がある」といえる。

方法2:anova() を使う

anova()は一般的な関数。

1元配置分散分析で使用する場合は、まずlm()やaov()でモデルを構築し、それをanova()関数に与える。

anova(lm(目的変数 ~ 説明変数, data = データフレーム))
# lm() で線形モデルを構築し、anova()関数に与える
anova(lm(Pathology ~ Group, data = df))
anova(aov(目的変数 ~ 説明変数, data = データフレーム))
r-one-way-anova-2
# aov() を使用する場合
anova(aov(Pathology ~ Group, data = df))
r-one-way-anova-3

"Pr(>F)" はいずれも 0.00748 となった。

方法3:car::Anova() を使う

carパッケージをインストールすると使える。

aov(), anova() と違って、平方和を指定することができる。

# car::Anova() を使用。Type IIを選択
Anova(lm(Pathology ~ Group, data = df), type = 2)
r-one-way-anova-4
# car::Anova() を使用。Type IIIを選択
Anova(lm(Pathology ~ Group, data = df), type = 3)

"Pr(>F)" はいずれも 0.00748 となった。

Type III では切片(Intercept)も出てくるが、今回は気にしなくてOK。

r-one-way-anova-5

方法4:oneway.test() を使う

一元配置分散分析の関数として、oneway.test() も用意されている。

oneway.test(目的変数 ~ 説明変数, data = データフレーム, var.equal = TRUE)

オプション "var.equal = TRUE" は各データに等分性を仮定する際に指定するオプションで、通常指定する必要がある。

# oneway.test() を使用
oneway.test(Pathology ~ Group, data = df, var.equal=TRUE)
r-one-way-anova-6

 



 

今回はいずれの方法でも、平方和、F値、P値の値が一致した。

変数の名称について

今回、目的変数、説明変数という名称を使用しているけど、下記の言葉群も同じ意味。

変数の名称色々
  1. 結果に影響を与える因子の変数
    • 説明変数(explanatory variable)
    • 独立変数(independent variable)
    • 予測変数(predictor variable)
  2. 1の影響を受けて発生した結果の変数
    • 目的変数、応答変数、反応変数(response variable)
    • 従属変数(dependent variable)
    • 結果変数(outcome variable)
    • 基準変数(criterion variable)
    • 被説明変数(explained variable)

References