はじめに
前回、C#で数値計算用ライブラリMath.NET Numerics1を利用し、単純線形回帰を試しました。今回は重回帰を試してみます。
参考文献
今回も以下の書籍を参考文献としました。
コード実装
説明変数及び目的変数準備
データは「18世帯における親子の身長」を利用します。説明変数は親の身長とし、父親の身長を x0、母親の身長を x1 と定義します。息子の身長を目的変数 y と定義します。
単純線形回帰に利用した身長の単位はインチでしたが、今回の身長の単位は cm です。
double[] x0 = new double[]
{
170, 172, 170, 172, 170,
180, 173, 163, 165, 167,
165, 163, 167, 170, 165,
163, 166,167,
};
double[] x1 = new double[]
{
160, 160, 160, 161, 155,
160, 160, 150, 155, 162,
155, 159, 153, 150, 160,
158, 158, 157,
};
double[] y = new double[]
{
180, 179, 175, 174, 173,
173, 173, 171, 170, 170,
170, 168, 167, 167, 165,
164, 162, 162,
};
回帰係数取得
MathNet.Numerics.LinearRegression
のMultipleRegression.QR
メソッドを使います。今回は引数としてジャグ配列を利用します。そのため、説明変数のジャグ配列を先に作成します。
double[][] x = new double[x0.Count()][];
for (int i = 0; i < x.GetLength(0); i++)
{
x[i] = new double[]{ x0[i], x1[i] };
}
作成したジャグ配列(説明変数) x と目的変数 yをMultipleRegression.QR
メソッドへ渡します。このとき、interceptも取得したいため、第3引数にtrueを設定しました。
var result = MultipleRegression.QR(x, y, true);
Console.WriteLine("intercept: " + result[0]);
Console.WriteLine("slope0: " + result[1]);
Console.WriteLine("slope1: " + result[2]);
intercept: 43.5829144993441
slope0: 0.597200754589679
slope1: 0.165966697534154
書籍内では、interceptをb0、slope0をb1、slope1をb2と記載されています。別の書籍では、K0, K1, K2と記載してあるものもあります。どの表記が一番適切なのかよくわかりませんが、ひとまず重回帰分析さえできればよいため横へ置いておきます。
推定値算出
取得した係数から以下の回帰式が得られます。
息子の身長 = 43.58 + 0.597 * (父親の身長) + 0.166 * (母親の身長)
では、今回利用したデータセットの1番目のデータを利用して推定値を算出してみます。父親の身長は170cm、母親の身長は160cmを代入します。書籍の内容に合わせて、小数点は丸めておきます。
double fatherHeight = 170;
double motherHeight = 160;
double sonHeight = Math.Round(result[0], 2)
+ Math.Round(result[1], 3) * fatherHeight
+ Math.Round(result[2], 3) * motherHeight;
Console.WriteLine("sonHeight: " + sonHeight);
sonHeight: 171.63
おまけ
上記のデータを利用して、重相関係数を求めてみます。Correlation.Pearson
メソッドを使いました。
double[] predictedValues = new double[x0.Count()];
for (int i = 0; i < predictedValues.Length; i++)
{
predictedValues[i] = Math.Round(result[0], 2)
+ Math.Round(result[1], 3) * x0[i]
+ Math.Round(result[2], 3) * x1[i];
}
var multipleCorrelationCoefficient = Correlation.Pearson(predictedValues, y);
Console.WriteLine("Multiple Correlation Coefficient: " + multipleCorrelationCoefficient);
Multiple Correlation Coefficient: 0.551880210098969
-
Math.NET Numericsのバージョンは 5.0.0 を利用。 ↩