# R - 回帰係数を理解しよう ## まとめ:回帰係数で理解すべきポイント 1. **単回帰の係数**:説明変数が1単位増えると、目的変数がどれだけ変化するか 2. **重回帰の係数**:他の変数を固定したときの、その変数だけの効果 3. **切片(Intercept)**:すべての説明変数が0のときの目的変数の値 4. **カテゴリ変数**:参照グループとの比較での差 5. **p値**:その係数が偶然でないかの確率(0.05未満なら有意) 6. **信頼区間**:真の値が含まれる範囲の推定 **重要な注意点**:重回帰分析では、主要な説明変数と調整変数では調整の意味が異なります(Table 2 fallacy; Westreich & Greenland, 2013)。調整変数の係数は、主要変数を調整した後の「直接効果」を表すため、その変数単独の総合的な効果とは意味が異なることがあります。 ## 回帰係数とは 回帰係数(regression coefficient)は、説明変数が1単位変化したときに、目的変数がどの程度変化するかを表す重要な数値です。 ### 回帰式の基本形 線形回帰モデルは以下の数式で表されます: $y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \cdots + \beta_k x_k + \varepsilon$ **実は、これは中学校で習った $y = ax + b$ と同じ考え方です。** 中学校の1次関数と比較してみましょう: - 中学校の式:$y = ax + b$ - 回帰分析の式:$y = \beta_0 + \beta_1 x_1$ (説明変数が1つの場合) 対応関係: - $a$(傾き) ↔ $\beta_1$(回帰係数) - $b$(切片) ↔ $\beta_0$(切片) - $x$(変数) ↔ $x_1$(説明変数) 違いは、回帰分析では複数の説明変数($x_1, x_2, \ldots$)を同時に扱い、誤差項 $\varepsilon$ も含めることです。 この式の各部分を詳しく説明すると: - $y$:目的変数(予測したい値) - $\beta_0$:切片(intercept)- すべての説明変数が0のときの$y$の値 - $\beta_1, \beta_2, \ldots$:回帰係数 - 各説明変数$x$が$y$に与える影響の大きさ - $x_1, x_2, \ldots$:説明変数(予測に使う値) - $\varepsilon$:誤差項(モデルで説明できない部分) ## 単回帰分析での係数解釈 単回帰分析は、1つの説明変数で1つの目的変数を予測する最もシンプルな回帰分析です。 ### データの作成 まずは、身長から体重を予測する例で学習しましょう。 ```R # 乱数の種を固定(再現可能な結果を得るため) set.seed(123) # データ数を設定 n <- 50 # 身長データを作成(平均170cm、標準偏差10cmの正規分布) height <- rnorm(n, mean = 170, sd = 10) # 体重データを作成(身長に基づいて計算 + ランダムなノイズ) # 実際の式:体重 = 0.8 × 身長 - 70 + ノイズ weight <- 0.8 * height - 70 + rnorm(n, mean = 0, sd = 5) # データフレームを作成 df <- data.frame(height = height, weight = weight) # 最初の6行を確認 head(df) ``` このコードの説明: - `set.seed(123)`:乱数を固定して、誰が実行しても同じ結果になるようにする - `rnorm(n, mean, sd)`:正規分布から乱数を生成する関数 - `data.frame()`:列ごとにデータをまとめてテーブル形式にする ### 回帰分析の実行 ```R # 単回帰分析を実行 # weight ~ height は「体重を身長で予測する」という意味 model1 <- lm(weight ~ height, data = df) # 結果を詳しく表示 summary(model1) ``` `lm()`関数の説明: - `lm`は「linear model(線形モデル)」の略 - `weight ~ height`:「weight(目的変数) ~ height(説明変数)」 - `data = df`:使用するデータセットを指定 ### 結果の読み方 ``` Call: lm(formula = weight ~ height, data = df) Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -67.8234 7.2856 -9.309 1.77e-12 *** height 0.7845 0.0426 18.422 < 2e-16 *** Residual standard error: 4.95 on 48 degrees of freedom Multiple R-squared: 0.876, Adjusted R-squared: 0.8734 F-statistic: 339.4 on 1 and 48 DF, p-value: < 2.2e-16 ``` 各項目の意味: **Coefficients(係数)の部分**: この結果から、回帰式 $y = \beta_0 + \beta_1 x$ の係数が以下のように推定されました: - $\beta_0$(切片、Intercept)= -67.8234 - $\beta_1$(回帰係数、height)= 0.7845 つまり、推定された回帰式は: $\text{体重} = -67.8234 + 0.7845 \times \text{身長}$ 中学校で習った $y = ax + b$ に当てはめると: - $a$(傾き)= 0.7845 → 身長が1cm増えると体重が0.7845kg増加 - $b$(切片)= -67.8234 → 身長が0cmのとき体重が-67.82kg(現実的ではないが計算上必要) 各値の詳細: - `(Intercept) -67.8234`:$\beta_0$、身長が0cmのときの予測体重 - `height 0.7845`:$\beta_1$、身長1cm増加に対する体重の変化量 - `Std. Error`:係数の標準誤差(推定値の不確実性を表す) - `t value`:t検定の統計量 - `Pr(>|t|)`:p値。この係数が偶然である確率 **全体的な当てはまり**: - `Multiple R-squared: 0.876`:決定係数。身長で体重の87.6%が説明できる - `p-value: < 2.2e-16`:モデル全体の有意性 ### 信頼区間の確認 係数の推定にはどの程度の不確実性があるかを確認しましょう。 ```R # 係数の95%信頼区間を表示 confint(model1) ``` ``` 2.5 % 97.5 % (Intercept) -82.47504 -53.17168 height 0.69862 0.87046 ``` この結果は、「身長の真の係数は95%の確率で0.70〜0.87の範囲にある」ことを意味します。 ### 散布図で関係を確認 実際のデータと回帰直線を可視化してみましょう: ![身長と体重の関係](regression_scatter_plot.png) このグラフから、身長と体重に明確な正の相関があることが分かります。赤い直線が推定された回帰直線で、グレーの範囲が信頼区間を表しています。 ## 重回帰分析での係数解釈 重回帰分析では複数の説明変数を同時に使います。この場合、各係数は「他の変数を一定に保ったときの効果」を表すことが重要なポイントです。 ### 複数の変数を含むデータの作成 ```R # 新しいデータセットを作成 set.seed(456) n <- 100 # 年齢:20歳から70歳までランダムに選択 age <- sample(20:70, n, replace = TRUE) # 身長:平均170cm、標準偏差8cmの正規分布 height <- rnorm(n, mean = 170, sd = 8) # 性別:0(女性)と1(男性)をランダムに割り当て gender <- sample(c(0, 1), n, replace = TRUE) # 体重を複雑な式で作成 # 体重 = 0.7×身長 + 0.2×年齢 + 5×性別(男性なら+5kg) - 50 + ノイズ # 数式で表すと: weight = 0.7×height + 0.2×age + 5×gender - 50 + ε weight <- 0.7 * height + 0.2 * age + 5 * gender - 50 + rnorm(n, sd = 4) # データフレームを作成 df2 <- data.frame(height = height, age = age, gender = gender, weight = weight) # データの最初の数行を確認 head(df2) ``` ### 重回帰分析の実行 ```R # 重回帰分析を実行 # 体重を身長・年齢・性別で予測 model2 <- lm(weight ~ height + age + gender, data = df2) # 結果を表示 summary(model2) ``` ### 偏回帰係数の解釈 ``` Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -48.2156 5.7234 -8.426 1.89e-13 *** height 0.6834 0.0342 19.984 < 2e-16 *** age 0.2124 0.0187 11.357 < 2e-16 *** gender 4.8372 0.7821 6.188 1.28e-08 *** ``` 各係数の意味: 1. **身長(height): 0.6834** - **意味**:年齢と性別を同じ値に固定した場合、身長が1cm増加すると体重が0.68kg増加 - **注意**:これは身長だけの効果ではなく、年齢と性別を調整した後の効果 2. **年齢(age): 0.2124** - **意味**:身長と性別を同じ値に固定した場合、年齢が1歳増加すると体重が0.21kg増加 - **解釈**:同じ身長・性別の人を比較すると、年齢が上がるにつれて体重も増える 3. **性別(gender): 4.8372** - **意味**:身長と年齢を同じ値に固定した場合、男性(gender=1)は女性(gender=0)より4.84kg重い - **解釈**:同じ身長・年齢なら、男性の方が約5kg重い ## カテゴリ変数と回帰係数 数値ではなく、カテゴリ(グループ)を表す変数の扱い方を学びましょう。 ### factor型変数への変換 ```R # 性別を数値からラベル付きのカテゴリ変数に変換 df2$gender_factor <- factor(df2$gender, levels = c(0, 1), labels = c("女性", "男性")) # factor型を使って回帰分析 model3 <- lm(weight ~ height + age + gender_factor, data = df2) # 結果を確認 summary(model3) ``` factor型の説明: - `levels = c(0, 1)`:元の数値での順序を指定 - `labels = c("女性", "男性")`:表示用のラベルを指定 - 最初のカテゴリ(女性)が自動的に参照カテゴリになる 結果の読み方: ``` Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -48.2156 5.7234 -8.426 1.89e-13 *** height 0.6834 0.0342 19.984 < 2e-16 *** age 0.2124 0.0187 11.357 < 2e-16 *** gender_factor男性 4.8372 0.7821 6.188 1.28e-08 *** ``` `gender_factor男性`の係数4.8372は、「参照カテゴリ(女性)と比較した男性の効果」を表します。 ### 3つ以上のカテゴリがある場合 ```R # 教育レベルという新しいカテゴリ変数を追加 df2$education <- sample(c("高校", "大学", "大学院"), n, replace = TRUE) # factor型に変換(順序を指定) df2$education <- factor(df2$education, levels = c("高校", "大学", "大学院")) # 新しい変数を含めて回帰分析 model4 <- lm(weight ~ height + age + gender + education, data = df2) # 係数の部分のみ表示 summary(model4)$coefficients ``` この場合、「高校」が参照カテゴリとなり、「大学」と「大学院」の効果が別々に推定されます。 ## 完全なRコード集(コピペ用) 以下のコードをすべてコピーしてRに貼り付けると、この記事の内容をすべて実行できます: ```R # ==================================== # R - 回帰係数を理解しよう:完全コード # ==================================== # 必要なパッケージを読み込み library(ggplot2) library(broom) # ========== 1. 単回帰分析 ========== # データ作成 set.seed(123) n <- 50 height <- rnorm(n, mean = 170, sd = 10) weight <- 0.8 * height - 70 + rnorm(n, mean = 0, sd = 5) df <- data.frame(height = height, weight = weight) # データ確認 print("=== 単回帰用データ ===") head(df) # 単回帰分析 model1 <- lm(weight ~ height, data = df) print("=== 単回帰分析結果 ===") summary(model1) # 信頼区間 print("=== 係数の95%信頼区間 ===") confint(model1) # ========== 2. 重回帰分析 ========== # 複数の変数を含むデータ作成 set.seed(456) n <- 100 age <- sample(20:70, n, replace = TRUE) height <- rnorm(n, mean = 170, sd = 8) gender <- sample(c(0, 1), n, replace = TRUE) weight <- 0.7 * height + 0.2 * age + 5 * gender - 50 + rnorm(n, sd = 4) df2 <- data.frame(height = height, age = age, gender = gender, weight = weight) # データ確認 print("=== 重回帰用データ ===") head(df2) # 重回帰分析 model2 <- lm(weight ~ height + age + gender, data = df2) print("=== 重回帰分析結果 ===") summary(model2) # ========== 3. カテゴリ変数 ========== # factor型に変換 df2$gender_factor <- factor(df2$gender, levels = c(0, 1), labels = c("女性", "男性")) # factor型での回帰分析 model3 <- lm(weight ~ height + age + gender_factor, data = df2) print("=== factor型での回帰分析結果 ===") summary(model3) # 3つのカテゴリを持つ変数 df2$education <- sample(c("高校", "大学", "大学院"), n, replace = TRUE) df2$education <- factor(df2$education, levels = c("高校", "大学", "大学院")) model4 <- lm(weight ~ height + age + gender + education, data = df2) print("=== 教育レベルを含む回帰分析結果 ===") print(summary(model4)$coefficients) # ========== 4. 可視化 ========== # 係数のプロット model_tidy <- tidy(model2, conf.int = TRUE) model_tidy <- model_tidy[model_tidy$term != "(Intercept)", ] p1 <- ggplot(model_tidy, aes(x = term, y = estimate)) + geom_point(size = 3, color = "blue") + geom_errorbar(aes(ymin = conf.low, ymax = conf.high), width = 0.2, color = "blue") + geom_hline(yintercept = 0, linetype = "dashed", color = "red") + coord_flip() + labs(title = "回帰係数と95%信頼区間", x = "変数", y = "係数の推定値") + theme_minimal() print(p1) print("=== 分析完了 ===") print("各係数は他の変数を調整した効果を表しています") print("Table 2 fallacy に注意:単変量と多変量の結果は異なることがあります") ``` 詳細な変数タイプの違いについては [[R - factor と numeric の回帰分析での違い]] も参照してください。