日々のつれづれ

不惑をむかえ戸惑いを隠せない男性の独り言

回帰モデルの係数の分散分析のまとめ・その3

R Advent Calender 2023として投稿することにしました

共分散分析で回帰分析の分散分析が出てきたので、少し整理します。

回帰分析を分散分析する目的

回帰分析の分散分析は、データを意思決定に利用するための方法です。

これを使えば、回帰モデルに用いた異なる要因(説明変数、因子など)が目的変数に与える影響を統計的に評価できます。

一般的な回帰モデルは以下の式で表されます。

$$ y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \ldots + \beta_n x_n + \varepsilon $$

  • $y$ : 目的変数
  • $x_1, x_2, \ldots, x_n$ : 説明変数、要因
  • $\beta_0, \beta_1, \beta_2, \ldots, \beta_n$ : 回帰係数(各説明変数の影響度)
  • $\varepsilon$ : 誤差項

この回帰モデルにおいて、異なる説明変数が目的変数に与える影響を評価するために分散分析を利用します。そして、回帰モデルや説明変数により目的変数の総変動(ばらつき)が減少(説明)する量を見ることで、その影響が分かります。

これには、以下の 2 つのアプローチがあります。

  • 回帰モデル全体の有意性評価:回帰モデルが目的変数をどれだけ説明できるかを見るために、回帰モデルと単なる平均値(切片だけのモデル)を比較する。
  • 特定の説明変数や切片に対する検定:各説明変数や切片が目的変数にどれだけ影響を与えるかを見るために、その係数が 0 であるかどうかを検定する。

重回帰モデルの場合

重回帰モデルは説明変数が複数あるため、「回帰モデル全体の有意性評価」と「特定の説明変数や切片に対する検定」の 2 つのアプローチは異なります。

回帰モデル全体の有意性評価の計算手順

ここでは、回帰モデル全体の有意性評価を整理します。この評価では、回帰モデルが目的変数を説明できる程度を見ています。

次の計算手順は、サンプル数が $m$、説明変数の総数が $n$の例になります。

  1. 目的変数の総変動を回帰変動と残差変動に分解する
    • $SS_y$ : 目的変数の総変動、目的変数のばらつきの程度
      • $y_i$ : $i$ 番目の実測値
      • $\bar{y}$ : 目的変数の平均値 $$ SS_y = \sum_{i = 1}^{n}(y_i - \bar{y})2 $$
    • $SS_R$ : 回帰変動、回帰モデルが目的変数を説明できる程度
      • $\hat{y}i$ : $i$ 番目の予測値 $$ SS_R = \sum{i = 1}^{n}(\hat{y}_i - \bar{y})2 $$
    • $SS_E$ : 残差変動、回帰モデルが目的変数を説明できない程度 $$ SS_E = \sum{i = 1}^{n}(y_i - \hat{y}i)2 $$
  2. それぞれの変動を自由度で割って平均二乗を求める
    • $df_y$ : 全体の自由度、観測値の数 - 1 $$ df_y = m - 1 $$
    • $df_R$ : 回帰の自由度、説明変数の個数 $$ df_R = n $$
    • $df_E$ : 残差の自由度、全体の自由度 - 回帰の自由度 $$ df_E = df_y - df_R = m - n - 1 $$
    • $MS_y$ : 全体の平均二乗、総変動を全体の自由度で割った値 $$ MS_y = \frac{SS_y}{df_y} $$
    • $MS_R$ : 回帰の平均二乗、回帰変動を回帰の自由度で割った値 $$ MS_R = \frac{SS_R}{df_R} $$
    • $MS_E$ : 残差の平均二乗、残差変動を残差の自由度で割った値 $$ MS_E = \frac{SS_E}{df_E} $$
  3. 回帰の平均二乗を残差の平均二乗で割って、F 統計量$F_R$を求める $$ F_R = \frac{MS_R}{MS_E} $$
  4. 回帰と残差の自由度の F 分布から p 値$p_R$を求めて有意水準で判断する $$ p_R = P(F > F_R) = 1 - P(F \leq F_R) $$ なお、このときの帰無仮説
    • 帰無仮説 ( $H_0$ ): $\beta_1 = 0$(説明変数は目的変数に影響しない)
    • 対立仮説 ( $H_1$ ): $\beta_1 \neq 0$(説明変数は目的変数に影響する)

R で計算する

回帰分析で分散分析すると、異なる要因(説明変数、因子など)が目的変数に与える影響を統計的に評価できます。そして、これはデータに基づいた合理的な意思決定に有効です。

説明変数が 2 つの重回帰モデルを例に確認します。式は次のようになります。

できるだけスクラッチ実装をしてみます。

$$ y{mpg} = \beta_0 + \beta_1 x{wt} + \beta{2} x{hp} + \varepsilon $$

これは、mtcarsデータセットを使った回帰モデルで、目的変数が mpg(ガロンあたりのマイル数)、説明変数が wt(車両重量)と hp(馬力)です。そして、wthp に交互作用はないと考えています。

# データの読み込み
data(mtcars)

# 回帰モデルの作成
model <- lm(mpg ~ wt + hp, data = mtcars)
model
Call:
lm(formula = mpg ~ wt + hp, data = mtcars)

Coefficients:
(Intercept)           wt           hp
   37.22727     -3.87783     -0.03177

係数と切片の推定値が、それぞれ $\hat{\beta}0 = 37.22727$ 、$\hat{\beta}1 = -3.87783$ 、$\hat{\beta}_2 = -0.03177$ になりました。

続いて、回帰モデル全体の有意性を評価します。計算の流れは単回帰モデルと同じです。

  1. 目的変数の総変動 $SS_y$ を回帰変動 $SS_R$ と残差変動 $SS_E$ に分解する 回帰変動は、回帰モデルの目的変数の平均値からのズレの程度です。良い回帰モデルほど値は大きくなります。
# 目的変数とその推定値
y <- mtcars$mpg # 目的変数
bar_y <- mean(y) # 平均値
hat_y <- fitted(model) # 推定値
# hat_y <- predict(model) # 推定値

# 総変動と回帰変動と残差変動
SS_y <- sum((y - bar_y)^2) # 総変動
SS_R <- sum((hat_y - bar_y)^2) # 回帰変動
SS_E <- sum((y - hat_y)^2) # 残差変動
  1. それぞれの自由度で割って、それぞれの平均二乗 $MS_R$ と $MS_E$ を求める
# 自由度
df_y <- nrow(mtcars) - 1 # 全体の自由度
df_R <- length(coef(model)) - 1 # 回帰の自由度(説明変数の数)
df_E <- df_y - df_R # 残差の自由度

# 平均二乗、分散
MS_y <- SS_y / df_y # 全体の平均二乗
MS_R <- SS_R / df_R # 回帰の平均二乗
MS_E <- SS_E / df_E # 残差の平均二乗
  1. 回帰の平均二乗を残差の平均二乗で割って、F 統計量を計算する F 統計量は、回帰モデルが目的変数をどれだけ説明できるかを表す指標です。回帰モデルの当てはまりが良ければ、F 統計量は大きくなります。
# F統計量の計算
F_R <- MS_R / MS_E
  1. 自由度が($df_R$, $df_E$)の F 分布から p 値を求めて有意水準で判断する p 値は、F 統計量が得られる確率を表す指標です。回帰モデルが目的変数に有意な影響を与えていれば、p 値が小さくなります。
# p値の計算
p_R <- pf(F_R, df_R, df_E, lower.tail = FALSE)
# p_R <- 1 - pf(F_R, df_R, df_E)
  1. 分散分析表を作成する
# 分散分析表の作成
res <- data.frame(
   Df = c(df_R, df_E, df_y),
   `Sum Sq` = c(SS_R, SS_E, SS_y),
   `Mean Sq` = c(MS_R, MS_E, MS_y),
   `F value` = c(F_R, NA, NA),
   `Pr(>F)` = c(p_R, NA, NA),
   row.names = c("Regression", "Residuals", "Total"),
   check.names = FALSE
)
res
           Df    Sum Sq    Mean Sq  F value       Pr(>F)
Regression  2  930.9994 465.499716 69.21121 9.109054e-12
Residuals  29  195.0478   6.725785       NA           NA
Total      31 1126.0472  36.324103       NA           NA

なお、これはanova(model)では取得できません。

summary(model)の返り値を使って計算します。

f_stat = summary(model)$fstatistic
p_value = pf(f_stat[1], f_stat[2], f_stat[3], lower.tail=FALSE)
cat("F statistic: ", f_stat[1], "\n")
cat("p value: ", p_value, "\n")
F statistic:  69.21121
p value:  9.109054e-12

回帰モデルの係数の分散分析のまとめ・その2

共分散分析で回帰分析の分散分析が出てきたので、少し整理します。

回帰分析を分散分析する目的

回帰分析の分散分析は、データを意思決定に利用するための方法です。

これを使えば、回帰モデルに用いた異なる要因(説明変数、因子など)が目的変数に与える影響を統計的に評価できます。

一般的な回帰モデルは以下の式で表されます。

$$ y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \ldots + \beta_n x_n + \varepsilon $$

  • $y$ : 目的変数
  • $x_1, x_2, \ldots, x_n$ : 説明変数、要因
  • $\beta_0, \beta_1, \beta_2, \ldots, \beta_n$ : 回帰係数(各説明変数の影響度)
  • $\varepsilon$ : 誤差項

この回帰モデルにおいて、異なる説明変数が目的変数に与える影響を評価するために分散分析を利用します。そして、全ての$x_n$が$y$に与える影響を見る「回帰モデル全体の有意性評価」と、個々の$x_n$が$y$に与える影響を個別にみる「特定の説明変数や切片に対する検定」の 2 つのアプローチがあります。

R で計算する

まずは、説明変数が 1 種類の単回帰モデルを考えます。単回帰モデルの分散分析は、説明変数が目的変数をどれだけ説明できるかを見ています。

$$y = \beta_0 + \beta_1 x + \varepsilon$$

なお、単回帰モデルの場合、説明変数が 1 つしかないので、「回帰モデル全体の有意性評価」と「特定の説明変数や切片に対する検定」は同じです。

ここからは、mtcarsデータセットを使い、目的変数を mpg(ガロンあたりのマイル数)、説明変数を wt(車両重量)にした回帰モデルで進めます。

# データセットの読み込み
data(mtcars)

# モデルの適合
model <- lm(mpg ~ wt, data = mtcars)

model
Call:
lm(formula = mpg ~ wt, data = mtcars)

Coefficients:
(Intercept)           wt
     37.285       -5.344

係数と切片の推定値が、$\hat{\beta}0 = 37.285$ 、$\hat{\beta}1 = -5.344$になりました。

続いて、回帰モデル全体の有意性を評価します。計算の流れは以下の通りです。

  1. 目的変数の総変動 $SS_y$ を回帰変動 $SS_R$ と残差変動 $SS_E$ に分解する
  2. それぞれの自由度で割って、それぞれの平均二乗 $MS_R$ と $MS_E$ を求める
  3. 回帰の平均二乗を残差の平均二乗で割って、F 統計量を計算する
  4. 自由度が($df_R$, $df_E$)の F 分布から p 値を求めて有意水準で判断する

目的変数の総変動 $SS_y$

目的変数の総変動($SS_y$)は、目的変数 $y$ の値がその平均値 $\bar{y}$ からどれだけずれているかを表す指標です。

目的変数とその平均値の差の二乗和を求めます。

$$SS_y = \sum_{i=1}^{n}{(y_i - \bar{y})2}$$

# 目的変数とその平均値
y <- mtcars$mpg # 目的変数
bar_y <- mean(y) # 平均値

# 総変動
SS_y <- sum((y - bar_y)^2)

回帰変動 $SS_R$

回帰変動($SS_R$)は、回帰モデルが目的変数の平均値からどれだけずれているかを表す指標です。

回帰モデルによる目的変数の予測値 $\hat{y}$ とその平均値 $\bar{y}$ の差の二乗和を求めます。

$$SS_R = \sum{i=1}^{n}{(\hat{y}i - \bar{y})2}$$

# モデルの予測値
hat_y <- fitted(model)
# hat_y <- predict(model) # こちらでも可

# 回帰変動
SS_R <- sum((hat_y - bar_y)^2)

残差変動 $SS_E$

残差変動($SS_E$)は、回帰モデルで説明できない目的変数の残りの変動を表す指標です。

目的変数 $y$ と回帰モデルによる予測値 $\hat{y}$ の差の二乗和を求めます。また、残差変動は総変動から回帰変動を引いた値になっています。

$$SS_E = SS_y - SS_R = \sum{i=1}^{n}{(y_i - \hat{y}i)2}$$

# 残差変動
SS_E <- sum((y - hat_y)^2)
# SS_E <- sum(residuals(model)^2) # こちらでも可

目的変数の総変動 $SS_y$

目的変数の総変動は、目的変数 $y$ の値がその平均値 $\bar{y}$ からどれだけずれているかを表す指標です。総変動は、目的変数とその平均値の差の二乗和で求められます。

$$SS_y = \sum_{i=1}^{n}{(y_i - \bar{y})2}$$

# 目的変数とその平均値
y <- mtcars$mpg # 目的変数
bar_y <- mean(y) # 平均値

# 総変動
SS_y <- sum((y - bar_y)^2)

回帰変動の自由度 $df_R$、残差変動の自由度 $df_E$

回帰変動と残差変動の自由度は、それぞれの平方和を求める際に使ったデータの個数や制約の数によって決まります。

  • 全体の自由度はサンプル数 - 1($df_y = n - 1$)です。
  • 回帰変動の自由度は回帰係数の個数から 1 を引いた値です。単回帰モデルは回帰係数は $\beta_0$ と $\beta_1$ の 2 つなので、$df_R = 2 - 1 = 1$ です。
  • 残差変動の自由度は観測値の個数から回帰係数の個数を引いた値で、全体の自由度から回帰変動の自由度を引いた値です。今回、観測値は 32 個、回帰係数は 2 つなので、$df_E = df_y - df_R = 32 - 2 = 30$ です。
# 自由度
df_y <- nrow(mtcars) - 1 # 全体の自由度
df_R <- length(coefficients(model)) - 1 # 回帰変動の自由度
df_E <- df_y - df_R # 残差変動の自由度

回帰変動の平均平方 $MS_R$、残差変動の平均平方 $MS_E$

回帰変動と残差変動の平均平方は、それぞれの変動がどれだけ大きいかを表す指標です。

それぞれの平方和を対応する自由度で割って求めます。

$$MS_R = \frac{SS_R}{df_R}$$

$$MS_E = \frac{SS_E}{df_E}$$

# 平均平方
MS_y <- SS_y / df_y # 総変動の平均平方
MS_R <- SS_R / df_R # 回帰変動の平均平方
MS_E <- SS_E / df_E # 残差変動の平均平方

F 統計量と p 値

F 統計量は、回帰モデルが目的変数をどれだけ説明できるかを表す指標です。回帰モデルの当てはまりが良ければ、F 統計量は大きくなります。

回帰変動と残差変動の平均平方の比を求めます。

$$F = \frac{MS_R}{MS_E}$$

p 値は、F 統計量が得られる確率を表す指標です。回帰モデルが目的変数に有意な影響を与えていれば、p 値が小さくなります。

なお、このときの帰無仮説は次になります。

  • 帰無仮説 ( $H_0$ ): $\beta_1 = 0$(説明変数は目的変数に影響しない)
  • 対立仮説 ( $H_1$ ): $\beta_1 \neq 0$(説明変数は目的変数に影響する)
# F 統計量と p 値
F_R <- MS_R / MS_E # F統計量
p_R <- pf(F, df_R, df_E, lower.tail = FALSE) # p 値

分散分析表

回帰変動と誤差変動の平方和(SS)、自由度(DF)、平均平方(MS)、F 統計量(F_R)、および p 値(p_R)を分散分析表にまとて、単回帰モデルを評価します。

res <- data.frame(
  ID = c("Regression", "Residual", "Total"),
  DF = c(df_R, df_E, df_y),
  SS = c(SS_R, SS_E, SS_y),
  MS = c(MS_R, MS_E, MS_y),
  F = c(F_R, NA, NA),
  p = c(p_R, NA, NA)
)
cat("ANOVA table:")
res
ANOVA table:          ID DF        SS         MS        F            p
1 Regression  1  847.7252 847.725250 91.37533 1.293959e-10
2   Residual 30  278.3219   9.277398       NA           NA
3      Total 31 1126.0472  36.324103       NA           NA

F 統計量が 91.37533、p 値が 1.293959e-10 になりました。

p 値は十分に小さいので、この回帰モデルは単なる平均値よりも優れた予測力を持つとなります。

なお、これはanova(model)で同じ結果を取得できます。

anova(model)
Analysis of Variance Table

Response: mpg
          Df Sum Sq Mean Sq F value    Pr(>F)
wt         1 847.73  847.73  91.375 1.294e-10 ***
Residuals 30 278.32    9.28
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

回帰モデルの係数の分散分析と二元配置分散分析の違い

回帰モデルの係数の分散分析は、二元配置分散分析と計算方法が似ているので、分散分析の知識が役に立ちます。ですが、この 2 つは目的や仮定が違っています。注意が必要です。

目的 説明変数 説明変数間、因子間の関係 差の検定
回帰モデルの係数の分散分析 回帰モデルの精度、有意性を見る 連続値 相関、非線形性を考慮 係数がゼロと異なるかを t 検定
二元配置分散分析 因子が値に与える影響を見る カテゴリー 交互作用を考慮 因子水準間の平均値を F 検定

二元配置分散分析

カテゴリー変数の因子が値に与える影響を見るために、各因子水準間の平均値に差を F 検定で評価する。

平方和 自由度 平均平方 F 値 p 値
因子 A $SS_A = nb \sum{i = 1}^a (\bar{y}{i..} − \bar{y})2$ $a-1$ $MS_A = SS_A/(a-1)$ $F_A = MS_A/MS_E$ $p_A$
因子 B $SS_B = na \sum{j = 1}^b (\bar{y}{.j.} − \bar{y})2$ $b-1$ $MS_B = SS_B/(b-1)$ $F_B = MS_B/MS_E$ $p_B$
交互作用 $SS{AB} = n \sum{i = 1}^a \sum{j = 1}^b (\bar{y}{ij.} − \bar{y}{i..} − \bar{y}{.j.} + \bar{y})2$ $(a-1)(b-1)$ $MS{AB} = SS{AB}/*1$ $F{AB} = MS{AB}/MS_E$ $p_{AB}$
誤差 $SS_E = \sum{i = 1}^a \sum{j = 1}^b \sum{k = 1}^n ( y{ijk} − \bar{y}_{ij.})2$ $ab(n-1)$ $MS_E = SS_E/(ab(n-1))$ - -
総計 $SS_T = SS_A + SS_B + SS{AB} + SS_E = \sum{i = 1}^a \sum{j = 1}^b \sum{k = 1}^n ( y_{i j k} − \bar{y})2$ $abn-1$ - - -
  • $\bar{y}_{i..}$ :因子 A の水準 i の平均値
  • $\bar{y}_{.j.}$ :因子 B の水準 j の平均値
  • $\bar{y}_{ij.}$ :因子 A の水準 i と因子 B の水準 j の平均値
  • $\bar{y}$ :全体の平均値
  • $y_{ijk}$ :因子 A の水準 i、因子 B の水準 j、および実験単位 k の値
  • $a$ :因子 A の水準数
  • $b$ :因子 B の水準数
  • $n$ :各因子水準の組み合わせに対する実験単位の数

回帰モデルの係数の分散分析

回帰モデルの各説明変数が目的変数に与える影響、回帰モデルの精度や有意性を見るために、係数がゼロと異なるかどうかを t 検定で評価する。

変数 平方和 自由度 平均平方 F 値 p 値
説明変数 R1 $SS{R1} = \sum{i = 1}^n (\hat{y}_1 − \bar{y})2$ $ 1 $ $MS{R1} = SS{R1}/1$ $F_1 = MS_{R1}/MS_E$ $p_1$
説明変数 R2 $SS{R2} = \sum{i = 1}^n (\hat{y}2 − \hat{y}1)2$ $ 1 $ $MS{R2} = SS{R2}/1$ $F_2 = MS_{R2}/MS_E$ $p_2$
誤差 $SS_E = \sum{i = 1}^n (y_i − \hat{y}2)2$ $n-2$ $MS_E = SS_E/(n-2)$ - -
総計 $SS_T = SS{R1} + SS{R2} + SS_E = \sum_{i = 1}^n (y_i − \bar{y})2$ $n-1$ - - -

ここで、

  • $\hat{y}_1$ :説明変数 R1 のみを使った回帰モデルで予測された値
  • $\hat{y}_2$ :説明変数 R1 と R2 を使った回帰モデルで予測された値
  • $\bar{y}$ :目的変数の平均値
  • $y_i$ :目的変数の実測値

*1:a-1)(b-1

平方和のまとめ・その1

2 つの要因による効果とその交互作用を検討する統計手法が二元配置分散分析でした。

この方法は、ある値に対して要因 A と要因 B が紐づいたデータあるとき、要因 A の主効果、要因 B の主効果、要因 A と要因 B の交互作用の 3 つの効果を評価します。

二元配置分散分析の平方和

この評価に偏差平方和を使います。偏差平方和は集団の平均値からの乖離の程度を示しており、この差の大小でバラツキの程度が分かります。

分散分析は、ある値を要因と誤差で説明できると考えており、ある値のバラツキ(総変動, $SS_T$)は要素のバラツキ(要因の変動, $SS_A, SS_B$)と誤差のバラツキ(残差変動, $SS_E$)の合計と考えます。更に二元配置分散分析は、要因が組み合わさった時に生じる変動(交互作用の変動, $SS_{AB}$)も加わります。

$SS_T = SS_A + SS_B + SS_{AB} + SS_E$

これをまとめると次のようになります。

平方和の種類 名称 乖離の程度 数式
全体の平方和 総変動 各値と全体平均値 $$SS_T = \sum{i=1}^a \sum{j=1}^b \sum{k=1}^{n{ij}} (x_{ijk} - \bar{x})2$$
要因 A の平方和 要因 A の変動 要因 A の水準ごとの平均値と全体平均値 $$SS_A = b \sum{i=1}^a (\bar{x}{i\cdot\cdot} - \bar{x})2$$
要因 B の平方和 要因 B の変動 要因 B の水準ごとの平均値と全体平均値 $$SS_B = a \sum{j=1}^b (\bar{x}{\cdot j\cdot} - \bar{x})2$$
交互作用の平方和 交互作用の変動 要因 A と要因 B の水準ごとの組み合わせの平均値と要因 A と要因 B の水準ごとの平均値 $$SS{AB} = n \sum{i=1}^a \sum{j=1}^b (\bar{x}{ij\cdot} - \bar{x}{i\cdot\cdot} - \bar{x}{\cdot j\cdot} + \bar{x})2$$
残差(誤差)の平方和 残差(誤差)変動 各値と水準組み合わせごとの平均値 $$SS_E = \sum{i=1}^a \sum{j=1}^b \sum{k=1}^{n{ij}} (x{ijk} - \bar{x}{ij\cdot})2$$

不揃いデータの場合

ただし、データの偏りや欠損について注意が必要です。

二元配置分散分析に用いるデータは、すべての要因と水準でデータ数が等しい「等例数」、かつ欠損がない「完全配置」が理想的です。しかし、現実には実現できないこともあり、結果に影響を与える可能性が出てきます。

要因・水準の例数が違う場合(不等例数)

種類 方法 利点 欠点
タッカー法 水準の組み合わせ別の平均値を使う 各水準の組み合わせが 1 つのデータになるので、等例数と同じように扱える 各水準組み合わせのばらつき(残差変動)を無視するので、F 比が過大になりやすい
ウェルチ 水準の組み合わせ別の分散で重み付けした平方和を使う 各水準の組み合わせのばらつき(残差変動)を考慮するので、F 比が適切になる 自由度や F 比の計算が複雑になる
ハインツ法 水準の組み合わせ別の標準偏差で標準化した値を使う 各水準の組み合わせのばらつき(残差変動)を均一化するので、F 比が適切になる 標準化により単位や尺度を失うので、解釈が難しくなる

要因・水準が欠損値を持つ場合(欠損配置)

種類 方法 利点 欠点
除外 欠損値が含まれる水準組み合わせを分析から除外する 欠損値の影響を受けないので、F 比が適切になる データ数が減るので、分析の精度や検出力が低下する
補完 欠損値を何らかの方法で推定して補完する データ数が減らないので、分析の精度や検出力が低下しない 補完方法によって分析結果が変わる可能性があり、補完の妥当性や信頼性の評価が必要になる
混合モデル 固定効果とランダム効果を考慮した混合モデルを使う 欠損値のパターンやメカニズムに依存しないので、F 比が適切になる モデルの選択や推定に専門的な知識や技術が必要になる

このように、不均等数や欠損配置には慎重な対応が必要になります。

そして、この場合、平方和の計算方法も重要になります。これは、上にある総変動、要因 A、要因 B、交互作用、残差変動の平方和とは異なる平方和です。

この平方和については、別でまとめます。

回帰モデルの係数の分散分析のまとめ・その1

共分散分析で回帰分析の分散分析が出てきたので、少し整理します。

回帰分析を分散分析する目的

回帰分析の分散分析は、データを意思決定に利用するための方法です。

これを使えば、回帰モデルに用いた異なる要因(説明変数、因子など)が目的変数に与える影響を統計的に評価できます。

一般的な回帰モデルは以下の式で表されます。

$$ y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \ldots + \beta_n x_n + \varepsilon $$

  • $y$ : 目的変数
  • $x_1, x_2, \ldots, x_n$ : 説明変数、要因
  • $\beta_0, \beta_1, \beta_2, \ldots, \beta_n$ : 回帰係数(各説明変数の影響度)
  • $\varepsilon$ : 誤差項

この回帰モデルにおいて、異なる説明変数が目的変数に与える影響を評価するために分散分析を利用します。そして、回帰モデルや説明変数により目的変数の総変動(ばらつき)が減少(説明)する量を見ることで、その影響が分かります。

これには、以下の 2 つのアプローチがあります。

  • 回帰モデル全体の有意性評価:回帰モデルが目的変数をどれだけ説明できるかを見るために、回帰モデルと単なる平均値(切片だけのモデル)を比較する。
  • 特定の説明変数や切片に対する検定:各説明変数や切片が目的変数にどれだけ影響を与えるかを見るために、その係数が 0 であるかどうかを検定する。

評価の流れ

評価は大きく 2 つに分かれます。

  • 回帰モデルに対して目的変数の総変動、説明変数の変動(回帰変動)、残差の変動(誤差変動)を使った分散分析
  • 回帰係数に対する t 検定で、回帰係数が 0 でないことを統計的に確認する

そして、モデルの適合度、説明力、および各説明変数の重要性を評価します。

評価対象
モデルの適合度 回帰モデルの予測の信頼性を確認する。適合していれば、正しく予測できる可能性が高い。
説明力 説明変数が目的変数(応答変数)を説明する程度を評価する。重要な変数の特定に使えて、現象やプロセスの理解が深まる。
変数の重要性 目的変数に最も影響する変数を選択する(特徴選択:feature selection)。不要な変数を除き、モデルの複雑性を下げて、モデルの解釈性が上げる。

モデルの適合度の評価

誤差変動に対する各説明変数の統計的有意差を F 検定して、観測データに対するモデルの適合度を評価します。

説明力の評価

各説明変数の係数($\beta_1, \beta_2, \ldots, \beta_n$)に対して t 検定を行い、説明変数が目的変数に与える影響を評価します。

目的変数に対して有意な影響を持つ説明変数は、この p 値が小さい傾向があります。

変数の重要性の評価

各説明変数の係数の大きさ(絶対値)を評価します。

目的変数に与える影響が大きい説明変数は、係数が大きい傾向があります。

そのため、係数の絶対値が小さい説明変数の除外は、回帰モデルの解釈に有効です。

また、他の様々な情報を使って目的変数の要否を判断することも有効です。

分散分析表について

分散分析表は分散分析の結果の解釈に重要です。

回帰モデルの分散分析は、要因がカテゴリデータから連続値に代わるので、自由度の求め方が変わりますが、それ以外の要因に対しては変わりません。

モデル全体、説明変数、残差について、各要素の平方和(Sum of Squares, SS)、自由度(Degrees of Freedom, DF)、および平均平方(Mean Square, MS)を計算します。

項目 意味 記号
モデル全体 データ全体のばらつき $SS{y}$, $SS{T}$ $$SS{y} = \sum{i=1}^{n} (y_i - \bar{y})2$$
^ ^ $df{y}$, $df{T}$ $$df_{y} = n - 1$$
^ ^ $MS{y}$, $MS{T}$ $$MS{y} = \frac{SS{y}}{df_{y}}$$
説明変数 回帰モデルが説明できる目的変数の変動 $SS_{R}$ $$SS{R} = \sum{i=1}^{n} (\hat{y}_i - \bar{y})2$$
^ ^ $df_{R}$ $$df_{R} = \text{説明変数の数}$$
^ ^ $MS_{R}$ $$MS{R} = \frac{SS{R}}{df_{R}}$$
残差 モデルが説明できなかった目的変数の変動 $SS_{E}$ $$SS{E} = SS{y} - SS{R} = \sum{i=1}^{n} (y_i - \hat{y}_i)2$$
^ ^ $df_{E}$ $$df{E} = df{y} - df_{R} = n - 1 - \text{説明変数の数}$$
^ ^ $MS_{E}$ $$MS{E} = \frac{SS{E}}{df_{E}}$$
  • $n$: サンプルサイズ
  • $Y_i$: 個々の観測値、個々のデータ
  • $\bar{Y}$: 目的変数の平均
  • $\hat{Y}_i$: 回帰モデルの予測値

回帰係数の検定

分散分析で有意になれば、個々の回帰係数($\beta_i$)を t 検定して、目的変数に与える影響を確認します。

ここでの帰無仮説と対立仮説は、係数が 0 かどうかです。

  • $H_0: \beta_j = 0$
  • $H_1: \beta_j \neq 0$

そして、t 値は次の式になります。

$$ t_j = \frac{\hat{\beta}j}{\hat{\sigma}{\hat{\beta}_j}} $$

このとき、$\hat{\beta}j$ は $x_j$ の係数の推定値で、$\hat{\sigma}{\hat{\beta}j}$ は $\hat{\beta}j$ の標準誤差です。

そして、t 値は自由度 $n - (\text{説明変数の数}) - 1$ の t 分布に従うので、t 値を棄却域と比較すれば、回帰係数の目的変数に対する影響が分かります。

つまり、仮に単回帰分析で有意水準を $\alpha = 0.05$ にするなら、棄却域は $t_j < -t(0.025, n - 2)$ または $t_j > t(0.025, n - 2)$ です。

このt検定の部分は、別でまとめようと思います。

共分散分析のメモ・その1

交互作用が見つかる場合、二元配置分散分析をして、ad-hoc 解析をしてきました。そのため、共分散分析(ANCOVA)の必要性は高くなく、使う機会に恵まれなかった。

とはいえ、使わないから知らなくて良い、ってこともないので、まとめることにしました。

共分散分析(ANCOVA: Analysis of co-variance)とは

共分散分析(ANCOVA)は、分散分析(ANOVA: Analysis of Variance)と回帰分析を組み合わせた統計解析手法です。分散分析は、要因の水準が観測値の平均値に与える影響を検定するための方法で、要因が 1 つなら一元配置分散分析、2 つなら二元配置分散分析でした。

共分散分析は、回帰分析の特性を取り入れつつ、比較対象の要因(独立変数)以外の因子(共変量、Covariate)の影響を観測値(従属変数)から取り除き、要因の水準が測定値の平均値の差にどの程度影響を与えるのかを検討する方法です。なお、共分散分析は、回帰分析の性質を持つため、共変量が従属変数と線形の関係にあり、回帰直線が平行である場合に適しています。

共分散分析のモデル式: \displaystyle{
Y{ij} = \beta _ 0 + \beta _ 1 X{ij} + \beta _ 2 C _ i + \varepsilon _ {ij}
}

  • $Y_{ij}$: i 番目の条件(グループ)と j 番目の観測値(従属変数)
  • $X_{ij}$: i 番目の条件と j 番目の観測における要因の値(独立変数)
  • $C_i$: i 番目の条件に関連する共変量の値
  • $\beta_0$: 切片、$\beta_1$: 独立変数の係数、$\beta_2$: 共変量の係数
  • $\varepsilon_{ij}$: 誤差項(平均 0 の正規分布で互いに独立)

分散分析、重回帰分析との違い

共分散分析は分散分析と回帰分析を組み合わせた手法なので、数式の形も重回帰分析と類似しています。

方法 調査対象 説明変数 目的変数 式の形 特徴
共分散分析 群間の平均値の差 名義尺度、計量尺度 計量尺度 $y=a_1x_1+a_2x_2+...+b+e$ 共変量が平均値に与える効果を調整できる
分散分析 群間の平均値の差 名義尺度 計量尺度 $y=a_1x_1+a_2x_2+...+b+e$ 3 群以上でも比較できる
重回帰分析 説明変数と目的変数の関係 計量尺度 計量尺度 $y=a_1x_1+a_2x_2+...+b+e$ 回帰係数や決定係数などで関係性を評価できる

また、共分散分析を行う際に注意が必要な確認事項もあります。

対象 内容 対応
独立変数と共変量 相関、多重共線性 強ければ、共変量を除外する
独立変数と共変量 交互作用 有意ならば、交互作用項を除外する
従属変数 正規性、等分散性 保証できなければ、観測値を変換する

計算の流れ

ANCOVA の計算手順は一般的に以下の通りです:

  1. データの収集および準備:従属変数、独立変数、共変量のデータを収集、整理する。
  2. モデルの設定:数式を用いて ANCOVA のモデルを設定する。
  3. パラメータ推定:最小二乗法などを用いて、モデルのパラメータ(係数)を推定する。
  4. 仮説検定:推定されたパラメータを用いて、独立変数の水準が従属変数に与える影響を検定する。
  5. 共変量の調整:共変量の効果を考慮し、要因の水準間を比較する。
  6. 結果の解釈:統計的有意性の評価結果を解釈する。

分散分析のメモ・その3

分散分析と F 検定の関係が分からなくなることが多いのでメモ

二元配置分散分析(Two-Way ANOVA)

分散分析は、3 つ以上の群の平均値に差があるかどうかを評価する統計手法で、異なる条件や処理が平均値に与える影響を評価できる。な お、二元配置分散分析は、要因数が 2 種類の分散分析。

各々の群について、処理の影響を示す群間分散と処理と関係のない群内分散を求める。次に、群内分散に対する群間分散の比を求める。そして、この比を F 値として、F 分布から p 値を求める。このとき、二元配置分散分析は、異なる条件や処理が同時に作用したときの効果(交互作用)を評価することが特徴になる。なお、このときの帰無仮説は「すべての群の平均値が等しい」になる。

対応のない二元配置分散分析

一元配置分散分析は 1 要因の各水準からなる群に対して要因分散と誤差分散を求めて、誤差分散に対する要因分散の比が F 値になりました。

二元配置分散分析は、要因が 2 に増えますが、計算手順は一元配置分散分析と同じく誤差分散に対する要因分散の比を求めます。ただし、2 つの要因に加えて、その交互作用を計算する点が異なります。 そして、$F_A$、$F_B$、$F_{AB}$のそれぞれについて F 検定を行い、有意差を確認します。

F 値の式

対応のない二元配置分散分析の場合、個体間の変動を考慮しない。

交互作用と誤差の自由度の計算に注意して、要因 A、要因 B、交互作用、誤差について、それぞれの変動、自由度から分散を計算できる。

項目 変動 ($SS$) 自由度 ($\nu$, $df$) 分散 F 値
全体 $$SS_T = \sum{i=1}^a \sum{j=1}^b \sum{k=1}^{n{ij}} (X{ijk} - \overline{X}{..})2$$ $$\nu_T = N - 1$$ $$-$$ $$-$$
要因 A $$SS_A = \sum{i=1}^a n{i} (\overline{X}{i.} - \overline{X}{..})2$$ $$\nu_A = a - 1$$ $$MS_A = \frac{SS_A}{\nu_A}$$ $$F_A = \frac{MS_A}{MS_E}$$
要因 B $$SS_B = \sum{j=1}^b n{j} (\overline{X}{.j} - \overline{X}{..})2$$ $$\nu_B = b - 1$$ $$MS_B = \frac{SS_B}{\nu_B}$$ $$F_B = \frac{MS_B}{MS_E}$$
交互作用 $$SS{AB} = \sum{i=1}^a \sum{j=1}^b n{ij} (\overline{X}{ij} - \overline{X}{i.} - \overline{X}{.j} + \overline{X}{..})2$$ $$\nu_{AB} = ab - 1 - \nu_A - \nu_B = \nu_A \times \nu_B$$ $$MS{AB} = \frac{SS{AB}}{\nu_{AB}}$$ $$F{AB} = \frac{MS{AB}}{MS_E}$$
誤差 $$SS_E = SS_T - SS_A -SS_B -SS{AB} \= \sum{i=1}^a \sum{j=1}^b \sum{k=1}^{n{ij}} (X{ijk} - \overline{X}_{ij})2$$ $$\nu_E = N - ab = \nu_T - \nu_A - \nu_B - \nu_{AB}$$ $$MS_E = \frac{SS_E}{\nu_E}$$ $$-$$
  • サンプル数
    • $N$ $\cdots$ 全観測値の数
    • $n_i$ $\cdots$ 要因 A の第 $i$ 水準に属する観測値の数
    • $n_j$ $\cdots$ 要因 B の第 $j$ 水準に属する観測値の数
    • $n_{ij}$ $\cdots$ 要因 A の第 $i$ 水準と要因 B の第 $j$ 水準に属する観測値の数 (繰り返し測定数)
  • 水準数
    • $a$ $\cdots$ 要因 A の水準数
    • $b$ $\cdots$ 要因 B の水準数
  • 観測値
    • $X_{ijk}$ $\cdots$ 要因 A の第 $i$ 水準と要因 B の第 $j$ 水準に属する $k$ 番目の観測値
    • $\overline{X}_{i.}$ $\cdots$ 要因 A の第 $i$ 水準に属する観測値の平均
    • $\overline{X}_{.j}$ $\cdots$ 要因 B の第 $j$ 水準に属する観測値の平均
    • $\overline{X}_{ij}$ $\cdots$ 要因 A の第 $i$ 水準と要因 B の第 $j$ 水準に属する観測値の平均
    • $\overline{X}_{..}$ $\cdots$ 全観測値の平均

R で実装する

F 値と p 値は、対応無しの場合と同様に計算します。

デモデータの作成

デモ用のデータを作成します。このデータは、3 つの水準(A, B, C)を持つ要因 A(gA)と、2 つの水準(a, b)を持つ要因 B (gB)によって分類された測定値(value)からなります。

rm(list=ls(all=TRUE))
set.seed(123) # 乱数のシードを固定
data <- data.frame(
  gA = factor(rep(LETTERS[1:3], each = 4)), # 要因A、3水準
  gB = factor(rep(letters[1:2], each = 2)), # 要因B、2水準
  value = unlist(lapply(c(1, 4) * 40, sample, size = 6, replace = TRUE)) # 測定値
)

knitr::kable(sapply(levels(data$gA), function(i) {
  sapply(levels(data$gB), function(j) {
    paste(subset(data, subset = gA == i & gB == j)$value, collapse = ",")
  })
}))
A B C
a 31,15 37,14 90,91
b 14,3 118,153 91,92

表の形は対応のある一元配置分散分析と同じ。

でも、対応のある一元配置分散分析が a と b は互いに影響しない(独立になる)ことに対して、対応のない二元配置分散分析は a と b は互いに影響しあう可能性、交互作用を考えることになる。

ここが大きく違う点で、要因A、要因Bに加えて、交互作用に対してもF検定をすることになる。

分散分析の関数を使わない

# 各水準の観測個数
nij <- table(data[,-3])

# 総変動
# 平均
mean_T <- mean(data$value)
# 変動、偏差平方和
ss_T <- sum((data$value - mean_T)^2)
# 自由度、総データ数 - 1
df_T <- nrow(data) - 1

# 要因A
# 平均
mean_A <- as.vector(tapply(data$value, data$gA, mean))
# 変動、偏差平方和
ss_A <- sum((mean_A[data$gA] - mean_T)^2)
# 自由度、水準数 - 1
df_A <- length(levels(data$gA)) - 1
# 分散
ms_A <- ss_A / df_A

# 要因B
# 平均
mean_B <- as.vector(tapply(data$value, data$gB, mean))
# 変動、偏差平方和
ss_B <- sum((mean_B[data$gB] - mean_T)^2)
# 自由度、水準数 - 1
df_B <- length(levels(data$gB)) - 1
# 分散
ms_B <- ss_B / df_B

# 交互作用
# 平均
mean_AB <- tapply(data$value, list(data$gA, data$gB), mean)
# 変動、偏差平方和
ss_AB <- sum(nij*t(t(mean_AB - mean_A) - mean_B + mean_T)^2)
# 自由度、(要因A水準数 - 1)(要因B水準数 - 1)
df_AB <- df_A*df_B
# 分散
ms_AB <- ss_AB / df_AB

# 誤差
# 変動、偏差平方和
ss_E <- ss_T - ss_A - ss_B - ss_AB
# ss_E <- sum((data$value - mapply(rep, t(mean_AB), t(nij)))^2)
# 自由度、(要因A水準数 - 1)(要因B水準数 - 1)
df_E <- df_T - df_A - df_B - df_AB
# 分散
ms_E <- ss_E / df_E

# F値、要因分散/誤差分散
f_A <- ms_A / ms_E
f_B <- ms_B / ms_E
f_AB <- ms_AB / ms_E

# F値からp値を求める
p_A <- pf(f_A, df_A, df_E, lower.tail = FALSE)
p_B <- pf(f_B, df_B, df_E, lower.tail = FALSE)
p_AB <- pf(f_AB, df_AB, df_E, lower.tail = FALSE)

# 結果の表示
cat("factor A - F-value:", round(f_A, 2), "/ p-value:", round(p_A, 4), "\n")
cat("factor B - F-value:", round(f_B, 2), "/ p-value:", round(p_B, 4), "\n")
cat("factor AB - F-value:", round(f_AB, 2), "/ p-value:", round(p_AB, 4), "\n")
factor A - F-value: 37.38 / p-value: 4e-04
factor B - F-value: 17.46 / p-value: 0.0058
factor AB - F-value: 25.9 / p-value: 0.0011

分散分析の関数を使う

二元配置分散分析は 2 要因を$\ast$で繋ぐ。

# 対応のある一元配置分散分析
res <- aov(value ~ gA * gB, data = data)
summary(res)
            Df Sum Sq Mean Sq F value  Pr(>F)
gA           2  13287    6644   37.38 0.00041 ***
gB           1   3104    3104   17.46 0.00582 **
gA:gB        2   9207    4604   25.90 0.00112 **
Residuals    6   1067     178
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
要因 F 値 p 値 $\alpha$ = 0.05 $\alpha$ = 0.01
要因 A 37.38 0.00041 有意差あり 有意差あり
要因 B 17.46 0.00582 有意差あり 有意差あり
交互作用 25.90 0.00112 有意差あり 有意差あり

つまり、いずれの要因も有意差があって、交互作用もある、という結果になる。

ただし、交互作用に有意差があっても、要因 A と要因 B のどの水準の組み合わせに有意差があるのかは分からない。

この先の解析は多重比較になる。