重回帰分析:「他の変数を固定したとき」の正体は残差だった【第16回】

はじめに

第16章は重回帰分析です。前回(第15回・ノンパラメトリック法)で推測統計編が終わり、ここから線形モデル編に入ります。

この回だけは、私にとって事情が違いました。最小二乗法は手が動く範囲だからです。実務でも過去の勉強でも触ってきたので、y=ax+by = ax + baabb を残差の2乗和の最小化で求める、という話は分かっているつもりでした。

ところが「分かっているつもり」の中身が空洞でした。

具体的には、こういう質問に答えられませんでした。係数の標準誤差はどこから来るのか。(XX)1σ2(X^\top X)^{-1}\sigma^2 という形は何を意味しているのか。決定係数は何を測っているのか。なぜ変数を増やすと必ず上がるのか。そして偏回帰係数の「他の変数を固定したとき」——実際には固定していないのに、なぜそう解釈できるのか。

いちばん大きかった発見を先に書きます。重回帰の係数は、2段階の単回帰と小数10桁まで一致します。 「他の変数を固定する」の正体は「他の変数で説明できる分を引き算しておく」ことでした。そしてこれが分かると、多重共線性・VIF・標準誤差が全部同じ1つのトレードオフの話だと繋がります。

この記事で使う言葉

先に5つだけ整理します。この記事はこの5語で回ります。

偏回帰係数(partial regression coefficient):重回帰の各係数のこと。「偏」は「他の変数の影響を除いた」という意味で、偏微分の「偏」と同じ発想です。単回帰の係数と区別するためにこう呼びます。

多重共線性(multicollinearity):説明変数どうしが強く相関している状態。「共線性」は「同じ線に乗っている」という意味で、複数の変数がほぼ同じ情報を持っていることを指します。

VIF(Variance Inflation Factor=分散拡大係数):字面のまま「分散を膨らませる係数」。ある説明変数が他の説明変数とどれだけ重複しているかを表し、VIF=4\mathrm{VIF} = 4 なら係数の分散が4倍、標準誤差は 4=2\sqrt{4} = 2 倍になります。

列空間(column space):説明変数の列を足したり伸ばしたりして作れるベクトル全体の集まり。この記事では「平面」と呼びます。最小二乗法はこの平面に垂線を下ろす操作です。厳密には列が3本以上なら平面ではなく pp 次元部分空間で、その次元は列の本数ではなく rank で決まります(後述)。

ハット行列(hat matrix)H=X(XX)1XH = X(X^\top X)^{-1}X^\top のこと。y^=Hy\hat y = Hy となり、yy に帽子(hat)をかぶせるのでこの名前です。

なお略語について1つ注意です。pp が2つの意味で使われます。 「パラメータの数(npn-ppp)」と「p値(有意確率)」はまったく別物で、統計の悪しき慣習です。この記事ではパラメータ数を pp、p値は「p値」と書いて区別します。

TL;DR

  • 最小二乗法は射影だった。 (XX)1X(X^\top X)^{-1}X^\top は「残差が説明変数と直交する」という条件を β\beta について解いた結果。n=3n=3 の例で y2=y^2+e2|y|^2 = |\hat y|^2 + |e|^2122=116+6122 = 116 + 6)を確認
  • 単回帰の「共分散÷分散」は射影の言い換え。 x~y~/x~x~\tilde x^\top \tilde y / \tilde x^\top \tilde x の分子分母を同じ n1n-1 で割っただけ。実データで小数10桁まで一致
  • 層を無視すると符号が反転する。 文字数とPVの単回帰は +61.47+61.47 だが、ジャンルを入れた重回帰は 40.08-40.08(真の値 40-40)。3ジャンルすべての内部では右下がり
  • ただし「とりあえず全部入れる」は誤り。 交絡因子は入れる(+59.440.0+59.4 \to -40.0 で正解)、媒介変数は問いで決める、合流点は入れると効果ゼロが 27.0-27.0 に化ける
  • 標準誤差は「データを取り直したら係数がどれだけ動くか」。 β^β=Aε\hat\beta - \beta = A\varepsilon から V[β^]=σ2(XX)1V[\hat\beta] = \sigma^2(X^\top X)^{-1} が1行で出る。4000回の実測sd 4.6353 に対し公式SE 4.6920
  • σ2\sigma^2npn-p で割る理由:nn で割ると E[s2]=1166.0E[s^2] = 1166.0(真値1225)と5%過小評価npn-p なら 1227.4 で当たる
  • R2R^2 は変数を増やすと必ず上がる。 前のモデルは新しいモデルの選択肢に含まれるから。乱数113本で R2=0.9977R^2 = 0.9977、しかし ss は 35.6 → 79.5 に悪化
  • 乱数だけでも E[R2]=k/(n1)E[R^2] = k/(n-1)yy がiidなら厳密)。 n=120n=120 で乱数100本なら R20.84R^2 \approx 0.84 が出る
  • 調整済み R2R^2 が上がる境界は t=1|t| = 1 ちょうど(600回で反例0件)。有意の境界1.98とズレているので選択基準としては甘い
  • 偏回帰係数=残差同士の単回帰の傾き。 全5係数で小数8桁まで一致(フリッシュ=ウォー=ローヴェルの定理)
  • 「固定」の代償がVIF。 文字数の独自情報は 15.8% しか残らず、SEが 6.33=2.52\sqrt{6.33} = 2.52 倍に膨らむ
  • VIFが高いから消す、は危険。 ジャンルを消すとSEは改善するのに係数が 40.1+63.6-40.1 \to +63.6 と符号ごと反転。RMSEで比べると 4.68 対 105.11
  • 多重共線性は「情報が消える」のではなく「分解できない」。 相関0.999で個々の係数のsdは5.17まで暴れるが、合計のsdは0.214
  • F検定は門番、t検定は内訳。 相関0.99の3変数で F=75.3F = 75.3(p値は 101910^{-19} 台)なのに個別tは3本すべて非有意、しかし合計は p=3×1021p = 3\times10^{-21}
  • 全変数を交互作用させた重回帰 = 層別に別々の回帰。 傾きもRSS(132731.8685)も完全一致
  • おまけ:この記事の部分F検定は偽陽性を引きました(真の構造に交互作用は無いのに p=0.0494p = 0.0494

通し例:架空のブログアクセスデータ

全編を通して1つのデータで説明します。真の構造を私が決めているので、推定値が正解を当てられたかどうかを毎回確認できます。 これが自習でいちばん効きました。

設定は120記事(日記・ガジェット・お金 各40本)で、真の構造はこれです。

PV=15040(文字数)+22(被リンク数)+45(週末)+230(ガジェット)+490(お金)+ε\text{PV} = 150 - 40\,(\text{文字数}) + 22\,(\text{被リンク数}) + 45\,(\text{週末}) + 230\,(\text{ガジェット}) + 490\,(\text{お金}) + \varepsilon

誤差は εN(0,352)\varepsilon \sim N(0, 35^2)。文字数は千字単位です。

仕掛けが2つあります。文字数の真の係数は 40-40 でマイナスにしました。「同じジャンルの中では、長すぎる記事は検索意図がぼやけてPVが落ちる」という想定です。そしてジャンルごとに平均文字数とベースPVを同じ向きに並べました(日記2.2千字/150、ガジェット4.0/380、お金6.2/640)。

ノイズを外して回帰すると係数を 102110^{-21} の精度で復元できることを確認済みなので、データ生成は意図どおりです。

単回帰では符号を間違える

まず困りごとから入ります。文字数とPVだけで単回帰すると、傾きは +61.47+61.47(SE 5.656、t=10.87t = 10.87)。相関係数は +0.7073+0.7073 です。「長く書けばPVが増える」と読めます。

ところがジャンルで色を塗ると景色が変わります。

同じデータを3通りの見方で示した図。左は文字数とPVの散布図に単回帰の直線を引いたもので傾き+61.5、右上がりで「長く書けばPVが増える」と読める。中央は同じ散布図をジャンル別に色分けしたもので、日記・ガジェット・お金の3つの塊が左下から右上へ階段状に並んでいることが分かる。右はジャンル別に別々の回帰直線を引いたもので、日記-29.4、ガジェット-42.9、お金-61.7と3本すべてが右下がりになっており、単回帰とは符号が逆転している

3本すべて右下がりです。日記 29.44-29.44、ガジェット 42.90-42.90、お金 61.72-61.72。同じデータ・同じ2変数で符号が反転しました。

原因は次の図の左側です。

交絡の構造を示した2枚組の図。左は因果ダイアグラムで、ジャンルから文字数へ「お金の記事は長くなりがち」という矢印、ジャンルからPVへ「お金の記事は元からPVが高い」という矢印が出ており、文字数からPVへは真の直接効果−40の矢印が引かれている。右はジャンル別の平均文字数と平均PVを並べた棒グラフで、日記2.28千字/220PV、ガジェット3.85/370、お金6.17/540と、文字数とPVが同じ向きに並んでいることを示している

ジャンルが「文字数」と「PV」の両方に矢を出しています。 お金の記事は長くもあり(平均6.17千字)、かつ元からPVも高い(平均540)。この2つが同じ向きに並んでいるので、ジャンルを無視すると「長さのおかげでPVが高い」と誤って帰属されます。これが交絡(confounding)です。

ジャンルをダミー変数として入れて重回帰すると、文字数の係数は 40.08-40.08(SE 4.692)。真の値 40-40 を回収しました。

ここで言い方の区別を押さえておきます。単回帰の +61.47+61.47 も嘘ではありません。 「長い記事のほうがPVが高い」という事実の記述としては正しい。壊れるのは「記事を長くすればPVが増える」という介入の予測に使ったときです。重回帰が答えているのは「文字数とPVは関係あるか」ではなく、「ジャンルを揃えたうえで、文字数はPVに効いているか」です。

「とりあえず全部入れる」は誤り

前節を読むと「関係しそうな変数は全部入れれば安全」と結論しそうになりますが、これは誤りです。 同じ「変数Zを足す」操作を、矢の向きだけ変えた3つの構造で試しました(各4,000回、n=300n = 300)。

交絡因子・媒介変数・合流点の3パターンを比較した図。上段は3つの因果ダイアグラムで、①交絡因子はジャンルから文字数とPVの両方へ矢が出る形、②媒介変数は文字数から滞在時間を経てPVへ至る形、③合流点は文字数とPVの両方からはてブ数へ矢が刺さる形。下段は各パターンで4000回推定した係数のヒストグラムで、青がZを入れない場合、橙が入れる場合、赤い破線が真の答え。①では入れる方が正解の−40に当たり、②では入れない方が総効果+20に当たり、③では入れない方が効果ゼロに当たる

Zの正体矢の向きZを入れないZを入れる真の答え正しい操作
交絡因子(ジャンル)文字数 ← Z → PV+59.44+59.4439.98-39.9840-40入れる
媒介変数(滞在時間)文字数 → Z → PV+20.00+20.0040.05-40.05+20+20入れない
合流点(はてブ数)文字数 → Z ← PV+0.06+0.0626.98-26.9800入れない

媒介変数は「文字数 → 滞在時間 → PV」という経路です。この場合、文字数の総合的な効果は「直接の 40-40」と「滞在時間経由の +60+60」の合計で +20+20、つまりプラスになります。滞在時間を入れずに回帰すると +20.00+20.00 でこれを当てますが、入れると 40.05-40.05 になる。効果が通る途中の駅を塞いでしまったわけです。

そして合流点がいちばん怖いところです。

ここだけ通し例を離れて、矢の向きが誰の目にも明らかな例で確認します。暑い日は熱中症が増え、アイスが売れた日は涼が取れて熱中症が減る。つまり熱中症患者数は、気温とアイス売上の両方から矢が刺さり込む合流点です。上の表の「はてブ数」(長い記事もPVの高い記事もブックマークされやすい)とまったく同じ形ですが、こちらは因果の向きを疑う人がいません。

合流点で条件付けると相関が生まれることを示した3枚組の図。気温とアイス売上をわざと独立に生成してある。左は全データの散布図で相関−0.013、回帰直線はほぼ水平で「本当に関係が無い」。中央は熱中症患者数の水準で4つの層に切った散布図で、どの層の中でも右上がりの直線(+6.9、+10.0、+9.6、+6.6)になっている。右は1つの層だけを取り出したもので相関+0.869、「暑いのに熱中症が増えなかった日はアイスが売れたから」「涼しいのに熱中症が出た日はアイスが売れなかったから」という注記がある

気温とアイス売上をわざと完全に独立に生成しました。全体の相関は 0.0131-0.0131、回帰のp値は 0.695、本当に何の関係もありません。ところが熱中症患者数を説明変数に入れると、気温の係数は +10.906+10.906(SE 0.141)、p値は計算上ゼロと表示されるほど小さくなります。

理屈はこうです。熱中症の数を揃えて比べるのは、「暑いのに熱中症が増えなかった日」と「涼しいのに熱中症が出た日」を同じグループに入れることです。前者はアイスが売れたから熱中症が抑えられた日、後者は売れなかった日。つまり熱中症を固定した瞬間に、気温の高さがアイス売上の高さの証拠になってしまう。

p値 0.695 が、計算上ゼロと表示される水準まで化けました。有意性は正しさを保証しません。

そして重要なのは、この3変数だけを見ても判別できないという点です。3つとも「Zは文字数ともPVとも相関している」という同じ姿でデータに現れます。(XX)1Xy(X^\top X)^{-1}X^\top y はどの場合も何食わぬ顔で数字を返します。矢の向きはドメイン知識で決めるしかありません(変数がもっと多ければ条件付き独立の構造から部分的に向きを絞る方法もありますが、それは第27回・グラフィカルモデルの話題です)。

なお媒介変数について、私は最初「間違った因果で出てくるやつ」と誤解していました。逆です。媒介変数は本物の因果で、事故は「効果が無いのに有ると誤認した」ではなく「本当にある効果を、通り道を塞いで消してしまった」でした。

媒介変数を入れる/入れないは「別の問いへの答え」であることを示した3枚組の図。左は経路図で、文字数から滞在時間への係数a=+2.0、滞在時間からPVへの係数b=+30.0、文字数からPVへの直接効果−40が示され、総効果=−40+60=+20と注記されている。中央は4000回推定した係数のヒストグラムで、滞在時間を入れない場合は+20(総効果)、入れる場合は−40(直接効果)にそれぞれ集まっている。右は問いの違いを整理したもので、「記事を長くしたらPVはどうなる?」なら入れない、「長さそれ自体はPVに悪いのか?」なら入れる、と使い分けを示している

2つは恒等式で結ばれています。

総効果=直接効果+a×b+20.000=40.005+60.005\begin{aligned} \text{総効果} &= \text{直接効果} + a \times b \\ +20.000 &= -40.005 + 60.005 \end{aligned}

これは平均的に成り立つだけでなく、標本1つごとに厳密に成立する代数的恒等式でした(4000回の各反復での最大誤差 1.1×10101.1\times10^{-10})。

ただし成立条件があります。 これは当てはめる2つのモデルがどちらも線形で、交互作用項を含まない場合の恒等式です(真のデータ生成過程に交互作用や非線形性があっても、この2モデルを当てはめる限り成立します。逆に大きいモデルに交互作用項を入れると崩れます)。ロジスティック回帰のような非線形モデルでも成り立ちません(第18回の話題)。この分解が第27回(第25章)のパス解析・構造方程式モデルの出発点になります。

整理すると、測定できている交絡因子は入れる(原則として選択の余地なし。ただし合流点を兼ねる変数のような例外構造もあります)、媒介変数は問いで決める(総効果なら入れない、直接効果なら入れる)、合流点は入れない(どちらの問いにも答えを壊す)。

(XX)1X(X^\top X)^{-1}X^\top はなぜこの形なのか

ここが今回いちばん時間をかけたところです。そして最初に大混乱しました。

原因は私が3次元の絵を2枚見て、それがまったく別の絵だと気づかなかったことです。

最小二乗法の2つの描き方を対比した図。左は「絵A」でいつもの散布図の3D版、軸が文字数・被リンク数・PVという変数で、点が記事、青い面が回帰平面、橙の縦線が残差。右は「絵B」でベクトルの絵、軸が1番目の記事・2番目の記事・3番目の記事という個別のデータ、矢が列まるごとを表し、緑の面が説明変数で作れるベクトル全体。2つの平面は意味が無関係であることを示している

絵A(変数の空間)絵B(ベクトルの空間)
軸は何か文字数・被リンク数・PV(変数)1番目の記事・2番目の記事…(データ1件ごと)
次元の数変数の数記事の数(120記事なら120次元)
点/矢は何か点=1記事矢=列1本まるごと
平面の意味回帰平面=予測の式列空間=作れるベクトルの範囲
残差縦線が120本斜めの矢が1本

同じ言葉で別のものを指していました。

なおこの先すぐに絵Bが必要になるわけではありません。 次の「まず単回帰から積み上げる」は偏微分して連立方程式を解くだけの代数で、いつもの散布図(絵A)のまま読めます。絵Bが要るのは、そのあとの「幾何で見ると垂線を下ろすだけ」からです。

まず単回帰から積み上げる

行列の前に、偏微分して0に置くという道筋を確認します。残差の2乗和は

S(a,b)=i=1n(yibaxi)2S(a,b)=\sum_{i=1}^{n}(y_i-b-ax_i)^2

これを bbaa で偏微分して0に置くと連立方程式が2本出ます。

yi=nb+axixiyi=bxi+axi2\begin{aligned} \sum y_i &= nb + a\sum x_i \\ \sum x_iy_i &= b\sum x_i + a\sum x_i^2 \end{aligned}

2本目で xix_i が現れる理由を私は最初つかめませんでした。連鎖律です。 ui=yibaxiu_i = y_i - b - ax_i と置くと duida=xi\frac{du_i}{da} = -x_i なので、aa で微分すると xix_i が落ちてきます。bb で微分すると duidb=1\frac{du_i}{db} = -1 なので何も掛かりません。2本の式の違いはこれだけです。

そしてこの2本は、絵Bで見ると「直交条件」そのものです。 1本目を移項すると (yibaxi)=0\sum(y_i - b - ax_i) = 0、つまり残差の合計がゼロ——残差が切片の列 (1,1,,1)(1,1,\dots,1) と直交しています。2本目は xi(yibaxi)=0\sum x_i(y_i - b - ax_i) = 0 で、残差が xx の列と直交しています。「縦の距離の2乗和を最小にする」(絵A)と「残差を2本の列それぞれに直交させる」(絵B)は、同じ2本の式の別の読み方でした。xix_i が掛かるのは xx との内積を取っているから、と読むこともできます。この対応は後半の X(yXβ)=0X^\top(y - X\beta) = 0 でそのまま再登場します。

そして変数を増やしても、やることは何も変わりません。 y=b+a1x1+a2x2y = b + a_1x_1 + a_2x_2 なら未知数が3つになるので式が3本になります。

y=nb+a1x1+a2x2x1y=bx1+a1x12+a2x1x2x2y=bx2+a1x1x2+a2x22\begin{aligned} \sum y &= nb + a_1\sum x_1 + a_2\sum x_2 \\ \sum x_1y &= b\sum x_1 + a_1\sum x_1^2 + a_2\sum x_1x_2 \\ \sum x_2y &= b\sum x_2 + a_1\sum x_1x_2 + a_2\sum x_2^2 \end{aligned}

この係数を表にすると、それがそのまま XXX^\top X です(実データで両方を計算して全成分の一致を確認しました)。だから3本の連立方程式は XXβ=XyX^\top X\beta = X^\top y と1行で書けて、両辺に (XX)1(X^\top X)^{-1} をかければ

β^=(XX)1Xy\hat\beta = (X^\top X)^{-1}X^\top y

行列は連立方程式の書き方であって、新しい概念ではありませんでした。 変数が5本でも50本でも同じ1行で書けるようにしただけです。

そしてこの式を見ると、単回帰で行列が要らなかった理由も分かります。a1a_1 を決める式に x1x2\sum x_1x_2 が入っている——つまり説明変数どうしの関係が答えに影響するからです。単回帰では他の変数がいないのでこの項が存在せず、Cov/V\text{Cov}/V というきれいな形にまとまっていました。

幾何で見ると「垂線を下ろす」だけ

ここからが絵Bです。 記事3本だけの極小データ(x=(1,3,5)x = (1,3,5)y=(5,4,9)y = (5,4,9))で図にしました。

最小二乗法が射影であることを3段階で示した図。軸は1番目・2番目・3番目の記事で、n=3なので3次元に描ける。①は実測値yの赤い矢と、切片の列(1,1,1)と文字数の列(1,3,5)の青い矢を描いたもの。②は青い2本が張る平面に、yから垂線を下ろして予測値を得る様子で、残差が平面に直交していることを直角マークで示している。③は平面上の他の候補(点線)と比べて垂線2.449が最短であることを示し、他の候補は3.000と3.339

青い2本を伸ばしたり足したりして作れるベクトル全体が平面になります。XβX\beta が意味するのは「この平面上のどこか」です。ところが yy はこの平面から外れているので、どう β\beta を選んでも届きません。だから平面上でいちばん近い点を選ぶ——それが垂線の足です。

3つの言い方が全部同じだと気づいたのが収穫でした。「残差の2乗和を最小にする」=「距離を最短にする」=「垂直に落とす」ei2\sum e_i^2 は矢の長さの2乗そのものなので、最初の2つは同じ。そして平面上で最短距離を与えるのは垂線の足だけです。

そして垂直の条件を式で書くと、答えがそのまま出ます。

ここで私は「X(yXβ)=0X^\top(y-X\beta)=0XX^\top はどこから来たのか」で詰まりました。この式は1個の内積ではなく、pp 個の内積を縦に積み上げたものだと分かって解けました。3段階に分けます。

① 平面に垂直とは、平面上のすべてのベクトルに垂直ということ。 ただし無限個を確かめる必要はありません。平面上のベクトルは Xc=c1x1++cpxpXc = c_1x_1+\dots+c_px_p という形しかないので

e(Xc)=c1(ex1)++cp(exp)e^\top(Xc)=c_1(e^\top x_1)+\dots+c_p(e^\top x_p)

となり、張っている列 x1,,xpx_1,\dots,x_p それぞれに直交していれば右辺は必ず0です。だから確かめるのは列の本数だけで足ります(乱数の cc で試すと、平面上のどのベクトルとの内積も 101510^{-15} 以下でした)。

② 列ごとに条件を書き並べる。 x1e=0x_1^\top e=0x2e=0x_2^\top e=0、…、xpe=0x_p^\top e=0pp 本です。

③ これを1本にまとめると XX^\top が現れます。 転置するともとの列が行になるからです。n=3n=3 の例なら

X=(111315)X=(111135)X=\begin{pmatrix}1&1\\1&3\\1&5\end{pmatrix}\quad\longrightarrow\quad X^\top=\begin{pmatrix}1&1&1\\1&3&5\end{pmatrix}

で、XX^\top の第1行が切片の列、第2行が xx の列です。行列とベクトルの積は「各行との内積を並べる」操作なので

Xe=(切片の列exの列e)=(eixiei)=(00)X^\top e=\begin{pmatrix}\text{切片の列}\cdot e\\ x\text{の列}\cdot e\end{pmatrix}=\begin{pmatrix}\sum e_i\\ \sum x_ie_i\end{pmatrix}=\begin{pmatrix}0\\0\end{pmatrix}

答えはスカラーではなく pp 成分の縦ベクトルです(e=(1,2,1)e=(1,-2,1) で両成分が 1.8×1015-1.8\times10^{-15} を確認)。つまり相手は XX ではなく「XX^\top の各行=もとの各列」で、XX^\top という書き方は pp 本の内積を1行で書くための入れ物にすぎません。

そしてこの2成分は、前の小節で偏微分して出した正規方程式そのものです。ei=0\sum e_i=0 が1本目、xiei=0\sum x_ie_i=0 が2本目。絵Aで解いても絵Bで解いても、同じ2本の式に着きます。

X(yXβ)=0    Xy=XXβ    β^=(XX)1XyX^\top(y - X\beta) = 0 \;\Longrightarrow\; X^\top y = X^\top X\beta \;\Longrightarrow\; \hat\beta = (X^\top X)^{-1}X^\top y

(XX)1X(X^\top X)^{-1}X^\top は「垂直に落とせ」という条件を β\beta について解いた結果でした。XXX^\top X が出るのは内積を取ったから、逆行列が出るのは β\beta について解いたから。それだけです。

なお逆行列が存在するには XXX^\top X が正則、つまり説明変数の間に完全な重複がないことが必要です(後で出てくるダミー変数の罠がまさにこれに引っかかります)。

平面について3つ補足します。

1つめ。3本以上になると「平面」とは呼べません。 列を足して作れる図形は、1本なら直線、2本なら平面、3本以上なら pp 次元の「平たいもの」(超平面、正確にはpp 次元部分空間)です。この記事が「平面」と言い続けているのは、図に描けるのが2本までだからにすぎません。

2つめ。その次元は列の本数ではなく rank(階数)で決まります。 列が互いに独立でなければ、本数より低い次元しか張れません。切片+3水準ダミー3本(列4本)で実際に計算すると rank は 3 で止まりXXX^\top X の行列式は 3.3×10163.3\times10^{-16}(実質0)で逆行列が存在しません。後で出てくるダミー変数の罠は、「列を増やしたのに図形の次元が増えなかった」状態です。上で書いた「XXX^\top X が正則」という条件は、言い換えれば列の本数ぶんの次元がちゃんと張れているかです。

3つめ。この図形が浮かんでいる空間はデータ件数 nn 次元です。 通し例の120記事・6列なら「120次元空間の中の6次元部分空間」で、絶対に描けません。ただし射影・直交・ピタゴラスはどの次元でも同じ式のまま成り立つので、3次元の絵で見た性質がそのまま通用します。だから絵は n=3n=3 で描いています。

そして細かい点を2つ。あの青い2本は単位ベクトルではありません(長さは 3\sqrt{3}35\sqrt{35})。平面を張る代表として描いただけで、同じ平面を張る別の2本に取り替えても結果は変わりません。そして平面を決めるのは XX だけで、β\beta は平面上のどこに立つかを指す座標です。平面は β\beta を動かす前から決まっています。

直交しているから平方和が足し算になる

直交の帰結を3枚で示した図。左はn=3の例で実測値・予測値・残差が直角三角形をなすことを示し、|y|=11.045、予測値の長さ10.770、残差の長さ2.449で、122=116+6が成立。中央は単回帰の「共分散÷分散」が中心化したベクトルの射影であることを式で示し、射影で計算した61.4734238099と共分散÷分散で計算した値が小数10桁まで一致することを表示。右は実データn=120の平方和分解を棒グラフで示し、全変動TSS=2,753,318が説明できた分ESS=2,608,699と残った分RSS=144,619に分かれることを示している

実測値・予測値・残差はぴったり直角三角形をなします(122=116+6122 = 116 + 6)。だから

TSS=ESS+RSS\text{TSS} = \text{ESS} + \text{RSS}

が成り立ちます。実データでも差は 1.75×10101.75\times10^{-10} でした。

ただし1つ条件があります。 上の 122=116+6122 = 116 + 6y2=y^2+e2\|y\|^2 = \|\hat y\|^2 + \|e\|^2 という「平均を引かない」形の分解です。一方 TSS は下の表のとおり平均からの2乗和で定義されているので、両者が繋がるにはモデルに切片が入っていることが必要です。切片があると残差が 1=(1,1,,1)\mathbf{1} = (1,1,\dots,1) とも直交して ei=0\sum e_i = 0 となり、y^\hat y の平均が yˉ\bar y に一致するので、平均を引いた形でも直角三角形が保たれます。実際に切片を外して計算すると ei=868.87\sum e_i = 868.87 とゼロにならず、TSS が 2,753,318 に対して ESS + RSS が 3,408,482 になって分解が崩れました

この足し算が成り立つのは直角だからです。 斜めに落としていたら平方和は分解せず、「説明できた割合」という言い方自体が意味を失います。R2R^2 が割合として読めるのは、垂直に落としたことの副産物でした。

3つの平方和は名前が違うだけで作り方は同じです。

3つの平方和の違いを単回帰で図示した3枚組。灰色の破線が平均、青い線が回帰直線。左のTSSは各点から平均までの縦線を赤で描き、2乗して合計すると2,753,318。中央のESSは回帰直線から平均までの縦線を緑で描き1,377,479。右のRSSは各点から回帰直線までの縦線を橙で描き1,375,839。3つの違いは「どこからどこまでの縦線を測るか」だけであることを示している

記号正式名称引き算するもの
TSSTotal Sum of Squares(全平方和)(yiyˉ)2\sum(y_i-\bar y)^2実測値 − 平均
ESSExplained Sum of Squares(回帰平方和)(y^iyˉ)2\sum(\hat y_i-\bar y)^2予測値 − 平均
RSSResidual Sum of Squares(残差平方和)(yiy^i)2\sum(y_i-\hat y_i)^2実測値 − 予測値

ハット行列の性質が自由度の正体だった

y^=Xβ^=X(XX)1Xy\hat y = X\hat\beta = X(X^\top X)^{-1}X^\top y なので、H=X(XX)1XH = X(X^\top X)^{-1}X^\top と置けば y^=Hy\hat y = Hyn=3n=3 の例で実際に計算すると、次の性質が確認できます。

性質確認幾何的な意味
H=HH^\top = H(対称)成立まっすぐ落としている
H2=HH^2 = H(冪等)成立2回落としても同じ場所
tr(H)=2\mathrm{tr}(H) = 2列数と一致平面の次元=列の本数(=p=p
固有値が 1, 1, 0成立平面内は保たれ、垂直方向は潰される
tr(IH)=1\mathrm{tr}(I-H) = 1npn-p と一致これが残差の自由度

冪等性 H2=HH^2 = H が射影の本質です。影を落とす操作をもう一度やっても影は動かない。そして tr(IH)=np\mathrm{tr}(I-H) = n-p という等式が、なぜ誤差分散を npn-p で割るのかの答えになっています。変数を1本増やすと平面の次元が1つ増え、垂直方向に残る余地が1つ減る。その残った次元の数が自由度です。

単回帰の「共分散÷分散」は射影の言い換え

ここは私が引っかかったところなので丁寧に書きます。「中心化したベクトルで射影すると」と言われて、中心化が何なのか、なぜ出てくるのかが分かりませんでした。

中心化(centering)は「各データから平均を引く」ことだけです。x=(1,2,4,7)x = (1,2,4,7)、平均3.5なら x~=(2.5,1.5,0.5,3.5)\tilde x = (-2.5, -1.5, 0.5, 3.5)

中心化が散布図の平行移動であることを示した2枚組の図。左はもとのデータで、4点の散布図に回帰直線が引かれ、傾き1.261905、切片1.833、RSS=1.309524、重心が(3.50, 6.25)。右は中心化したデータで、点の配置はそのままに原点が重心へ移動しており、傾き1.261905、切片0(原点を通る)、RSS=1.309524。傾きと残差はまったく同じで、切片だけが変わることを示している

散布図の点の配置をそのまま保って、原点を重心に移すだけです。そして重要なのは、傾きは完全に不変だということ。

何を中心化するか傾き切片RSS
しない1.26190476191.8333331.309524
xx だけ1.26190476196.2500001.309524
xxyy 両方1.26190476190\approx 01.309524

残差2乗和を最小にするという目的は完全に達成されています。 切片も b=yˉaxˉb = \bar y - a\bar x でいつでも復元できます。中心化は答えを変える操作ではなく、切片を分離して傾きだけを見やすくする座標移動でした。

しかも中心化は既に使っていました。 単回帰の導出で b=yˉaxˉb = \bar y - a\bar x を代入して bb を消すと、

xynxˉyˉ=(xxˉ)(yyˉ),x2nxˉ2=(xxˉ)2\sum xy - n\bar x\bar y = \sum(x-\bar x)(y-\bar y), \qquad \sum x^2 - n\bar x^2 = \sum(x-\bar x)^2

という変形が出てきます。この右辺が中心化した形で、新しい道具ではなく途中で出てきたものに名前が付いただけでした。

なぜ平均を引くと直交するのか

中心化が平面を直交する2軸に分けることを示した3枚組の3D図。①はもとの切片の列(1,1,1)と文字数の列(1,3,5)が斜め(cos=0.878)であることを示す。②は文字数から平均を引くと切片の列と直交する(内積0)ことを直角マークで示し、平面自体は変わらず点線がもとのxであることを示す。③は予測値が「平均の分」(6,6,6)と「傾きの分」(-2,0,2)の和として(4,6,8)に分解される様子を平行四辺形で示している

切片の列 1=(1,1,1)\mathbf{1} = (1,1,1)x=(1,3,5)x = (1,3,5) は直交していません(内積は 99cos=0.878\cos = 0.878)。斜めだと片方の座標を動かすともう片方の意味も変わるので、「傾きだけを取り出す」ことができません。

ところが平均を引くと 1x~=(xixˉ)=0\mathbf{1}^\top\tilde x = \sum(x_i - \bar x) = 0 で直交します。「平均を引いたら合計はゼロ」という定義そのものです。そして平面は変わりません——同じ平面に、直交する新しい目盛りを引き直しただけです。

直交したので傾きは「x~\tilde x という1本の軸だけへの射影」として単独で書けます。1本のベクトルへの射影の係数は内積の比なので

β^1=x~y~x~x~\hat\beta_1 = \frac{\tilde x^\top \tilde y}{\tilde x^\top \tilde x}

最後の一歩はただの約分です。 分子と分母を同じ n1n-1 で割ると、分子は共分散、分母は分散になります(実データで 22407.7167 ÷ 119 = 188.300140 = 共分散、364.5106 ÷ 119 = 3.063115 = 分散を確認)。分数の分子分母を同じ数で割っても値は変わらないので

x~y~x~x~=Cov(x,y)V[x]\frac{\tilde x^\top\tilde y}{\tilde x^\top\tilde x} = \frac{\mathrm{Cov}(x,y)}{V[x]}

「共分散÷分散」は内積の比に n1n1\frac{n-1}{n-1} を掛けただけでした。行列で解いた値と小数10桁まで一致します。

そして切片は β^0=yˉβ^1xˉ\hat\beta_0 = \bar y - \hat\beta_1\bar x回帰直線が必ず点 (xˉ,yˉ)(\bar x, \bar y) を通るというよく聞く事実は、この式の言い換えです。

XXX^\top X の中身は分散と共分散だった

XXX^\top X の正体が気になって調べたら、中心化すれば共分散行列そのものn1n-1 倍だけ違う)でした。

XᵀXと共分散行列の関係を示した3枚組の図。左は中心化したXᵀXの2×2行列(364.5、−36.9、−36.9、818.4)と共分散行列を119倍したものが完全一致することを示す。中央は1/(1−r²)のグラフで、相関が0.5で1.3倍、0.9で5.3倍、0.99で50.3倍に爆発することを対数目盛で示している。右は単回帰と重回帰の係数の公式を対比し、違いが分子の−r2y·r12と分母の1−r12²の1箇所だけであることを示している

中心化した XXX^\top X の対角成分が分散、非対角成分が共分散です(実測で完全一致)。ただし中心化しない生の XXX^\top X は、nnx\sum xx2\sum x^2 が並んだただの2乗和の表で、まだ共分散ではありません。平均を引くという一手間が、2乗和を分散・共分散に変えます。

そして2変数の重回帰は手で解けます。中心化して切片を消し、両辺を n1n-1 で割ると

Cov(x1,y)=a1V[x1]+a2Cov(x1,x2)Cov(x2,y)=a1Cov(x1,x2)+a2V[x2]\begin{aligned} \mathrm{Cov}(x_1,y)&=a_1V[x_1]+a_2\mathrm{Cov}(x_1,x_2) \\ \mathrm{Cov}(x_2,y)&=a_1\mathrm{Cov}(x_1,x_2)+a_2V[x_2] \end{aligned}

これが「分散共分散で書いた正規方程式」です。ふつうに解くと

a1=Cov(x1,y)V[x2]Cov(x2,y)Cov(x1,x2)V[x1]V[x2]Cov(x1,x2)2a_1=\frac{\mathrm{Cov}(x_1,y)V[x_2]-\mathrm{Cov}(x_2,y)\mathrm{Cov}(x_1,x_2)}{V[x_1]V[x_2]-\mathrm{Cov}(x_1,x_2)^2}

この形に相関は出てきません。 分母 V1V2C122V_1V_2 - C_{12}^2 は2×2共分散行列の行列式で、行列で書けば

(a1a2)=(V1C12C12V2)1(C1yC2y)\begin{pmatrix}a_1\\a_2\end{pmatrix}=\begin{pmatrix}V_1&C_{12}\\C_{12}&V_2\end{pmatrix}^{-1}\begin{pmatrix}C_{1y}\\C_{2y}\end{pmatrix}

「共分散行列の逆行列 × yy との共分散」——これが (XX)1Xy(X^\top X)^{-1}X^\top y の中心化版です(実データで小数10桁まで一致)。

ここから相関の形にするのはただの書き換えです。C12=r12s1s2C_{12}=r_{12}s_1s_2V1=s12V_1=s_1^2 を代入すると s1s22sys_1s_2^2s_y でくくれて

a1=r1yr2yr121r122sys1a_1=\frac{r_{1y}-r_{2y}r_{12}}{1-r_{12}^2}\cdot\frac{s_y}{s_1}

単回帰は a1=r1ysys1a_1 = r_{1y}\cdot\frac{s_y}{s_1} なので、違いは分子で r2yr12r_{2y}r_{12} を引き、分母を 1r1221-r_{12}^2 で割ることだけです。

この1箇所が2つの疑問を同時に説明します。 係数が単回帰と変わるのは r2yr12r_{2y}r_{12} を引いているから(x2x_2yy の相関のうち x1x_1 経由で説明できる分を差し引いている)。そして r12=0r_{12}=0 なら公式は単回帰と完全に一致します。 つまり係数が動く原因は説明変数どうしの相関だけでした。

なぜ相関に直すのか

「計算しやすいから」だと思っていましたが、違いました。計算はむしろ増えます(共分散の形は5つの量、相関の形は6つ。しかも相関を出すには先に共分散が必要)。

共分散と相関の関係を3枚で示した図。左は共分散が符号つき長方形の面積の平均であることを、中心化した4点それぞれについて長方形を描いて示している。中央は単位を変えたときの比較で、xを1000倍すると共分散は8.83から8833.33へ、さらにyを0.01倍すると88.33へと激しく変わるのに、相関は3つとも0.9810のまま不変であることを棒グラフで示す。右は1−r²の値を棒グラフで並べ、相関が上がるほど「残っている独自情報」が減り、係数の分散が1.0倍から50.3倍まで膨らむことを示している

本当の理由は「単位を消して大小を判断できるようにする」ことでした。 共分散の単位は「xx の単位 × yy の単位」なので、xx の単位を千字から字に変えるだけで 8.83 が 8833.33 に化けます。数字の大小に意味がないわけです。標準偏差で割ると単位が打ち消えて 1r1-1 \le r \le 1 という固定された物差しに載ります。

今回の文脈での利点も同じです。分母は V1V2C122V_1V_2 - C_{12}^2s12s22(1r122)s_1^2s_2^2(1-r_{12}^2) の2通りに書けて値は同じ(どちらも 20.968885)ですが、左を見て危険度は判断できません。 右なら 1r1221-r_{12}^2 が 0〜1 の割合なので一目で分かります。

そして念のため、共分散 =r×sx×sy= r \times s_x \times s_y は相関の定義の移項です。相関の定義 r=Cov/(sxsy)r = \mathrm{Cov}/(s_xs_y) の両辺に sxsys_xs_y を掛けただけで、覚えるべき新しい事実ではありません。ついでに y=xy = x とすると Cov(x,x)=1sxsx=V[x]\mathrm{Cov}(x,x) = 1\cdot s_xs_x = V[x] になり、分散は共分散の特別な場合(相手が自分)だと分かります。

係数の標準誤差はどこから来るのか

β^\hat\beta は計算すれば1つの数に決まります。では何がばらつくのか。 「もう一度データを取り直したら違う値が出る」という意味です。

標準誤差を6枚のパネルで検証した図。①は誤差だけを振り直した25回分の回帰直線を重ね描きしたもので、線が扇形に散らばる幅が標準誤差であることを示す。②は文字数の係数を4000回集めたヒストグラムで、実測sd=4.6353に対し1回のデータから計算した公式SE=4.6920、比0.9879。③は6つの係数すべてで公式SEと実測ばらつきが対角線上に乗ることを示す散布図。④はσ²の推定でnで割ると平均1166.0(真値1225を過小評価)、n−pで割ると1227.4で当たることを2つのヒストグラムで比較。⑤は標本サイズとSEの関係を両対数で示し、傾き−0.53で1/√nの予測線とほぼ重なる。⑥はSEを決める4要素の分解式

真の構造を固定して誤差だけ振り直すと、回帰直線は扇形に散らばります。この幅が標準誤差です。

そして驚いたのがここでした。文字数の係数を4000回集めた実測のばらつきは 4.6353。一方、1回のデータだけから公式で計算した標準誤差は 4.6920。6つの係数すべてで一致しました。

手元にデータが1組しかないのに「取り直したらどれだけ動くか」を当てられる。 なぜ可能なのかが次の式です。

1行で出ます

出発点は y=Xβ+εy = X\beta + \varepsilon。これを β^\hat\beta の式に入れると

β^=(XX)1X(Xβ+ε)=β+(XX)1XAε\hat\beta=(X^\top X)^{-1}X^\top(X\beta+\varepsilon)=\beta+\underbrace{(X^\top X)^{-1}X^\top}_{A}\varepsilon

第1項で (XX)1(XX)=I(X^\top X)^{-1}(X^\top X) = I となって β\beta が残るので

β^β=Aε\hat\beta - \beta = A\varepsilon

推定値と真の値のズレは、誤差を行列 AA で変換したものでした(実データで両辺の差が 4.18×10124.18\times10^{-12} であることを確認)。AAXX だけで決まる固定された行列で、ばらつくのは ε\varepsilon だけです。

あとは分散を取るだけです。ここで V[ε]=σ2IV[\varepsilon] = \sigma^2I という記号には2つの仮定が畳み込まれています。対角がすべて σ2\sigma^2(どの観測も同じ大きさでブレる=等分散)と、非対角がすべて0(ある記事の誤差が別の記事の誤差を予測しない=無相関)。そしてもう1つ、記号の外側に XX は固定という前提が必要です(だから AA を定数として外に出せる)。この3つだけで話が進みます。

V[Az]=AV[z]AV[Az] = AV[z]A^\topV[ε]=σ2IV[\varepsilon] = \sigma^2I を入れると

V[β^]=A(σ2I)A=σ2(XX)1XX(XX)1=σ2(XX)1V[\hat\beta]=A(\sigma^2I)A^\top=\sigma^2(X^\top X)^{-1}X^\top X(X^\top X)^{-1}=\sigma^2(X^\top X)^{-1}

真ん中で XXX^\top X が現れて約分されます(AA=(XX)1AA^\top = (X^\top X)^{-1} を最大誤差 1.22×10151.22\times10^{-15} で確認)。

そしてこの分散には意味があります。 ガウス・マルコフの定理は、誤差が「平均0・等分散・互いに無相関」であれば(正規分布である必要はありません)、最小二乗推定量が線形かつ不偏な推定量の中で分散最小だと言います。BLUE(Best Linear Unbiased Estimator=最良線形不偏推定量)と呼ばれます。

つまり最小二乗法を使う理由は「残差の2乗和が最小だから」という都合ではなく、「不偏推定量として一番精度が高いから」でした。逆に等分散が崩れればBLUEではなくなり、加重最小二乗法などが必要になります。ここが第17回の回帰診断の動機です。

読み方が分かったのが収穫でした。 σ2\sigma^2 は「1個1個の観測がどれだけブレるか」、(XX)1(X^\top X)^{-1} は「そのブレが係数にどう伝わるか」の増幅率。そして XXX^\top X は中心化すれば共分散行列なので、説明変数の散らばり方が係数の精度を決めている。逆行列なので「説明変数がよく散らばっている → SEが小さい」という向きです。xx が狭い範囲にしかないと傾きは決めにくい、という直感と合います。

なぜ npn-p で割るのか

σ\sigma は普通わからないので s2=RSS/(np)s^2 = \text{RSS}/(n-p) と推定します。4000回試すと理由が出ます。

  • npn-p で割る → E[s2]=1227.4E[s^2] = 1227.4(真値 1225)当たり
  • nn で割る → E[s2]=1166.0E[s^2] = 1166.0 約5%の過小評価

理由は tr(IH)=np\mathrm{tr}(I-H) = n-p です。残差は e=(IH)εe = (I-H)\varepsilon と書けるので

E[ee]=E[ε(IH)ε]=σ2tr(IH)=σ2(np)E[e^\top e]=E[\varepsilon^\top(I-H)\varepsilon]=\sigma^2\,\mathrm{tr}(I-H)=\sigma^2(n-p)

となり、npn-p で割ってはじめて σ2\sigma^2 に戻ります。直感で言えば、残差は pp 個の正規方程式を満たすよう調整されているので、自由に動ける方向が npn-p 個しか残っていません。

そして σ\sigmass で置き換えた代償として分布がt分布になります。第7回・第13回でやった「母分散を知らないことへの罰金」と同じ話でした。

ここで仮定が1つ増えることに注意です。V[β^]=σ2(XX)1V[\hat\beta] = \sigma^2(X^\top X)^{-1} 自体に正規性は不要でしたが、t分布・p値・信頼区間には誤差の正規性が必要になります。分散の式までは分布の形を問わない、というのが区切りです。

実データの検定結果はこうなります(自由度114、臨界値 1.9810)。

係数推定値SEt値95%信頼区間真の値
切片155.1315.0510.31[125.32, 184.95]150
文字数40.08-40.084.698.54-8.54[49.37-49.37, 30.78-30.78]40-40
被リンク数21.791.2517.41[19.31, 24.27]22
週末47.736.527.33[34.83, 60.64]45
ガジェット226.0110.8520.83[204.51, 247.51]230
お金483.3419.9124.27[443.89, 522.80]490

6つすべての信頼区間が真の値を含みました(第11回でやったとおり、これは「作り方」の性質で毎回入るわけではありません)。

SEを決めるのは4つ

(XX)1(X^\top X)^{-1} を成分で書き下すと、SEはこう分解できます。全係数で厳密に成立することを確認しました(差は 101410^{-14} 以下)。

SE(β^j)=ssjn1VIFj\mathrm{SE}(\hat\beta_j)=\frac{s}{s_j\sqrt{n-1}}\cdot\sqrt{\mathrm{VIF}_j}

分母が「手がかりの量」、分子が「当てられない量」です。ss が大きいとSEは大きく、sjs_j(その変数の散らばり)と nn が大きいとSEは小さくなります。nn については両対数の傾きが 0.53-0.53 で、1/n1/\sqrt{n} の法則が確認できましたnn を8倍にするとSEは 2.90 分の1、8=2.83\sqrt{8} = 2.83)。

そして4つ目がVIFです。

VIF(分散拡大係数)とは何か

VIF = Variance Inflation Factor=分散拡大係数。 字面のまま「分散を膨らませる係数」です。その説明変数が他の説明変数とどれだけ重複しているかを表します。

求め方に発想の面白さがあります。VIFを計算するとき yy(PV)は一切使いません。

VIFを4枚のパネルで説明した図。①はVIFを出す回帰がyを使わず「x1を残りの説明変数で回帰する」ものであることを、ふつうの回帰と対比して示す。②は実データ各変数について他の変数で説明できる割合(赤)と独自の情報(緑)を横棒で示し、お金88.0%、文字数84.2%、ガジェット59.6%、被リンク数1.1%、週末0.4%。③はR²jとSEの倍率の関係を曲線で示し、R²jが0.8を超えると急に立ち上がることと各変数の位置を示す。④は相関を0、0.9、0.999と変えた2変数で真の係数がともに5.0のときの推定値の散布図で、相関が上がると点が「合計が10」の斜線上に潰れていく様子を示している

x1x_1 を残りの説明変数で回帰する」——この回帰の決定係数を R12R_1^2 とすると

VIF1=11R12\mathrm{VIF}_1=\frac{1}{1-R_1^2}

R12R_1^2 は「x1x_1分散のうち他の変数で言い当てられる割合」なので、1R121-R_1^2「その変数だけが持っている独自の変動の割合」、VIFはその逆数です(以下「独自の情報」と書きますが、正確には分散の割合です)。

変数他の変数で説明できる割合独自の情報VIFSEの倍率
お金88.0%12.0%8.342.89 倍
文字数84.2%15.8%6.332.52 倍
ガジェット59.6%40.4%2.481.57 倍
被リンク数1.1%98.9%1.011.01 倍
週末0.4%99.6%1.001.00 倍

文字数のVIFが 6.33 なのは、「お金の記事は長い」という設定なのでジャンルが分かれば文字数もだいたい分かってしまうからです。

そして説明変数が2本だけなら相手は1本なので VIF=1/(1r122)\mathrm{VIF} = 1/(1-r_{12}^2) になります(数値でも一致を確認)。前節の 1/(1r2)1/(1-r^2) はVIFの2変数版でした。3本以上だと1つの相関では表せません(「x1x_1x2x_2 とも x3x_3 とも相関が低いのに x2+x3x_2+x_3 で再現できる」ことがある)。相関行列を眺めるだけでは多重共線性を見逃すのはこれが理由です。

多重共線性は「分解できない」問題

図の下段が今回いちばん面白い発見でした。真の係数が両方 5.0 のデータで、相関だけを変えて2000回推定します。

2変数の相関VIF個々の係数のsd合計 a+ba+b のsd
r=0r=01.00.2130.294
r=0.9r=0.94.60.4600.226
r=0.999r=0.999619.75.1660.214

ほぼ同一のとき個々の係数は sd 5.17 で暴れ、真の値が5なのに 5-5+15+15 が平気で出ます。ところが「2つの係数の合計」は sd 0.214 で、無相関のときより安定しています。

点が「合計が10」の斜線上に完全に潰れるのが図で見えます。係数間の相関は 0.999-0.999合計は正確に分かっているのに、その内訳が決められない状態です。

だから多重共線性は「情報が消える」問題ではなく「情報を分解できない」問題です。 この区別が実務で効きます。訓練データと同じような範囲を予測するだけなら多重共線性は気にしなくてよい(合計=予測値は安定している)。困るのは「どの変数がどれだけ効くか」を言いたいときです。

ただし予測でも1つ条件が付きます。説明変数どうしの関係が崩れた範囲へ外挿すると、内訳が決まっていない代償が予測にも出ます。 「文字数と被リンク数がいつも一緒に増える」データで学習したモデルを、「文字数だけ多い記事」に当てると外れます。

VIFが高い変数は消すべきか

危険です。 実験しました。VIFが高いジャンルダミーを削除すると、残った変数のVIFは全部 1.01 未満、見た目は完璧にきれいになります。ところが。

VIFが高い変数を消した結果を3枚で示した図。左は4000回の推定値のヒストグラムで、ジャンルを残した場合(緑)は真の値−40を囲んで散り、消した場合(赤)は幅が狭いのに+65付近に固まっている。中央は的の絵で、中心が真の値、緑は中心に当たり、赤はまとまってはいるが的の外周に固まっている。右は偏り・ばらつき・RMSEを対数目盛の棒グラフで比較し、ばらつきは4.68から1.85に改善したのに偏りが0.13から105.09に悪化したことを示している

変数全部入れるジャンルを消す真の値
文字数40.075-40.075(SE 4.69)+63.575+63.575(SE 4.64)40-40
ss(誤差)35.6288.4135

符号ごと逆転して真の値から104ズレました。 しかも標準誤差は 4.69 → 4.64 とわずかに「改善」して見えるのが厄介です。

4000回で構造が見えます。

ばらつき sd偏りRMSE(総合誤差)
ジャンルを残す(VIF 6.3)4.678+0.126+0.1264.680
ジャンルを消す(VIF 1.0)1.849+105.093+105.093105.110

ばらつきだけ見れば消した方が2.5倍「精密」ですが、的の中心から105ズレています。 「精度が良い」と「正しい」は別物で、VIFは前者しか見ていません。

そしてVIFは変数の属性ではなく関係性の指標です。同じ「文字数」の列でも、一緒に入れる変数によってVIFは 1.0046(被リンク数だけ)から 6.3256(ジャンル込み)まで変わります。「この変数はVIFが高い」ではなく「この組み合わせではVIFが高い」が正確な言い方です。

消してよいのは同じ情報の重複(文字数の千字版と字版、合計と内訳の両方)だけです。実際に両方入れるとVIFは無限大になり、係数は 1.09×106-1.09\times10^6、標準誤差は 2.6×1092.6\times10^9 に暴走しました。これは消しても情報が失われないので副作用がありません。対して交絡因子として必要な変数はVIFが高くても残す(偏りは取り返しがつかないが、ばらつきは nn を増やせば縮む)。

なおジャンルダミーのVIFが 2.48 と 8.34 と高いのは、ジャンルが文字数と強く相関している(お金の記事は長い)からで、「ダミー変数だから」ではありません。3水準を均等に分けた排他的ダミーどうしは互いに 0.5-0.5 程度の負の相関を持ちますが、それだけならVIFは 1.33 程度にとどまります(文字数を外してジャンルダミーだけを入れると実測で 1.33 / 1.33)。

「他の変数を固定したとき」の正体

いよいよ本題です。実際に固定していないのに、なぜそう解釈できるのか。

答え:重回帰の係数は、次の3ステップと完全に同じ値になります。

  1. 文字数から、他の説明変数で説明できる分を抜き去る(残差を取る)
  2. PVからも同じように抜き去る
  3. 残った2つの残差だけで単回帰する

偏回帰係数が残差回帰であることを6枚で示した図。①は生のデータで傾き+61.5、ジャンルの違いが混ざっている。②は文字数から他の4変数の影響を抜いた残差を縦軸に取ったもので、3ジャンルが同じ帯に重なりジャンルの差が消えている。③は残差同士の散布図で傾き−40.08、重回帰の係数と小数10桁まで一致。④はジャンル別の傾き(−29、−43、−62)と全体の傾きを比較。⑤は固定の代償として平方和が364.5から57.6(15.8%)に減ることを棒グラフで示す。⑥は解釈の言い方を3段階(正しい・慣習的・危険)で整理している

計算方法文字数の係数
残差同士の単回帰の傾き40.0752493005-40.0752493005
(XX)1Xy(X^\top X)^{-1}X^\top y の該当成分40.0752493005-40.0752493005
7×10137\times10^{-13}

小数10桁まで一致。 全5係数で成立します(フリッシュ=ウォー=ローヴェルの定理)。

2つ補足します。yy 側は残差化しなくても傾きは同じ値になります(yy をそのまま使っても 40.0752493005-40.0752493005xx の残差が他の変数と直交しているため)。ただし一致するのは係数だけで、標準誤差は一致しません——残差回帰の自由度は n2=118n-2=118 になり、重回帰の np=114n-p=114 と違うので、SEは 4.612 対 4.692 とズレます。残差回帰は係数の意味を理解するための道具で、検定にそのまま使うものではありません。

②の図が核心です。 もとの文字数は3ジャンルが階段状に並んでいますが、残差を取ると3つの集団が同じ0の周りに重なります。 残差の意味は「そのジャンルの平均的な長さと比べて何千字長いか」なので、お金の記事の中で長めのもの日記の中で長めのものが同じ「+0.5」として扱われる。ジャンルという情報が消えています。

念のため確認すると、文字数の残差と他の各変数の相関はすべて 101510^{-15} 程度、計算機の誤差の範囲でゼロでした。「固定した」というより「他の変数の影響を数学的に消去した」と言うのが正確です。

固定の代償がVIFだった

残差回帰の傾きは単回帰と同じ形です。

β^1=(xの残差)(yの残差)(xの残差)2\hat\beta_1=\frac{\sum(x\text{の残差})(y\text{の残差})}{\sum(x\text{の残差})^2}

分母は「その変数に残った独自情報の量」です。実データでは平方和が 364.5106 → 57.6248、比は 0.158088(=1Rj2= 1-R_j^2)。使える情報が15.8%に減りました。

標準誤差は分母の平方根に反比例するので

11Rj2=VIF=2.5151 倍\frac{1}{\sqrt{1-R_j^2}}=\sqrt{\mathrm{VIF}}=2.5151\text{ 倍}

に膨らみます(VIF 6.3256 の平方根 2.5151 と一致)。

これで全部繋がりました。 「他の変数を固定する」とは「他の変数で説明できる分を捨てる」こと。捨てれば使える情報が減るので推定が不安定になる。VIFはその「捨てた量」を測っていたわけです。

交絡を除くために変数を入れる → 情報を捨てる → 精度を失う。 この1本のトレードオフがこの記事全体を貫いています。

何と言えば正しいのか

言い方評価
「同じジャンル・同じ被リンク数の記事どうしを比べると、1千字長い記事はPVが40低い」正しい
「他の変数を一定に保ったとき、文字数を1千字増やすとPVが40下がる」慣習的(教科書もこう書く)
「記事を1千字短くすればPVが40増える」危険

3つ目が危険なのは観察データから介入の効果を主張しているからです。実際に記事を短くしたら、「同じジャンルの中で短い記事」になるのではなく内容そのものが変わるかもしれません。係数が答えているのは「比較」であって「介入の結果」ではありません。

決定係数はなぜ変数を増やすと必ず上がるのか

答え:新しい変数の係数を 0 に選べば、前のモデルと完全に同じ予測ができるからです。

変数を1本足すことは平面の次元を1つ増やすことでした。広い空間には元の平面がまるごと含まれるので、前のモデルの答えは新しいモデルでも「選べる候補」の1つです。最小二乗法は候補の中でRSSが最小のものを選ぶので、候補が増えて最小値が悪くなることはありえません。

決定係数を6枚のパネルで検証した図。①は本物5変数に乱数を足していくとR²(赤)が単調に増えて1に到達し、調整済みR²(緑)が途中から崩れることを示す。②は入れ子の構造を楕円の包含関係で示し、前のモデルが新しいモデルの選択肢に含まれるのでRSSは必ず減ることを説明。③はR²と調整済みR²の式を対比し、調整済みが1−s²/V[y]であることを示す。④は調整済みR²が上がる条件が|t|>1ちょうどであることを600回の散布図で示し、境界が縦線でぴったり分かれている。⑤は乱数だけで回帰したときのR²が理論値k/(n−1)に一致することを示す。⑥は使い分けと3つの注意をまとめている

実際に乱数1本を足すと RSS が 144,619.42 → 143,834.41 と785.01 減りました。 乱数はPVと何の関係もないのに、です。

足した乱数変数の数R2R^2調整済み R2R^2ss
050.9474740.94517135.62
20250.9572570.94588935.38
1001050.9905670.91982343.07
1131180.9977040.72678079.51

最後の行が怖いところです。 R2=0.9977R^2 = 0.9977 でほぼ完璧な当てはまりですが、足したのは全部でたらめな乱数。そして ss は 35.6 → 79.5 に悪化しています。「よく当てはまっている」のに「予測は使い物にならない」——これが過適合(overfitting)です。

ただし正確に言うと、最終行は残差自由度が np=1n-p=1 しかないので、s=79.5s = 79.5極端にばらつく推定値の1標本です(同条件を500回試すと E[s2]E[s^2] は真値1225付近のまま不偏で、ss の中央値は 21.7、79.5を超えるのは4%)。ss が確実に悪化するのではなく、当てにならなくなるのが実害だと読んでください。

さらに直接的なのが、本物の変数を1本も使わず乱数だけで回帰した場合です。

E[R2]=kn1E[R^2]=\frac{k}{n-1}

kk は説明変数の本数です。切片があって、yy が説明変数と独立かつ同一分布(iid)なら、これは厳密な等式です(yy が正規分布である必要はありません。対数正規やコーシーでも成立することを確認しました)。逆に yy の分散が観測ごとに違ったり平均がずれていたりすると崩れます。n=120n=120 で乱数100本なら R20.84R^2 \approx 0.84(30回平均の実測 0.826 は標本誤差の範囲)。R2R^2 が0.8を超えていても、それ自体は何の証拠にもなりません。

調整済み R2R^2 は「自由度1本あたり」に直している

R2=1RSSTSSRˉ2=1RSS/(np)TSS/(n1)=1s2V[y]R^2=1-\frac{\mathrm{RSS}}{\mathrm{TSS}}\qquad\longrightarrow\qquad\bar R^2=1-\frac{\mathrm{RSS}/(n-p)}{\mathrm{TSS}/(n-1)}=1-\frac{s^2}{V[y]}

分子は s2s^2、分母は yy の分散です。つまり調整済み R2R^2 は「s2s^2 が小さくなったか」を見ています。

変数を足すと分子のRSSは必ず減りますが、同時に npn-p も1つ減ります。 割り算なので、分子の減りが「自由度1本を失う代償」に見合わなければ s2s^2増えてしまい、Rˉ2\bar R^2 は下がる。「変数1本ぶんの価値があったか」を判定しているわけです。

そして「価値」の正確な条件が分かりました。変数を1本足して調整済み R2R^2 が上がるのは、その変数の t>1|t| > 1 のときだけです(600回試して例外0件、図④で境界がぴったり t=1|t|=1 の縦線で分かれます)。

これは経験則ではなく厳密な同値条件で、3行で示せます。Rˉ2\bar R^2 の式で TSS\mathrm{TSS}n1n-1 は変数を足しても変わらないので、Rˉ2\bar R^2 が上がることは s2s^2 が下がることと同じです。d=npd = n - p_{\text{新}} と置くと

RSSd<RSSd+1    RSSRSSRSS/d>1\frac{\mathrm{RSS}_{\text{新}}}{d}<\frac{\mathrm{RSS}_{\text{旧}}}{d+1}\iff\frac{\mathrm{RSS}_{\text{旧}}-\mathrm{RSS}_{\text{新}}}{\mathrm{RSS}_{\text{新}}/d}>1

左辺は追加した1変数の部分F統計量そのもので、1変数なら F=t2F = t^2。よって条件は t2>1t^2 > 1、つまり t>1|t| > 1 です。シミュレーションで反例が出ないのは当然でした。

ここから2つ注意が出ます。調整済み R2R^2 は甘い基準です(有意の境界は約1.98なのに、通す境界は1)。そして「無意味な変数で必ず下がる」わけではありません——乱数でも t>1|t|>1 は約30%起きるので(400回中121回)、その分は上がってしまいます。平均的にはほぼ横ばいで、単調増加する R2R^2 との違いはそこです。

実務ではR2R^2 より ss を見るほうが実用的だと感じました。s=35.6s = 35.6 なら「予測は±70PVくらいずれる」と分かりますが、R2=0.947R^2 = 0.947 からはこの感覚が得られません。そしてss は変数を足しても自動的には下がりません(上の表の右端が証拠)。

なおこの例で R2R^2 が高いのは私が真の構造を知っていてそのとおりの変数を入れたからです。現実のアクセス解析でこの数字はまず出ません。

なぜ回帰で検定が必要になるのか

ここまでは「係数を求める」話でした。では求めた 40.08-40.08 は信じてよいのか。 ここで検定が出てきます。

PVとまったく関係のない乱数の列を1本追加してみます。真の効果はゼロです。

なぜ検定が必要かを4枚のパネルで示した図。①は真の効果がゼロの変数を4000回入れた結果のヒストグラムで、平均は+0.003とほぼ0だが範囲は−12.35から+12.26まで広がり、一度もぴったり0にならないことを示す。②はそれをt値に直したもので95%が|t|<1.98に収まり、本物の変数(緑の矢印)はt=7.3から24.3まで偶然の範囲のはるか外にあることを示す。③はt検定を繰り返すと少なくとも1本が偶然有意になる確率が積み上がることを曲線で示し、20本で64%、60本で95%。④はF検定を門番として先に1回行い、通ったら個別のt検定に進む2段構えの手順を図解している

一度も「ぴったり0」になりません。 最小二乗法は「与えられた列でRSSを最小にする」だけの機械なので、無関係な列でも偶然の一致を拾って0でない係数を返します。10回のうち1回は p=0.0490p = 0.0490 で「有意」にもなりました。中身は完全な乱数なのに。

だから「この係数は本物か、偶然か」を判定する仕組みが必要になります。それが検定です。

4000回集めると、効果ゼロの係数は平均 +0.003+0.003、標準偏差 3.37、範囲は 12.35-12.35+12.26+12.26tt 値に直すと 95%が t<1.981|t| < 1.981 に収まります(実測で t>1.981|t|>1.981 が 0.0583、理論値0.05)。「効果がゼロならこの範囲に散る」と事前に分かるから、超えたら「偶然では説明しにくい」と判断できるわけです。

本物の変数は t|t| が 7.33〜24.27。偶然では絶対に届かない距離にあります。

F検定は門番、t検定は内訳

t検定は変数1本ごとに1回行うので、繰り返すと偶然の有意が混ざる確率が上がります。

変数の本数少なくとも1本が偶然有意になる確率
1本5.0%
5本22.6%
20本64.2%
60本95.4%

第12回でやった多重比較の問題です。そこでF検定を「門番」として先に1回だけ行います。

分散分析表とF検定を6枚のパネルで示した図。①は分散分析表の構造で、回帰の平方和2,608,699・自由度5・平均平方521,740、残差144,619・114・1,269、全体2,753,318・119、F=411.3。②はF検定とt検定の帰無仮説の違いを対比。③は相関0.99の3変数でF検定が有意なのに個別のt検定の信頼区間が3本すべて0を跨ぐこと、しかし3つの合計は明確に0から離れていることを示す。④はダミー変数の係数が基準との差であることを積み上げ棒で示す。⑤は交互作用を入れると傾きが層ごとに変わることを実線と破線で対比。⑥は部分F検定のF分布と棄却域、観測値F=3.090・p=0.0494を示している

分散分析表はブロック2の平方和分解に自由度を付けただけです。

要因平方和自由度平均平方F値
回帰2,608,698.75521,739.7411.27
残差144,619.41141,268.6
全体2,753,318.1119
F=ESS/(p1)RSS/(np)=2,608,698.7/5144,619.4/114=521,739.71,268.6=411.27F=\frac{\mathrm{ESS}/(p-1)}{\mathrm{RSS}/(n-p)}=\frac{2{,}608{,}698.7/5}{144{,}619.4/114}=\frac{521{,}739.7}{1{,}268.6}=411.27

分母はブロック3の s2s^2 そのものです。「説明できた量は、説明しきれない量の何倍か」を測っています。第7回でやったとおりF分布は分散の比の分布なので、この形が自然に出てきます。上側5%点は 2.2939 なので、モデル全体は明確に有意です。

F=R2/(p1)(1R2)/(np)F = \dfrac{R^2/(p-1)}{(1-R^2)/(n-p)} とも書けて、実データで 411.274849 と表のF値が完全に一致しました(pp は切片を含むパラメータ数なので、分子の自由度は説明変数の本数 p1=5p-1=5、分母は np=114n-p=114 です)。R2R^2 を「有意かどうか」の形に変換したものがF値です。

そして単回帰では F=t2F = t^2 になります(t=10.869253t = 10.869253t2=118.140656t^2 = 118.140656F=118.140656F = 118.140656)。変数が1本なら「全体の検定」と「その係数の検定」は同じ質問だからです。

F有意なのに個別tが全部非有意になる仕組み

これが今回いちばん知りたかった現象です。互いの相関0.99の3変数(真の係数は全部 +4+4、合計12)、n=60n=60 で作りました。

変数推定値SEt値p値判定VIF
x1x_1+1.780+1.7805.8870.3020.7636非有意54.9
x2x_2+11.474+11.4746.3261.8140.0751非有意63.8
x3x_31.341-1.3415.6120.239-0.2390.8120非有意50.3
合計+11.913+11.9130.79614.963×10213\times10^{-21}明確に有意

モデル全体は F(3,56)=75.33F(3,56) = 75.33、p値は 101910^{-19} 台、R2=0.8014R^2 = 0.8014 なのに個別は3本とも非有意です。

矛盾していません。2つは違う質問への答えです。

  • F検定:「3変数まとめて説明力があるか」→ ある
  • t検定:「x2,x3x_2, x_3 を固定して x1x_1 だけの固有の力があるか」→ ない

相関0.99なら、他の2本を固定した後に x1x_1 にはほぼ何も残りません(残差回帰の話)。そして合計を見れば p3×1021p \approx 3\times10^{-21} 前節の「情報が消えたのではなく分解できないだけ」と完全に同じ現象で、この食い違いは多重共線性のサインとして読むのが正しい対応です。

ダミー変数と交互作用

ここは検定とは別の話題で、モデルの作り方にあたります。

ダミー変数の罠

3水準に3本のダミーを作ると計算できません。 3列の合計が常に1になり、切片の列と同一になるからです。XXX^\top X の行列式は数学的には厳密に0で(計算機では丸め誤差のため 1.023×1091.023\times10^{-9} と表示されます)、逆行列が存在しません。だから1本落として基準にします。

ジャンル計算PV水準
日記(基準)切片そのもの155.1
ガジェット切片 + 226.0381.1
お金切片 + 483.3638.5

係数は「基準との差」であって絶対水準ではありません。 基準をお金に変えると切片は 638.48、ダミーは 483.34-483.34257.33-257.33 になりますが、R2R^2(0.947474)も RSS(144619.42)も予測値も完全に同一です。表現が変わるだけで中身は同じモデルです。

交互作用は層別と同一だった

層ごとに傾きを変えたいときは2つの変数を掛け算した列を足すだけです。ガジェットの記事ではダミーが1なので傾きが β1+β6\beta_1 + \beta_6 に、日記では β1\beta_1 のままになります。

そして発見がありました。すべての変数を交互作用させた重回帰は、層別に別々に回帰するのと数学的に同一です。

なお下の表の傾きは、記事の冒頭で出した層別の値(29.44-29.44 / 42.90-42.90 / 61.72-61.72)とは別の量です。冒頭は「文字数だけ」で層別した傾き、下の表は「文字数・被リンク数・週末」を入れて層別した傾きなので、値が違います。

完全交互作用モデル層別に別々の回帰(被リンク数・週末も含む)
日記の傾き27.2843-27.284327.2843-27.2843
ガジェットの傾き57.7126-57.712657.7126-57.7126
お金の傾き38.9069-38.906938.9069-38.9069
RSS132731.8685132731.8685

層別と重回帰は対立する方法ではなく、交互作用の入れ方で連続的に繋がっています。 主効果のみ=傾き完全共通、一部だけ交互作用=部分的に共通、全部交互作用=完全に別々(=層別)。

部分F検定と、私が引いた偽陽性

交互作用の2項をまとめて検定します。入れ子になった2つのモデルの比較で、第12回の尤度比検定と同じ発想です。比べるのは「主効果のみ(p=6p=6)」と「文字数×ジャンルの2項だけを追加したモデル(p=8p=8)」です(上の完全交互作用モデルではありません)。

F=(RSSRSS)/qRSS/(np)=(144,619.4137,056.2)/2137,056.2/112=3.0903F=\frac{(\mathrm{RSS}_{\text{小}}-\mathrm{RSS}_{\text{大}})/q}{\mathrm{RSS}_{\text{大}}/(n-p_{\text{大}})}=\frac{(144{,}619.4-137{,}056.2)/2}{137{,}056.2/112}=3.0903

自由度 (2,112)(2, 112) の上側5%点は 3.0773 なので、p値は 0.0494。かろうじて有意です。

ところがこのデータの真の構造に交互作用は入っていません。 つまり第一種の誤り(偽陽性)を引きました。

検定自体は正しく機能しています。同じ設定で4000回試すと p値が0.05を下回る割合は 0.0470(理論値0.05)でした。今回はたまたま5%の偶然を引いただけです。

p=0.0494p = 0.0494 という 0.05 のすぐ下の値は、そもそも弱い証拠です。 「有意だから真」ではないことを、自分のデータで踏んでしまいました。境界のp値が出たときは追加データで確認するか、ドメイン知識で判断すべきです。

「検定で無意味な変数を炙り出す」の限界

検定は変数選別の道具ですが、2種類の失敗をします。

検定の限界を3枚で示した図。①は真の効果の大きさと検出力の関係で、β=2では8.2%しか本物を見つけられず、β=20で100%になる。無意味な変数を誤って有意とする割合は常に約5%で一定。②は無意味な変数をk本追加したときに有意になった本数で、100本追加すると平均5.55本が偽陽性となり、さらに本物を2.50本取り逃すことを示す。③は30本すべて無意味なデータでステップワイズ法を実行した結果の分布で、平均1.90本が生き残り82.7%の確率で「有意な変数のあるモデル」ができることを示している

失敗1:見逃し。

真の効果 β\beta本物を有意と判定できた割合無意味を誤って有意とした割合
00.0500.046
20.0820.048
50.3430.046
100.8570.049
201.0000.056

偽陽性の率は常に約5%で一定(設計どおり)ですが、本物を見つけられる率は効果の大きさに強く依存します。 β=2\beta = 2 なら8%しか見つけられない。「有意でなかった」は「効果がない」を意味しません。

正直に書いておくと、この記事の通し例で t|t| が 7〜24 という景気のいい数字が出たのは私が効果の大きい設定でデータを作ったからです。現実のブログ解析では t|t| が 1〜3 の微妙な変数がずらりと並びます。

失敗2:偽陽性の積み上がり。 無意味な変数を100本入れると、平均 5.55本が「有意」として残り、さらに本物を2.50本取り逃します

後者の理由は、追加した列が既存の変数と偶然相関してVIFが上がり、すべての係数のSEが膨らむからです。ここは私も最初「自由度が減って ss が大きくなるから」と考えて間違えました。s2s^2 は不偏推定量なので、無意味な変数を何本足しても期待値は σ2\sigma^2 のままです。実測すると乱数を1本足したときの E[s]=34.95E[s] = 34.95、80本足しても 34.7834.78(真の σ=35\sigma = 35)でほぼ動きません。それでもSEは 4.62 から 8.42 へ1.8倍に膨らみます。 主因は ss ではなく (XX)1(X^\top X)^{-1} の対角成分、つまりVIFでした。

ステップワイズ法が推奨されない理由

「有意でない変数を消して、また検定して、また消す」——ステップワイズ法(変数増減法)です。真の効果が全部ゼロのデータ(30本すべて無意味)でやってみました。正解は「1本も残らない」です。

結果(200回の平均)
最終モデルに残った変数の数1.90 本
最終モデルの R2R^20.082
1本以上「有意」が残った割合82.7%

全部が無意味なのに、82.7%の確率で「有意な変数のあるモデル」が出来上がります。

原因は同じデータを何度も検定していることです。偶然p値が小さかった変数だけが生き残るので、最後に残った変数のp値はもう本来の意味を持ちません。5%の偶然を何十回も引き直して、当たったものだけ採用しているからです。

準1級では手順を知っておく必要がありますが、この欠点も併せて理解すべきところです。

変数選択の他の方法

ステップワイズ以外にも方法はあります(詳細は後の回に譲りますが、地図として置いておきます)。

方法考え方
情報量規準(AIC・BIC)検定を繰り返さず、モデル全体の当てはまりと複雑さのバランスを1つの数値で比較する
交差検証(クロスバリデーション)データを分割し、選ぶのに使わなかったデータで評価する。過適合を直接検出できる
リッジ回帰係数を0に近づける罰則を加える。多重共線性に強く、(XX)1(X^\top X)^{-1} が壊れるのを防ぐ
Lasso罰則の形を変えて、係数をちょうど0にする。変数選択と推定を同時に行う
全部の組み合わせを試す(総当たり)変数が少ないときのみ。説明変数が kk 本なら 2k2^k 通り

ただしどの方法を使っても、ブロック1の3分類(交絡・媒介・合流点)の判断は代替できません。 交絡因子を統計的な基準で落としてしまえば、どんな高級な手法でも偏った答えを返します。変数選択の手法は「入れる候補が決まった後」の道具です。

実務(ブログのアクセス解析)でどう使うか

学んだことを自分のブログ運営に落とすとこうなります。

変数はGA4を見る前に決める。 「ジャンル」「文字数」「公開からの経過日数」のように、PVに効く理屈が言えるものを先に列挙します。データを見て有意なものを拾うと、この記事で見たとおり偶然を拾います。

予測が目的か解釈が目的かを先に決める。 「来月のPVを見積もりたい」なら多重共線性は無視してよく、ss を見て精度を判断します。「記事を長くすべきか」なら解釈が目的なので、交絡因子を全部入れてVIFの警告を受け入れます。

nn が小さいことを自覚する。 私のブログは記事数が2桁なので、変数を5本も入れれば自由度がすぐ尽きます。目安は nn の1/10。この記事の n=120n=120 でも12本が上限です。

係数の大きさを見る。 有意かどうかより「実務的に意味のある大きさか」。PVが0.5増える効果は、有意でも使えません。

A/Bテストができるなら回帰より優先する。 第13回でも書きましたが、介入の効果を知りたいなら実験が正攻法です。重回帰で交絡を除くのは、実験できないときの代替手段にすぎません。

つまずいたところ

2つの3次元の図を同じものだと思っていた。 これが最大の混乱でした。「軸が変数の絵(回帰平面)」と「軸がデータ1件ごとの絵(列空間)」はまったく別で、どちらにも出てくる「平面」の意味も無関係です。絵Bは無くても重回帰は理解できると気づいてから整理できました。

「平面 = β\beta」だと思っていた。 平面を決めるのは XX だけで、β\beta平面上のどこに立つかを指す座標です。平面は β\beta を動かす前から決まっています。

単位ベクトルだと思っていた。 図の (1,1,1)(1,1,1)(1,3,5)(1,3,5) は長さ1ではありません。ただし「あの2本自体に意味はない」という直感は正しく、同じ平面を張る別の2本でも結果は同じです。

Σ\Sigma が消える」と思った。 yˉ=y/n\bar y = \sum y / n は平均の定義なので、Σ\Sigma は消えたのではなくyˉ\bar y という記号の中に入っているだけでした。逆向きに読めば y=nyˉ\sum y = n\bar y で戻ってきます。

中心化が別の手法だと思った。 導出の途中で b=yˉaxˉb = \bar y - a\bar x を代入した操作が、実質的に中心化そのものでした。新しい道具ではなく、既にやっていたことに名前が付いただけです。

媒介変数を「間違った因果」だと誤解した。 逆でした。媒介変数は本物の因果で、事故は「無い効果を有ると誤認した」ではなく「ある効果を通り道を塞いで消した」です。

合流点を「因果が逆」だと思った。 逆因果は別の罠です。合流点はXとYの両方から矢が刺さり込む先で、条件付けると無かった相関が生まれます(p値 0.695 が 1030010^{-300} 未満に化けた)。

VIFを「その変数の情報量」だと思った。 VIFは他の説明変数との重複度で、関係性の指標です。同じ変数でも一緒に入れる変数の顔ぶれでVIFは変わります(1.0046 → 6.3256)。

「VIFが高いから消す」が正しいと思った。 消すとSEは改善するのに係数が符号ごと反転しました。「精度が良い」と「正しい」は別物で、VIFは前者しか見ていません。

相関に直すのは計算が楽になるからだと思った。 逆で、計算量は増えます。理由は単位を消して大小を判断できるようにすることでした(xx の単位を変えると共分散は8.83から8833.33に化けるが、相関は0.9810のまま)。

「有意でない変数を消す」を良い手順だと思っていた。 全部無意味なデータで82.7%の確率で「有意な変数」が生き残ります。同じデータで検定を繰り返すとp値が意味を失うからです。

自分の記事で偽陽性を引いた。 部分F検定で p=0.0494p = 0.0494 が出て「交互作用は必要」と判定しましたが、真の構造には交互作用がありません。0.05のすぐ下は弱い証拠だという教訓を、身をもって得ました。

この記事の要点

  • 最小二乗法は射影。 (XX)1X(X^\top X)^{-1}X^\top は「残差が説明変数と直交する」条件を β\beta について解いた結果。行列は連立方程式の書き方でしかない
  • 直交するから TSS=ESS+RSS\mathrm{TSS}=\mathrm{ESS}+\mathrm{RSS} が成立し、R2R^2 が「割合」として読める122=116+6122 = 116 + 6、実データの差 1.75×10101.75\times10^{-10}
  • tr(IH)=np\mathrm{tr}(I-H)=n-p が自由度の正体。 これが s2s^2 の分母と調整済み R2R^2 の両方に効く
  • 「共分散÷分散」は射影に n1n1\frac{n-1}{n-1} を掛けただけ(小数10桁一致)。中心化は切片を分離する座標移動で、傾きとRSSは不変
  • 中心化した XXX^\top X = 共分散行列 × (n1)(n-1) 係数は「共分散行列の逆行列 × yy との共分散」
  • 層を無視すると符号が反転する+61.47+61.4740.08-40.08)。だがとりあえず全部入れるのは誤り——合流点を入れると効果ゼロが 27.0-27.0 に化ける
  • 矢の向き(交絡・媒介・合流点)はデータから判別できない。 ドメイン知識だけが決められる
  • V[β^]=σ2(XX)1V[\hat\beta]=\sigma^2(X^\top X)^{-1}β^β=Aε\hat\beta-\beta=A\varepsilon から1行。4000回の実測sd 4.6353 対 公式SE 4.6920
  • npn-p で割らないと σ2\sigma^2 を5%過小評価(1166.0 対 真値1225)
  • SE=ssjn1VIF\mathrm{SE}=\frac{s}{s_j\sqrt{n-1}}\sqrt{\mathrm{VIF}}(全係数で 101410^{-14} 以下の誤差)。1/n1/\sqrt{n} の法則は両対数の傾き 0.53-0.53 で確認
  • R2R^2 は必ず上がる(前のモデルが選択肢に含まれるから)。乱数113本で 0.9977、しかし ss は 35.6→79.5
  • 乱数だけでも E[R2]=k/(n1)E[R^2]=k/(n-1)yy がiidなら厳密)。 R2R^2 の高さは何の証拠にもならない
  • 調整済み R2R^2 が上がる境界は t=1|t|=1 ちょうど(600回で反例0件)。有意の境界1.98とズレているので甘い
  • 偏回帰係数=残差同士の単回帰の傾き(フリッシュ=ウォー=ローヴェル、小数10桁一致)。「固定」=「他で説明できる分を捨てる」
  • 捨てた量がVIF。 文字数の独自情報は15.8%、SEが2.52倍
  • 多重共線性は「分解できない」問題。 相関0.999で個々のsdは5.17でも合計のsdは0.214
  • VIFが高いから消すと符号が反転する(RMSE 4.68 対 105.11)。消してよいのは同じ情報の重複だけ
  • F検定は門番、t検定は内訳。 相関0.99の3変数で F=75.3F=75.3 なのに個別tは全部非有意、合計は p=3×1021p=3\times10^{-21}
  • 単回帰では F=t2F=t^2(118.140656 で一致)
  • 全変数を交互作用させた重回帰 = 層別(傾きもRSSも完全一致)
  • 検定は変数選別の道具だが、変数が多いと破綻する。 無意味100本で5.55本が偽陽性+本物2.50本を取り逃す
  • ステップワイズは全部無意味でも82.7%で「有意な変数」を残す

次回は第17章の回帰診断法です。この記事では「モデルを作って係数を解釈する」ところまでやりましたが、そのモデルの前提が成り立っているかをまだ確認していません。誤差が等分散なのか、外れ値が1点で結果をひっくり返していないか、残差に構造が残っていないか。H=X(XX)1XH = X(X^\top X)^{-1}X^\top の対角成分が「てこ比」として再登場します。