【エラー解決方法】 JavaのCommons-mathを使った回帰分析でエラーが発生!? を解決する方法

JavaでCommons-mathという分析ライブラリを使い回帰分析を行っていたところ、エラーとなりプログラムが中断してしまいました。
データを確認しましたが、特に問題はなさそうです。

◯分析をしたデータ


サンプル数:10

非説明変数
[8.0, 9.0, 8.0, 7.0, 8.0, 9.0, 8.0, 8.0, 9.0, 6.0]

説明変数
[11.0, 19.7, 36.0, 121.0, 157.0, 0.0, 4.0]
[12.0, 20.0, 36.0, 121.0, 157.0, 0.0, 5.0]
[11.0, 16.0, 36.0, 121.0, 157.0, 0.0, 6.0]
[10.0, 18.0, 36.0, 121.0, 157.0, 1.0, 7.0]
[11.0, 20.3, 36.0, 121.0, 157.0, 1.0, 1.0]
[11.0, 17.2, 36.0, 121.0, 157.0, 0.0, 2.0]
[11.0, 18.6, 36.0, 121.0, 157.0, 0.0, 3.0]
[11.0, 19.4, 36.0, 121.0, 157.0, 0.0, 4.0]
[13.0, 18.8, 36.0, 121.0, 157.0, 0.0, 5.0]
[9.0, 21.1, 36.0, 121.0, 157.0, 0.0, 6.0]

エラー内容

重回帰分析(OLSMultipleLinearRegressionクラス、 estimateRegressionParameters()メソッド)を実行時にエラーとなる。

org.apache.commons.math3.linear.SingularMatrixException: matrix is singular
at org.apache.commons.math3.linear.QRDecomposition$Solver.solve
(QRDecomposition.java:354)
at org.apache.commons.math3.stat.regression.OLSMultipleLinearRegression.
calculateBeta(OLSMultipleLinearRegression.java:257)
at org.apache.commons.math3.stat.regression.AbstractMultipleLinearRegression.
estimateRegressionParameters(AbstractMultipleLinearRegression.java:264)

APIには以下のような説明が書かれています。

Exception to be thrown when a non-singular matrix is expected.
日本語訳:非特異行列が予想される場合、例外がスローされます。

— リファレンスより

エラー発生時の環境

エラー発生時の開発環境は以下のとおりです。

言語
Java1.7.0_51
ライブラリ
Commons-math3-3.6.1.jar

原因

作成された目的変数・説明変数の関係性が非特異行列であった。
→逆行列を持つデータでこのメソッドを使うとエラーとなる。

サンプル数(分析対象の数)に比べてパラメータ(説明変数の数)が多すぎるとなるようです。

Excelで同じ分析をしてみる

エラーとはならず結果が出ました。

WS000002

説明変数3、4、5が値:0となっています。
これが原因でJavaではエラーとなっているようなので、この説明変数を削除して再度実行してみます。

◯再度分析をしたデータ


サンプル数:10

非説明変数
[8.0, 9.0, 8.0, 7.0, 8.0, 9.0, 8.0, 8.0, 9.0, 6.0]

説明変数
[11.0, 19.7, 0.0, 4.0]
[12.0, 20.0, 0.0, 5.0]
[11.0, 16.0, 0.0, 6.0]
[10.0, 18.0, 1.0, 7.0]
[11.0, 20.3, 1.0, 1.0]
[11.0, 17.2, 0.0, 2.0]
[11.0, 18.6, 0.0, 3.0]
[11.0, 19.4, 0.0, 4.0]
[13.0, 18.8, 0.0, 5.0]
[9.0, 21.1, 0.0, 6.0]

エラーとならず実行できました。

切片:3.7734833526402096
X値1:0.6820583241332874
X値2:-0.1362948034666226
X値3:-0.215015834657611
X値4:-0.1525086087490735

Excelで分析した場合と少し値が違っていますね・・・

説明変数を入れなおしてエクセルでも再実行してみました。

math2

同じ値になりました。

解決方法

説明変数が非特異行列であるかのチェックをしてから、分析を行う。
→ライブラリには入っていないようなので、自作するしかないようです。

パラメータの数はよくばらずほどほどにしておきましょう。

まとめ

持っているデータをすべて使ってデータ分析しようとしたのが間違いでした。
初めに実行したデータの説明変数3、4、5は10個のデータの値がすべて一緒になっていました。
これでは意味がないです。

分析をする際には、説明変数の意味も考えながら選択しないとダメですね。
Pythonでも分析をしているので、気をつけてやっていきたいと思います。

記事をシェア
MOST VIEWED ARTICLES