タグチメソッド

シミュレーション実験(T法編)

  • このエントリーをはてなブックマークに追加
  • LINEで送る

こんにちは!

今回はT法と重回帰分析をシミュレーション実験によって精度比較をしてみたいと思います!

T法については以前ページで手法の詳細については説明しました。そこで、ここでは実際にどのくらいの精度なのかを調べたいと思います。

まず、T法の計算について少しおさらいします。T法は個々の説明変数と目的変数とで逆単回帰を行い、変数毎の逆推定値を比例定数とSN比によって重み付け総合することで目的変数の総合推定値を算出します。総合推定値の式は次のようになりました。

\begin{eqnarray*}
\hat{y}_{i}&=&\frac{1}{\sum_{j=1}^p\hat{\eta}_j}\sum_{j=1}^p{\hat{\eta}_j}\frac{X_{ij}}{\hat{\beta_j}}+\bar{y}\\
\end{eqnarray*}

ここで、
\begin{eqnarray*}
\hat{\alpha}_{h}&=&\frac{\hat{\eta}_h}{\hat{\beta_h}\sum_{j=1}^p\hat{\eta}_j}\\
\end{eqnarray*}

とおくと、
\begin{eqnarray*}
\hat{y}_{i}&=&\sum_{j=1}^p{\hat{\alpha}_j}{X_{ij}}+\bar{y}\\
\end{eqnarray*}

と表記出来ます。
よって、T法の総合推定値も重回帰モデルっぽく書くことが出来るわけです。
そこで、まず重回帰モデルの人工データで比較してみます。
比較手法としては重回帰、Lasso、Rdigeを取り上げます。

ただ比較において注意が必要で、厳密にはT法は学習データを単位空間と信号空間に分けて解析を行います。信号空間は単位空間の平均によって基準化され、モデルは信号空間のデータのみで構築されます。しかし、それでは重回帰やLasso・Ridgeとはモデル構築用のデータ数が異なってしまいます。そこで、今回はT法ではなく拡張手法であるTa法を用います。Ta法は単位空間を設定せずに全ての学習データの平均を用いて基準化する方法です。T法の拡張手法に関して詳しくはこちらで!

実験の設定と手順

・比較手法:重回帰・Lasso回帰・Ridge回帰・Ta法

・評価指標:MSPE(平均二乗予測誤差)

・シミュレーション回数:100回

実験の流れは簡単にこんな感じです。

  1. 人工データを生成
  2. データを解析
  3. 指標を算出して結果を格納
  4. 1~3を100回繰り返す
  5. 結果の平均とばらつきで比較

人工データ生成

今回のデータの生成モデルを次に示します。

\begin{eqnarray*}
y_i&=&1+{\bf x}_i^T{\bf \beta}+\epsilon_i\\
{\bf \beta}&=&(\beta_1,\beta_2,0,\cdots,0)^T\in {\bf R}^p\\
{\bf x_i}&\sim& N({\bf \mu},{\bf \Sigma})\\
{\bf \mu}&=&{\bf 0}_p\\
{\bf \Sigma}&=&{\bf I}_p\\
\epsilon_i&\sim& N(0,1^2)\\
i&=&1,2,\cdots,n\\
\end{eqnarray*}

説明変数は\(p\)次元であり、平均0・独立で発生させています。
また、\(\beta\)は\(p\)次元ベクトルであり、変数1と変数2のみが目的変数へ寄与があります。
今回は、\(p\)を5と100の場合で実験します。

シミュレーション実験

シミュレーション実験をしてみましょう。
サンプルサイズ\(n=n_{train}+n_{test}\)はテストデータのサンプルサイズ\(n_{test}\)は1000として、学習データのサンプルサイズ\(n_{train}\)は変化させます。

今回用いるコード(\(p=5,n_{train}=20\)の場合)を載せておきます。
実行する前に入っていないパッケージはインストールしておいてください。
ちなみにT法(Ta法)についてはMTSYSというパッケージを用いています。MTSYSにはMT法やRT法も入っています。
MTSYSを用いたTa法を実行するやり方の詳細はこちらへ!

ばらつきも含めて見たいので結果を箱ひげ図で表します。
重回帰はglmと表記してあります。

・\(p=5, n_{train}=20\)の結果

やはり説明変数の数も多くないのでどの手法も同程度ですね。

・\(p=5, n_{train}=1000\)の結果
学習データ数をかなり多くした結果です。

傾向は\(n_{train}=20\)のときと変わりません。ここで、推定された係数を見てみましょう。

・重回帰
> as.matrix(result_glm$coefficients)
[,1]
(Intercept) 0.96814597
x1 1.01957322
x2 -0.99977962
x3 0.02176648
x4 0.04343735
x5 -0.00206636

・Lasso
> coefficients(result_lasso,s=”lambda.min”)
6 x 1 sparse Matrix of class “dgCMatrix”
1
(Intercept) 0.96733620
x1 0.99592767
x2 -0.97756963
x3 .
x4 0.02051056
x5 .

・Rdige
> coefficients(result_ridge,s=”lambda.min”)
6 x 1 sparse Matrix of class “dgCMatrix”
1
(Intercept) 0.9675938914
x1 0.9577254944
x2 -0.9391526386
x3 0.0205584744
x4 0.0380564049
x5 -0.0004578514

・Ta
> α_hat <- t(t(((result_Ta$eta_hat)/(result_Ta$beta_hat))/sum(result_Ta$eta_hat))) > α_hat
[,1]
x1 1.512973
x2 -1.497028
x3 0.000000
x4 0.000000
x5 0.000000

重回帰・Lasso・Ridgeの3手法は似たような値になっており、Lassoだけがいくつか自動的に係数が0になっています。一方で、Ta法はいくつか自動的に係数が0になっているが、変数1,2の係数が真値と比べて大きいですね。

よって、標本サイズが大きくなっても重回帰モデルのデータにおいてTa法は重回帰分析やLasso等と同じくらいの精度にはならなそうです。

・\(p=100, n_{train}=10\)の結果
次に小標本高次元で実験してみます。この設定では重回帰は計算不可能なので結果から除外しています。

うーん。LassoよりTa法の方がよさそうではありますが、Ridgeと比べると微妙ですね。
重回帰モデルの人工データでの実験なのでこんなものでしょう。

実データ解析

こんどは実データで実験してみます。
plsパッケージにあるgasolineデータを用います。
gasolineデータはオクタン価(1変数)とガソリンの拡散反射の近赤外線分光データ(401変数)で構成されています。
サンプルサイズは全部で60です。
オクタン価を近赤外線分光データで説明するモデルを構築して精度比較してみましょう。

学習データとしてランダムに30サンプルを抽出、残ったデータをテストデータとします。

  1. 学習データとしてランダムに30サンプルを抽出、残ったデータをテストデータとする。
  2. データを解析
  3. 指標を算出して結果を格納
  4. 1~3を100回繰り返す
  5. 結果の平均とばらつきで比較

実データ解析で用いたプログラムは以下の通りです。

結果は次のようになりました。

Ta法は全然良くないですね(笑)
というのもこのデータは説明変数間の相関が非常に高いデータとなっています。T法(Ta法)は多重共線性が起きていても解析出来る手法ではありますが多重共線性を克服しているわけではありません。人工データでの実験のときは説明変数間は独立であったためそこそこの精度を保てていました。
では、T法(Ta法)は使えない手法なのかというとそうとも言えません。T法は変数毎に逆単回帰を行っているだけなので逆行列の計算が必要なく非常に計算が簡便です。エクセルでも簡単に計算することが出来て、統計手法に慣れていない方でも直観的に解釈しやすい手法だと思います。

ただ、まだ適用場面が限定的であることは否めません。T法はロジスティック回帰やポアソン回帰を用いるような目的変数が二値データやカウントデータへ適用する研究は不十分ですし、説明変数に質的データがあるときも適用が難しいです。

まだまだ、課題があるT法という手法ですが、解析する環境やデータの性質によっては使用すると良いかもしれません。

まとめ

・T法(Ta法)は高次元小標本データにおいてはRidgeやLassoと同じくらいの精度が出そう。
・T法のメリットは計算が簡便で解釈しやすい。
・説明変数間の相関が高いと精度が悪化する恐れがある。
・T法の適用場面はまだまだ限定的で研究の余地あり。

コメントを残す

*

CAPTCHA