関連情報

C#による 一般化線形モデルを用いた予測

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

Keyword: 一般化線形モデル, 予測

概要

本サンプルはフィッティングされた一般化線形モデルを用いた予測を行うC#によるサンプルプログラムです。 本サンプルは以下に示されるデータについて予測を行います。

一般化線形モデルの予測のデータ 

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

入力データ

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

このデータをダウンロード
g02gp Example Program Data
Training Data
'R' 'M' 'N' 'U' 5 1  0.0 0  : LINK,MEAN,OFFSET,WEIGHT,N,M,S,IPRINT
1.0 25.0                    
2.0 10.0
3.0  6.0
4.0  4.0
5.0  3.0                   : End of X, Y
1                          : ISX
Prediction Data
2  TRUE 'N' 'U'           : N,VFOBS,OFFSET,WEIGHT
32.0                       
18.0                       : End of X

  • 1行目はタイトル行で読み飛ばされます。
  • 2〜8行目はトレーニングデータを指定しています。
  • 3行目の1番目のパラメータ(link)はどのリンク関数が使用されるかを指定しています。 "R"は相互リンク(reciprocal link)が使用されることを意味します。2番目のパラメータ(mean)は一般化線形モデルの引数に切片が含まれるかどうかを指定しています。 "M" は切片を含めることを意味します。3番目のパラメータ(offset)はオフセットが必要かどうかを指定しています。"N" はオフセットを必要としないことを意味します。4番目のパラメータ(weight)は重みづけをするかどうかを指定しています。 "U" は重みづけをしないことを意味します。5番目のパラメータは観測値の数(n)を指定しています。6番めのパラメータは独立変数の数(m)を指定しています。7番目のパラメータ(s)はモデルのスケール引数を指定しています。8番目のパラメータは反復についての情報が必要かどうか、また必要な場合の出力する割合(iprint)を指定しています。 "0"は何も出力しないことを意味します。
  • 4〜8行目に独立変数の観測値(x)と従属変数の観測値(y)を指定しています。
  • 9行目はモデルに独立変数が含まれるかどうかを示すパラメータ(isx)を指定しています。"1"は含まれることを意味します。
  • 10〜13行目は予測データを指定しています。
  • 11行目の1番目のパラメータ(n)は観測値の数を指定しています。2番目のパラメータ(vfobs)は予測変数の標準誤差に将来の観測値の分散が含まれるかどうか指定しています。"TRUE"は含まれることを意味します。3番目のパラメータ(offset)は観測値のオフセットが必要かどうかを指定しています。 "N" はオフセットを必要としないことを意味します。4番目のパラメータ(weight)は重みづけをするかどうかを指定しています。 "U" は重みづけをしないことを意味します。
  • 12〜13行目は観測値(x)を指定しています。

出力結果

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

この出力例をダウンロード
g02gp Example Program Results

  Residual sum of squares =  3.8717e-001 Degrees of freedom =  3

       Estimate     Standard error 
         -0.0239        0.0028
          0.0638        0.0026

   I      ETA         SE(ETA)      Predicted    SE(Predicted) 
    1)   2.01807           0.08168           0.49552           0.35981        
    2)   1.12472           0.04476           0.88911           0.36098        

  • 3行目に残差平方和と自由度が出力されています。
  • 5〜8行目に一般化線形モデルの引数の推定値と標準誤差が出力されています。
  • 9〜11行目に線形予測子、線形予測子の標準誤差、予測値、予測値の標準誤差が出力されています。

ソースコード

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

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


このソースコードをダウンロード
//      g02gp Example Program Text
//      C# version, NAG Copyright 2008
using System;
using NagLibrary;
using System.IO;
namespace NagDotNetExamples
{
  public class G02GPE
  {
    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
      {
        DataReader sr = null;
        if (defaultdata)
        {
          sr = new DataReader("exampledata/g02gpe.d");
        }
        else
        {
          sr = new DataReader(datafile);
        }
        double a,   eps,   rss,   s,   tol; int i,  idf,  ip,  iprint,  irank,  j,  m,  maxit,  n;
        bool vfobs = false;
        string error = "",
        link = "",
        mean = "",
        offset = "",
        weight = "";
        int ifail;
        Console.WriteLine("g02gp Example Program Results");
        // 
        //      Skip headings in data file
        a = 0.0;
        sr.Reset();
        sr.Reset();
        //      Read in training data for model that will be used for prediction
        sr.Reset();
        link = sr.Next();
        mean = sr.Next();
        offset = sr.Next();
        weight = sr.Next();
        n = int.Parse(sr.Next());
        m = int.Parse(sr.Next());
        s = double.Parse(sr.Next());
        iprint = int.Parse(sr.Next());
        double[] eta = new double[n];
        double[] fwt = new double[n];
        double[] off = new double[n];
        double[] pred = new double[n];
        double[] seeta = new double[n];
        double[] sepred = new double[n];
        double[] t = new double[1];
        double[] wt = new double[n];
        double[,] x = new double[n, m];
        double[] y = new double[n];
        int[] isx = new int[m];
        if (n < 2 || m < 1)
        {
          Console.Write("   ** Problem size is too small.");
          goto L200;
        }
        if ((weight == "W") || (weight == "w"))
        {
          for (i = 1; i <= n; i++)
          {
            sr.Reset();
            for (j = 1; j <= m; j++)
            {
              x[i - 1, j - 1] = double.Parse(sr.Next());
            }
            y[i - 1] = double.Parse(sr.Next());
            fwt[i - 1] = double.Parse(sr.Next());
          }
        }
        else
        {
          for (i = 1; i <= n; i++)
          {
            sr.Reset();
            for (j = 1; j <= m; j++)
            {
              x[i - 1, j - 1] = double.Parse(sr.Next());
            }
            y[i - 1] = double.Parse(sr.Next());
          }
        }
        sr.Reset();
        for (j = 1; j <= m; j++)
        {
          isx[j - 1] = int.Parse(sr.Next());
        }
        //      Calculate ip
        ip = 0;
        for (j = 1; j <= m; j++)
        {
          if (isx[j - 1] > 0)
          {
            ip = ip + 1;
          }
        }
        if ((mean == "M") || (mean == "m"))
        {
          ip = ip + 1;
        }
        double[] b = new double[ip];
        double[] cov = new double[(ip*ip+ip)/2];
        double[,] v = new double[n, 7 + ip];
        double[] se = new double[ip];
        if ((link == "E") || (link == "e"))
        {
          sr.Reset();
          a = double.Parse(sr.Next());
        }
        //      Set control parameters
        eps = 0.0000010e0;
        tol = 0.000050e0;
        maxit = 10;
        //      Call method to fit model to training data
        G02.g02ga(link, mean, offset, weight, n, x, m, isx, ip, y, fwt, ref s, a, out rss, out idf, b,
        out irank, se, cov, v, tol, maxit, iprint, eps, out ifail);
        if (ifail != 0)
        {
          Console.WriteLine("** g02ga failed with ifail = {0,5}", ifail);
          if (ifail < 6)
          {
            goto L200;
          }
        }
        //      Display parameter estimates for training data
        Console.WriteLine(" ");
        Console.WriteLine("  Residual sum of squares = {0,12:e4} Degrees of freedom = {1,2}", rss, idf);
        Console.WriteLine(" ");
        Console.Write(" {0}", "      Estimate     Standard error");
        Console.WriteLine(" ");
        for (i = 1; i <= ip; i++)
        {
          Console.WriteLine("  {0,14:f4}{1,14:f4}", b[i - 1], se[i - 1]);
        }
        // 
        //      Skip second lot of headings in data file
        sr.Reset();
        //      Read in data to predict from and check array sizes
        sr.Reset();
        n = int.Parse(sr.Next());
        vfobs = bool.Parse(sr.Next());
        offset = sr.Next();
        weight = sr.Next();
        if (n < 1)
        {
          Console.Write(" {0}", "n < 1");
          goto L200;
        }
        if ((offset == "Y") && (weight == "W"))
        {
          for (i = 1; i <= n; i++)
          {
            sr.Reset();
            for (j = 1; j <= m; j++)
            {
              x[i - 1, j - 1] = double.Parse(sr.Next());
            }
            off[i - 1] = double.Parse(sr.Next());
            wt[i - 1] = double.Parse(sr.Next());
          }
        }
        else if (offset == "Y")
        {
          for (i = 1; i <= n; i++)
          {
            sr.Reset();
            for (j = 1; j <= m; j++)
            {
              x[i - 1, j - 1] = double.Parse(sr.Next());
            }
            off[i - 1] = double.Parse(sr.Next());
          }
        }
        else if (weight == "W")
        {
          for (i = 1; i <= n; i++)
          {
            sr.Reset();
            for (j = 1; j <= m; j++)
            {
              x[i - 1, j - 1] = double.Parse(sr.Next());
            }
            wt[i - 1] = double.Parse(sr.Next());
          }
        }
        else
        {
          for (i = 1; i <= n; i++)
          {
            sr.Reset();
            for (j = 1; j <= m; j++)
            {
              x[i - 1, j - 1] = double.Parse(sr.Next());
            }
          }
        }
        //      Using g02ga to fit training model, so error structure is normal
        error = "N";
        //      Call prediction method
        G02.g02gp(error, link, mean, offset, weight, n, x, m, isx, ip, t, off, wt, s, a, b, cov, vfobs,
        eta, seeta, pred, sepred, out ifail);
        // errfn, link, mean, offset, weight, n, x, m, isx, ip, t, off, wt, s, a, b, cov, vfobs, eta, seeta, pred, sepred, out ifail)
        if (ifail != 0)
        {
          Console.WriteLine("** g02gp failed with ifail = {0,5}", ifail);
          if (ifail != 22)
          {
            goto L200;
          }
        }
        //      Display predicted values
        Console.WriteLine(" ");
        Console.Write(" {0} {1}", "  I      ETA         SE(ETA)      Predicted  ",
        " SE(Predicted)");
        Console.WriteLine(" ");
        for (i = 1; i <= n; i++)
        {
          Console.WriteLine("  {0,3}){1,10:f5}        {2,10:f5}        {3,10:f5}        {4,10:f5}        ", i, eta[i - 1], seeta[i - 1], pred[i - 1], sepred[i - 1]);
        }
        // 
        L200: ;
        // 
      }
      catch (Exception e)
      {
        Console.WriteLine(e.Message);
        Console.Write( "Exception Raised");
      }
    }
  }
}


Results matter. Trust NAG.

Privacy Policy | Trademarks