C#による ステップワイズ回帰分析

C#によるサンプルソースコード : 使用関数名:g02ef

Keyword: ステップワイズ, 変数選択, 線形回帰

概要

本サンプルはステップワイズ回帰分析を行うC#によるサンプルプログラムです。 本サンプルは以下に示される13個の観測値とそれぞれ4個の説明変数についてステップワイズ変数選択による回帰分析を行い、フィッティングされた回帰モデルの切片の推定値、選択された説明変数の偏回帰係数の推定値と標準誤差、そして残差の平均平方を出力します。

ステップワイズ回帰の統計量の計算のデータ 

※本サンプルはnAG Library for .NETに含まれる関数 g02ef() のExampleコードです。本サンプル及び関数の詳細情報は g02ef のマニュアルページをご参照ください。
ご相談やお問い合わせはこちらまで

入力データ

(本関数の詳細はg02ef のマニュアルページを参照)

このデータをダウンロード
g02ef Example Program Data
13 4 4.0 2.0 1.0E-6 1        : N,M,FIN,FOUT,TAU,MONLEV
 7.0 26.0  6.0 60.0  78.5
 1.0 29.0 15.0 52.0  74.3
11.0 56.0  8.0 20.0 104.3
11.0 31.0  8.0 47.0  87.6
 7.0 52.0  6.0 33.0  95.9
11.0 55.0  9.0 22.0 109.2
 3.0 71.0 17.0  6.0 102.7
 1.0 31.0 22.0 44.0  72.5
 2.0 54.0 18.0 22.0  93.1
21.0 47.0  4.0 26.0 115.9
 1.0 40.0 23.0 34.0  83.8
11.0 66.0  9.0 12.0 113.3
10.0 68.0  8.0 12.0 109.4    : End of X array of size N by M+1
1 1 1 1                      : Array ISX

  • 1行目はタイトル行で読み飛ばされます。
  • 2行目に観測数(N)、 説明変数の数(M)、 説明変数をモデルに追加する際の基準値(FIN)、 説明変数をモデルから除去する歳の基準値(FOUT)、 説明変数間の共線性を検出する際の許容値(TAU)、 及び変数追加/削除の経過をハンドリングするかどうかを示すパラメータ(MONLEV)を指定しています。
    ※分散比がFINを超えた場合にのみ変数が追加対象となる。
    ※分散比がFOUTを下回った場合ににみ変数が削除対象となる。
  • 3から15行目には左から縦4列目までに説明変数の値を、一番右側の列に観測値を配列(x)に指定しています。
  • 16行目には各説明変数をステップワイズの際に選択対象とするかどうかを示すパラメータ(isx)を指定しています。ここで 1を指定した場合には選択対象とする事を意味し、 -1 を指定した場合には選択対象とはしない事を意味します。 更に 2 を指定した場合には強制的に同変数をモデルに含める事を意味します。

出力結果

(本関数の詳細はg02ef のマニュアルページを参照)

この出力例をダウンロード
g02ef Example Program Results
Starting Stepwise Selection
Forward Selection
Variable    1 Variance ratio =   1.260e+001
Variable    2 Variance ratio =   2.196e+001
Variable    3 Variance ratio =   4.403e+000
Variable    4 Variance ratio =   2.280e+001
Adding variable    4 to model
Backward Selection
Variable    4 Variance ratio =   2.280e+001
Keeping all current variables
Forward Selection
Variable    1 Variance ratio =   1.082e+002
Variable    2 Variance ratio =   1.725e-001
Variable    3 Variance ratio =   4.029e+001
Adding variable    1 to model
Backward Selection
Variable    1 Variance ratio =   1.082e+002
Variable    4 Variance ratio =   1.593e+002
Keeping all current variables
Forward Selection
Variable    2 Variance ratio =   5.026e+000
Variable    3 Variance ratio =   4.236e+000
Adding variable    2 to model
Backward Selection
Variable    1 Variance ratio =   1.540e+002
Variable    2 Variance ratio =   5.026e+000
Variable    4 Variance ratio =   1.863e+000
Dropping variable    4 from model
Forward Selection
Variable    3 Variance ratio =   1.832e+000
Variable    4 Variance ratio =   1.863e+000
Finished Stepwise Selection

  Fitted Model Summary
  Term              Estimate   Standard Error
  Intercept:          5.258e+001            2.294e+000
  Variable:    0    5.258e+001            2.294e+000
  Variable:    1    1.468e+000            1.213e-001

  RMS:    5.790e+000

  • 2〜33行目にステップワイズ変数選択の過程で選択された変数と分散比が出力されています。
  • 37行目にフィッティングされた回帰モデルの切片の推定値と標準誤差が出力されています。
  • 38〜39行目にはステップワイズ変数選択により選択された説明変数1と説明変数2の偏回帰係数の推定値と標準誤差が出力されています。
  • 41行目にフィッティングされた回帰モデルの残差平方平均が出力されています。
  • この他にステップワイズルーチンからはR二乗値、残差平方和の自由度が出力されますので、下記に示すような他の統計量も簡単に算出することができます。
     修正R二乗値 = 1 - 残差平方平均 / ((-(残差平方平均 * 自由度) / (R二乗値 - 1)) / (観察数 - 1)))
     AIC = 観察数 * log(残差平方平均 * 自由度 / 観察数) + 2 * 選択された変数数 + 2)

ソースコード

(本関数の詳細はg02ef のマニュアルページを参照)

※本サンプルソースコードは .NET環境用の科学技術・統計計算ライブラリである「nAG Library for .NET」の関数を呼び出します。
サンプルのコンパイル及び実行方法


このソースコードをダウンロード
//      g02ef Example Program Text
//      C# version, nAG Copyright 2008
using System;
using NagLibrary;
using System.IO;
namespace NagDotNetExamples
{
  public class G02EFE
  {
    static bool defaultdata = true;
    static string datafile = "";
    static void Main(String[] args)
    {
      if (args.Length == 1)
      {
        defaultdata = false;
        datafile = args[0];
      }
      StartExample();
    }
    public static void StartExample()
    {
      try
      {
        G02.G02EF_MONFUN g02efhG02EFF = new G02.G02EF_MONFUN(g02efh);
        DataReader sr = null;
        if (defaultdata)
        {
          sr = new DataReader("exampledata/g02efe.d");
        }
        else
        {
          sr = new DataReader(datafile);
        }
        double fin, fout, rms, rsq, sw, tau; 
        int df, i, j, m, monlev, n;
        int ifail;
        Console.WriteLine("g02ef Example Program Results");
        //      Skip heading in data file
        sr.Reset();
        sr.Reset();
        n = int.Parse(sr.Next());
        m = int.Parse(sr.Next());
        fin = double.Parse(sr.Next());
        fout = double.Parse(sr.Next());
        tau = double.Parse(sr.Next());
        monlev = int.Parse(sr.Next());
        double[] b = new double[m+1];
        double[] c = new double[(m+2)*(m+1)/2];
        double[] se = new double[m+1];
        double[] wmean = new double[m+1];
        double[] wt = new double[1];
        double[,] x = new double[n, m+1];
        int[] isx = new int[m];
        if (n >1 && m >1 )
        {
          sr.Reset();
          for (i = 1; i <= n; i++)
          {
            for (j = 1; j <= m + 1; j++)
            {
              x[i - 1, j - 1] = double.Parse(sr.Next());
            }
          }
          sr.Reset();
          for (j = 1; j <= m; j++)
          {
            isx[j - 1] = int.Parse(sr.Next());
          }
          // 
          //         Compute upper-triangular correlation matrix
          G02.g02bu("M", "U", n, m + 1, x, wt, out sw, wmean, c, out ifail);
          // 
          if (ifail == 0)
          {
            //            Perform stepwise selection of variables
            G02.g02ef(m, n, wmean, c, sw, isx, fin, fout, tau, b, se, out rsq, out rms, out df, monlev,
            g02efhG02EFF, out ifail);
            // 
            if (ifail == 0)
            {
              //               Display summary information for fitted model
              Console.WriteLine(" ");
              Console.WriteLine("  {0}", "Fitted Model Summary");
              Console.WriteLine("  {0}", "Term              Estimate   Standard Error");
              Console.WriteLine("  {0}        {1,12:e3}          {2,12:e3}", "Intercept:", b[0], se[0]);
              for (i = 0; i < m; i++)
              {
                if ((isx[i] == 1) || (isx[i] == 2))
                {
                  Console.WriteLine("  {0}  {1,3}  {2,12:e3}          {3,12:e3}", "Variable:", i, b[i], se[i]);
                }
              }
              Console.WriteLine(" ");
              Console.WriteLine("  {0}  {1,12:e3}", "RMS:", rms);
            }
            else
            {
              Console.WriteLine(" ");
              Console.WriteLine("  {0}{1,5}", " ** g02ef returned with ifail = ", ifail);
            }
          }
          else
          {
            Console.WriteLine(" ");
            Console.WriteLine("  {0}{1,5}", " ** g02bu returned with ifail = ", ifail);
          }
        }
        // 
      }
      catch (Exception e)
      {
        Console.WriteLine(e.Message);
        Console.WriteLine("Exception Raised");
      }
    }
    public static void g02efh(string flag, int var, double val)
    {
      switch(flag)
      {
        case "A":
        Console.WriteLine("{0} {1,4} {2}", "Adding variable", var, "to model");
        break;
        case "B":
        Console.WriteLine("{0}", "Backward Selection");
        break;
        case "C":
        Console.WriteLine("{0} {1,4} {2}", "Variable", var, "aliased");
        break;
        case "D":
        Console.WriteLine("{0} {1,4} {2}", "Dropping variable", var, "from model");
        break;
        case "F":
        Console.WriteLine("{0}", "Forward Selection");
        break;
        case "K":
        Console.WriteLine("{0}", "Keeping all current variables");
        break;
        case "S":
        Console.WriteLine("{0}", "Starting Stepwise Selection");
        break;
        case "V":
        Console.WriteLine("{0} {1,4} {2} {3, 12:e3}", "Variable", var,  "Variance ratio =", val);
        break;
        case "X":
        Console.WriteLine("{0}", "Finished Stepwise Selection");
        break;
      }
    }
  }
}


関連情報
Privacy Policy  /  Trademarks