LoginSignup
0
0

More than 1 year has passed since last update.

【C#】Math.NET Numericsで重回帰分析(MLR:Multiple Linear Regression)

Posted at

はじめに

前回、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.LinearRegressionMultipleRegression.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 と目的変数 yMultipleRegression.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]);
output
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);
output
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);
output
Multiple Correlation Coefficient: 0.551880210098969
  1. Math.NET Numericsのバージョンは 5.0.0 を利用。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0