はじめに
単純線形回帰をサクッと実装したいときが稀にありますよね。最近はPLS回帰の話をよく耳にしますが、帰属を明確にして分析したいなどの意から単純線形回帰を利用したいとの要望は根強いようです。今回、C#で数値計算用ライブラリMath.NET Numerics1を利用し単純線形回帰を試してみます。
単純線形回帰とは
引用先として適切かどうか別として、Wikipediaでは以下のように説明されています。
線形回帰(せんけいかいき、英: linear regression)とは、説明変数(独立変数ともいう)に対して目的変数(従属変数、あるいは反応変数ともいう)が線形またはそれから近い値で表される状態。
線形回帰は統計学における回帰分析の一種であり、非線形回帰と対比される。 また線形回帰のうち、説明変数が1つの場合を単純線形回帰、2つ以上の場合を重回帰と呼ばれる。
コード実装
説明変数及び目的変数準備
近代統計学の父フランシス・ゴルトンが発表した、親と成人した子供の身長についてのデータを利用します。以下の書籍を参考文献として挙げておきます。
親の身長を説明変数 x、子供の身長の平均値を目的変数 y と定義します。
身長の単位はインチです。
double[] x = new double[]
{
63.5, 64.5, 65.5, 66.5, 67.5,
68.5, 69.5, 70.5, 71.5, 72.5,
};
double[] y = new double[]
{
65.3, 65.4, 66.7, 67.1, 67.6,
68.0, 68.7, 69.6, 70.1, 72.1,
};
回帰係数取得
MathNet.Numerics.LinearRegression
のSimpleRegression.Fit
メソッドを使います。
(double intercept, double slope) = SimpleRegression.Fit(x, y);
Console.WriteLine("intercept: " + intercept);
Console.WriteLine("slope: " + slope);
intercept: 21.1606060606061
slope: 0.689696969696969
書籍記載の結果は、intercept=21.16, slope=0.690でした。
得られた結果は概ね一致していることが確認できました。
推定値算出
係数が得られたため、以下の回帰直線の式にあてはめます。
y = intercept + slope * x
試しに、親の身長が70インチのときの場合について、xに70を代入して推定値を出してみます。
double value = 70;
double result = intercept + slope * value;
Console.WriteLine("result: " + result);
result: 69.4393939393939
もし、書籍記載の結果と一致させたい場合は、Math.Round
メソッドで小数点以下を適切な桁数で丸めてください。
-
Math.NET Numericsのバージョンは 5.0.0 を利用。 ↩