重み付き回帰分析を自力でやってる

 


重み付き回帰分析というものがある。それぞれのデータに重みを設定し、信頼度の低いデータが回帰の結果に影響を及ぼさないようにする方法である。

 

存在は知っていたが計算方法を具体的に知らなかったので、勉強してみることにした。

 

データの準備

 とりあえず以前から使用しているデータに適当に重みを設定して、以下のデータとする。

 x

(説明変数)

1 2 3 4 5

 y

(被説明変数)

2 6 6 9 6

 w

(重み)

0.5 1 0.5 1

ちなみに普通に回帰分析した時の結果はこちら。

f:id:Chemstat:20200804164539j:plain 

 

 計算式

通常の線形回帰は、残差\varepsilon_i=y-\hat{b}x-\hat{a}の二乗和が最小になるよう傾きを求めるが、重み付き回帰分析では、それぞれの残差の二乗に重みを掛けることになる。

残差の二乗和

通常の回帰: \small\begin{align*}E=\sum_{i=1}^n\varepsilon_i^2\end{align*}

重み付き回帰: \small\begin{align*}E=\sum_{i=1}^nw_i\varepsilon_i^2\end{align*}

 f:id:Chemstat:20210123194031j:plain

図にするとこんな感じ。x=2,4の残差が重みを反映して\sqrt{w_i}だけ小さくなっている。

 

そして、Eが最小になるためには、 \begin{align*} \frac{\partial E}{\partial a}=0\end{align*} \begin{align*} \frac{\partial E}{\partial b}=0\end{align*}を満たすabを求めればよい。

詳細な導出については参考サイトを見てもらうとして、解くべき連立方程式は下記のようになる。

通常の回帰:

{\displaystyle \begin{eqnarray} \left\{ \begin{array}{l} \sum\limits_{i=1}^nbx_i - \sum\limits_{i=1}^n(y_n -a) = 0 \\ \sum\limits_{i=1}^nb{x_i}^2 - \sum\limits_{i=1}^nx_n(y_n -a) = 0 \end{array} \right. \end{eqnarray} }

重み付き回帰: 

{\displaystyle \begin{eqnarray} \left\{ \begin{array}{l} \sum\limits_{i=1}^nw_ibx_i - \sum\limits_{i=1}^nw_i(y_n -a) = 0 \\ \sum\limits_{i=1}^nw_ib{x_i}^2 - \sum\limits_{i=1}^nw_ix_n(y_n -a) = 0 \end{array} \right. \end{eqnarray} }

これを切片a、傾きbについて解くと下記のようになる。

なんだかややこしく見えるけど、やってることはただ連立方程式を解いているだけなので気楽に読み飛ばしてもらえればいいです。

 

 

 

通常の回帰

傾き: \begin{align*} \hat{b} = \frac{\sum\limits_{i=1}^n\sum\limits_{i=1}^nx_iy_i-\sum\limits_{i=1}^nx_i\sum\limits_{i=1}^ny_i}{\sum\limits_{i=1}^n\sum\limits_{i=1}^nx_i^2-(\sum\limits_{i=1}^n{x_i})^2 }\end{align*}

切片: \begin{align*} \hat{a} = \frac{\sum\limits_{i=1}^nx_i^2\sum\limits_{i=1}^ny_i-\sum\limits_{i=1}^nx_i\sum\limits_{i=1}^nx_iy_i}{\sum\limits_{i=1}^n\sum\limits_{i=1}^nx_i^2-(\sum\limits_{i=1}^n{x_i})^2 }\end{align*}

 

 

重み付き回帰

傾き: \begin{align*} \hat{b} = \frac{\sum\limits_{i=1}^nw_i\sum\limits_{i=1}^nw_ix_iy_i-\sum\limits_{i=1}^nw_ix_i\sum\limits_{i=1}^nw_iy_i}{\sum\limits_{i=1}^nw_i\sum\limits_{i=1}^nw_ix_i^2-(\sum\limits_{i=1}^n{w_ix_i})^2 }\end{align*}

切片: \begin{align*} \hat{a} = \frac{\sum\limits_{i=1}^nw_ix_i^2\sum\limits_{i=1}^nw_iy_i-\sum\limits_{i=1}^nw_ix_i\sum\limits_{i=1}^nw_ix_iy_i}{\sum\limits_{i=1}^nw_i\sum\limits_{i=1}^nw_ix_i^2-(\sum\limits_{i=1}^n{w_ix_i})^2 }\end{align*}

 

各成分に重みw_iを掛けてた式になっている。ぱっと見面倒くさそうな式に見えるが、ここからはデータをコツコツ入れればいいだけなのでもうひと頑張りしよう。

 

実データでの計算

 通常の回帰は以前の記事を見てほしい。式変形が進んでいて今回のものと形は違うがやっていることは同じである。

 

 \sum\limits_{i=1}^nw_i\sum\limits_{i=1}^nw_ix_iy_i \scriptsize =(1+0.5+1+0.5+1)\times(1\times1\times2+0.5\times2\times6+1\times3\times6+0.5\times4\times9+1\times5\times6)\normalsize=296

 \sum\limits_{i=1}^nw_ix_i\sum\limits_{i=1}^nw_iy_i \scriptsize =(1\times1+0.5\times2+1\times3+0.5\times4+1\times5)\times(1\times2+0.5\times6+1\times6+0.5\times9+1\times6)\normalsize=258

 

 \sum\limits_{i=1}^nw_ix_i^2\sum\limits_{i=1}^nw_iy_i \scriptsize =(1\times1^2+0.5\times2^2+1\times3^2+0.5\times4^2+1\times5^2)\times(1\times2+0.5\times6+1\times6+0.5\times9+1\times6)\normalsize=967.5

\sum\limits_{i=1}^nw_ix_i\sum\limits_{i=1}^nw_ix_iy_i \scriptsize =(1\times1+0.5\times2+1\times3+0.5\times4+1\times5)\times(1\times1\times2+0.5\times2\times6+1\times3\times6+0.5\times4\times9+1\times5\times6)\normalsize=888

\sum\limits_{i=1}^nw_i\sum\limits_{i=1}^nw_ix_i^2 \scriptsize =(1+0.5+1+0.5+1)\times(1\times1^2+0.5\times2^2+1\times3^2+0.5\times4^2+1\times5^2)\normalsize=180

(\sum\limits_{i=1}^n{w_ix_i})^2\scriptsize =(1\times1+0.5\times2+1\times3+0.5\times4+1\times5)^2\normalsize=144

 

傾き: \begin{align*} \hat{b} = \frac{\sum\limits_{i=1}^nw_i\sum\limits_{i=1}^nw_ix_iy_i-\sum\limits_{i=1}^nw_ix_i\sum\limits_{i=1}^nw_iy_i}{\sum\limits_{i=1}^nw_i\sum\limits_{i=1}^nw_ix_i^2-(\sum\limits_{i=1}^n{w_ix_i})^2 }=\frac{296-258}{180-144}=1.05555...\end{align*}

切片 \begin{align*} \hat{a} = \frac{\sum\limits_{i=1}^nw_ix_i^2\sum\limits_{i=1}^nw_iy_i-\sum\limits_{i=1}^nw_ix_i\sum\limits_{i=1}^nw_ix_iy_i}{\sum\limits_{i=1}^nw_i\sum\limits_{i=1}^nw_ix_i^2-(\sum\limits_{i=1}^n{w_ix_i})^2 }=\frac{967.5-888}{180-144}=2.2083...\end{align*}

 

グラフにプロットするとこのようになる。X=2,4の点の寄与が減ったことにより、回帰分析が元の線よりやや下にシフトしていることが分かる。

f:id:Chemstat:20210120004322j:plain

データの重みを加えることがで外れ値の影響を減らすごとができ便利に見えるが、重みwを自分で指定する必要があり、実際に使用しようと思うとなかなか難しい。次回はこの重みの設定についていくつか紹介したい。

参考

重み付き回帰分析の傾きと切片:

重み付き直線フィッティング - わかばテクノロジ