医学統計や実験データの解析において、回帰分析は最も基本的かつ重要な統計手法の一つです。回帰係数の意味を理解することで、データから得られた結果を正しく解釈できるようになります。 この記事では、Stataを使って回帰係数の基本概念から実践的な応用まで、段階的に学習していきます。 ## 回帰分析とは 回帰分析は、ある変数(従属変数・結果変数)が他の変数(独立変数・説明変数)によってどの程度説明できるかを調べる統計手法です。 ### 数学的な表現 単回帰分析の基本形は以下のようになります: $y = \beta_0 + \beta_1 x + \varepsilon$ ここで: - $y$:従属変数(予測したい変数) - $x$:独立変数(説明変数) - $\beta_0$:切片(intercept) - $\beta_1$:回帰係数(slope) - $\varepsilon$:誤差項 重回帰分析では複数の説明変数を含みます: $y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \cdots + \beta_k x_k + \varepsilon$ ### 中学校で学んだ式との関係 実は、回帰分析の基本形は中学校で学んだ一次関数 $y = ax + b$ と同じ構造です: - $\beta_0$ が $b$(y切片)に対応 - $\beta_1$ が $a$(傾き)に対応 違いは、実際のデータには必ず誤差があるため、$\varepsilon$(誤差項)が加わっている点です。 ## 実際のデータで回帰係数を理解しよう ### 単回帰分析:身長と体重の関係 まず、身長と体重のデータを作成して単回帰分析を行います。 ```stata * データの作成 clear set obs 50 set seed 123 * 身長データの生成(平均170cm、標準偏差10cm) gen height = rnormal(170, 10) * 体重データの生成(身長との関係を含む) gen weight = 0.8 * height - 70 + rnormal(0, 5) * データの確認 list height weight in 1/10 summarize height weight ``` 次に、身長を説明変数、体重を従属変数とした単回帰分析を実行します: ```stata * 単回帰分析の実行 regress weight height * 回帰直線を描画した散布図の作成 twoway (scatter weight height) (lfit weight height), /// title("身長と体重の関係(単回帰分析)") /// xlabel(, grid) ylabel(, grid) /// legend(label(1 "観測値") label(2 "回帰直線")) * 図を保存 graph export "regression_scatter_plot.png", replace width(800) height(600) ``` ![身長と体重の関係](regression_scatter_plot.png) ### 回帰結果の解釈 Stataの出力結果を見てみましょう: ```stata Source | SS df MS Number of obs = 50 -------------+------------------------------ F( 1, 48) = 269.45 Model | 6738.29706 1 6738.29706 Prob > F = 0.0000 Residual | 1200.40506 48 25.0084386 R-squared = 0.8489 -------------+------------------------------ Adj R-squared = 0.8458 Total | 7938.70212 49 162.015758 Root MSE = 5.0008 ------------------------------------------------------------------------------ weight | Coef. Std. Err. t P>|t| [95% Conf. Interval] -------------+---------------------------------------------------------------- height | .7824178 .0476718 16.41 0.000 .6863678 .8784679 _cons | -67.82147 8.134567 -8.34 0.000 -84.23026 -51.41268 ------------------------------------------------------------------------------ ``` この結果から: - **height の係数(.7824178)**: 身長が1cm増加すると体重が約0.78kg増加 - **_cons(切片、-67.82147)**: 身長が0cmの時の体重の予測値(実際には意味を持たない) 中学校の数学と対応させると: - $a = 0.78$(傾き) - $b = -67.82$(切片) つまり、回帰式は $体重 = 0.78 \times 身長 - 67.82$ となります。 ### 実際の例で係数を確認 身長170cmの人の予測体重を計算してみます: ```stata * 予測値の計算例 display "身長170cmの予測体重: " 0.7824178 * 170 + (-67.82147) ``` 結果:$0.78 \times 170 - 67.82 = 65.19$kg ## 複数の変数を含むデータの解析 実際の医学研究では、複数の要因が結果に影響します。身長、年齢、性別が体重に与える影響を調べてみましょう。 ```stata * 複数変数のデータ作成 clear set obs 100 set seed 456 * 年齢データ(20-70歳) gen age = int(runiform() * 51) + 20 * 身長データ(平均170cm、標準偏差8cm) gen height = rnormal(170, 8) * 性別データ(0:女性、1:男性) gen gender = rbinomial(1, 0.5) * 体重データ(身長、年齢、性別の影響を含む) gen weight = 0.7 * height + 0.2 * age + 5 * gender - 50 + rnormal(0, 4) * 性別にラベルを設定 label define gender_lb 0 "女性" 1 "男性" label values gender gender_lb * データの確認 summarize height age gender weight ``` ### 重回帰分析の実行 ```stata * 重回帰分析 regress weight height age gender * 結果の表示 ``` この分析では、以下のような結果が得られます: - **height の係数**: 身長の1cm増加に対する体重変化(他の変数を調整した効果) - **age の係数**: 年齢の1歳増加に対する体重変化(身長と性別を調整した効果) - **gender の係数**: 男性と女性の体重差(身長と年齢を調整した効果) ### カテゴリ変数と参照群 性別のような二値変数では、一方の群(通常は0)が参照群となります: ```stata * 性別を明示的にカテゴリ変数として指定 regress weight height age i.gender ``` この場合: - **参照群**: 女性(gender = 0) - **比較群**: 男性(gender = 1) - **gender の係数**: 女性と比較した時の男性の体重差 ## Table 2 Fallacy について 重回帰分析を行う際の重要な注意点として、「Table 2 Fallacy」があります。これは、主要な説明変数と調整変数では、調整の意味が異なることを理解せずに結果を解釈してしまう誤りです。 - **主要な説明変数**: 研究で注目している要因の効果を知りたい変数 - **調整変数**: 交絡を防ぐために統計的に調整する変数 調整変数の係数には直接的な因果関係の意味を与えるべきではありません。 ## 完全動作コード 以下は、この記事で説明した全ての解析を実行できるコードです: ```stata * ==================================== * Stata - 回帰係数を理解しよう:完全版 * ==================================== * 1. 単回帰分析の例 clear set obs 50 set seed 123 * データ生成 gen height = rnormal(170, 10) gen weight = 0.8 * height - 70 + rnormal(0, 5) * 単回帰分析 regress weight height * 散布図と回帰直線の作成 twoway (scatter weight height) (lfit weight height), /// title("身長と体重の関係(単回帰分析)") /// xlabel(, grid) ylabel(, grid) /// legend(label(1 "観測値") label(2 "回帰直線")) graph export "regression_scatter_plot.png", replace width(800) height(600) * 予測値の計算例 display "身長170cmの予測体重: " _b[height] * 170 + _b[_cons] * 2. 重回帰分析の例 clear set obs 100 set seed 456 * 複数変数のデータ作成 gen age = int(runiform() * 51) + 20 gen height = rnormal(170, 8) gen gender = rbinomial(1, 0.5) gen weight = 0.7 * height + 0.2 * age + 5 * gender - 50 + rnormal(0, 4) * ラベル設定 label define gender_lb 0 "女性" 1 "男性" label values gender gender_lb * 重回帰分析 regress weight height age i.gender * データの要約統計 summarize height age gender weight display "解析完了: 回帰係数の理解" ```