# 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の範囲にある」ことを意味します。
### 散布図で関係を確認
実際のデータと回帰直線を可視化してみましょう:

このグラフから、身長と体重に明確な正の相関があることが分かります。赤い直線が推定された回帰直線で、グレーの範囲が信頼区間を表しています。
## 重回帰分析での係数解釈
重回帰分析では複数の説明変数を同時に使います。この場合、各係数は「他の変数を一定に保ったときの効果」を表すことが重要なポイントです。
### 複数の変数を含むデータの作成
```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 の回帰分析での違い]] も参照してください。