人工知能を作りたい!

統計的仮説検定

一元配置分散分析(対応あり)




はじめに

分散分析において、母平均に差をもたらす原因を因子といいます。また、因子の中に含まれる個々の条件を水準といいます。そして、因子を1つ配置した場合の分散分析を一元配置分散分析といいます。

全て異なる被験者から得たデータ(被験者間のデータ)は対応がないデータといいます。同じ被験者から異なる水準で得たデータ(被験者内のデータ)は対応があるデータといいます。

一元配置分散分析において、「各データの値は全データの平均値からどれだけ離れているのか」、つまり、「各データの値のばらつき」は、対応なしの場合と対応ありの場合では以下のように分解され、説明されます。

<一元配置分散分析(対応なし)>
各データの値のばらつき = 群分けによる効果 + 残差

この残差は、「群の違いによる効果では説明できない何か」です。

<一元配置分散分析(対応あり)>
各データの値のばらつき = 群分けによる効果 + 個人差の効果 + 残差

一元配置分散分析(対応あり)では、同じ人が複数の条件で測定されるため、データに個人の特徴が現れます。この残差は、「群分けによる効果でも個人差の効果でも説明できない何か」です。




例題

健康な人の血糖値は、空腹時は約70 mg/dL、食後2時間後は約130 mg/dLです。食後のインスリン分泌に遅れのある2型糖尿病患者の血糖値は、空腹時は約70 mg/dLで正常値ですが、食後2時間後は約200 mg/dL以上になります。

新しく開発した3種類のインスリン分泌促進薬それぞれの効果を検証するため、インスリン分泌に遅れのある2型糖尿病患者群から5人の被験者を無作為に抽出しました。

3種類の新薬それぞれを、被験者一人一人に食前10分前服用してもらい、食後2時間後の血糖値を測定しました。そして、「新薬を服用しない時の食後血糖値」と「新薬を服用した時の食後血糖値」の差を血糖降下度 (mg/dL) として、以下のようにデータ化しました。


   薬A  薬B  薬C
 田中  60  75  88
 福山  79  89  98
 平松  127  64  132
 松田  98  47  129
 高野  102  47  68

3種類の薬の効果に有意な差があるといえるでしょうか。




帰無仮説と対立仮説の設定

帰無仮説 H0: μA = μB = μC(3群それぞれの母平均は等しい)
対立仮説 H1:少なくとも1つの母平均が他の母平均と異なる
有意水準 α =0.05




Rによる統計解析

分散分析(対応あり)を実行するため、関数 aov() を利用します。書式は2通りあります。どちらも同じ結果を表示します。

aov(分散分析の対象となる変数~群分けの変数+個人差の変数)
aov(分散分析の対象となる変数~群分けの変数+Error(個人差の変数))

下準備として、まず、「分散分析の対象となる変数」「群分の変数」「個人差の変数」を作ります。



分散分析の対象となる変数

> 薬Aによる血糖値差 <- c(60, 79, 87, 98, 52)
> 薬Bによる血糖降下度 <- c(55, 89, 64, 97, 47)
> 薬Cによる血糖降下度 <- c(88, 98, 112, 129, 98)
> 全ての血糖降下度 <- c(薬Aによる血糖降下度, 薬Bによる血糖降下度, 薬Cによる血糖降下度)


薬Aによる血糖値差を変数「薬Aによる血糖降下度」へ、 薬Bによる血糖降下度を変数「薬Bによる血糖降下度」へ、 薬Cによる血糖降下度を変数「薬Cによる血糖降下度」へ格納します。

そして次に、変数「薬Aによる血糖降下度」「薬Bによる血糖降下度」「薬Cによる血糖降下度差」を変数「全ての血糖降下度」へ格納します。



群分けの変数

> 薬の種類 <- c(rep("薬A", 5), rep("薬B", 5), rep("薬C", 5))


変数「薬の種類」に、どの薬による血糖降下度なのかを示す「薬A」、「薬B」、「薬C」という文字型データを5回ずつ繰り返して格納しておきます。


> 薬の種類2 <- factor(薬の種類)


関数 factor() を利用して、変数「薬の種類」に格納された文字型データを要因型データに変換し、変数「薬の種類2」に格納しておきます。



個人差の変数

> 人 <- c(rep(c("田中", "福山", "平松", "松田", "高野"), 3))


変数「人」に、誰のデータなのかを示す「田中」、「福山」、「平松」、「松田」、「高野」という文字型データを3回ずつ繰り返して格納しておきます。


> 人2 <- factor(人)

関数 factor() を利用して、変数「人」に格納された文字型データを要因型データに変換し、変数「人2」に格納しておきます。



分散分析表の出力

関数 aov() は分散分析表を出力しないので、関数 summary() を合わせて利用し、分散分析表を出力します。


> summary(aov(全ての血糖降下度~薬の種類2+人2))

            Df Sum Sq Mean Sq F value Pr(>F)
薬の種類2 2 3514 1756.9 20.23 0.000743 ***
人2 4 3639 909.8 10.47 0.002881 **
Residuals 8 695 86.9
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


「薬の種類2」の行のp値は0.000743ですので、群分けによる効果に有意差があることが分かります。つまり、帰無仮説は棄却され、「対立仮説 H1:少なくとも1つの母平均が他の母平均と異なる」が採択されました。ちなみに、「人2」の行のp値は0.002881ですので、個人差による効果にも有意差があることが分かります。


> summary(aov(全ての血糖降下度~薬の種類2+Error(人2)))

Error: 人2
          Df Sum Sq Mean Sq F value Pr(>F)
Residuals 4 3639 909.8

Error: Within
          Df Sum Sq Mean Sq F value Pr(>F)
薬の種類2 2 3514 1756.9 20.23 0.000743 ***
Residuals 8 695 86.9
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘


「薬の種類2」の行のp値は0.000743ですので、群分けによる効果に有意差があることが分かります。つまり、帰無仮説は棄却され、「対立仮説 H1:少なくとも1つの母平均が他の母平均と異なる」が採択されました。summary(aov(全ての血糖降下度~薬の種類2+人2)) の場合と結果は同じです。