C#による 時系列モデルの推定

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

Keyword: 多変量時系列, 多入力モデル, 推定

概要

本サンプルは時系列モデルの推定の計算を行うC#によるサンプルプログラムです。 本サンプルは以下に示される時系列データを分析し、時系列モデルの推定値を出力します。

時系列のデータ 

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

入力データ

(本関数の詳細はg13be のマニュアルページを参照)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

このデータをダウンロード
g13be Example Program Data
    1    1   40    2    3   20    0
    1    0    0    0    0    1    4
    1    0
    0    0
    1    0
    3    0
0.0       0.0       2.0       0.5       0.0
     8.075     105.0
     7.819     119.0
     7.366     119.0
     8.113     109.0
     7.380     117.0
     7.134     135.0
     7.222     126.0
     7.768     112.0
     7.386     116.0
     6.965     122.0
     6.478     115.0
     8.105     115.0
     8.060     122.0
     7.684     138.0
     7.580     135.0
     7.093     125.0
     6.129     115.0
     6.026     108.0
     6.679     100.0
     7.414      96.0
     7.112     107.0
     7.762     115.0
     7.645     123.0
     8.639     122.0
     7.667     128.0
     8.080     136.0
     6.678     140.0
     6.739     122.0
     5.569     102.0
     5.049     103.0
     5.642      89.0
     6.808      77.0
     6.636      89.0
     8.241      94.0
     7.968     104.0
     8.044     108.0
     7.791     119.0
     7.024     126.0
     6.102     119.0
     6.053     103.0 

  • 1行目はタイトル行で読み飛ばされます。
  • 2行目の1番目のパラメータ(kzef)は入力時系列と出力ノイズの値で時系列データの配列xxyを上書きするかどうかを指定しています。"1"は上書きすることを意味します。2番目のパラメータ(kfc)は定数cを初期値で固定するか推定するかを指定しています。"1"は推定することを意味します。3番目のパラメータ(nxxy)は時系列データの数を指定しています。4番目のパラメータ(nser)は入力時系列と出力時系列の合計数を指定しています。5番目のパラメータ(kef)は尤度オプションを指定しています。"3"は周辺尤度を意味します。6番目のパラメータ(nit)は最大反復数を指定しています。7番目のパラメータ(kzsp)は最小化プロシージャでパラメータzspの入力値を使うかデフォルト値を使うかを指定しています。"0"はデフォルト値を使用することを意味します。
  • 3行目はARIMAモデルの次数ベクトル(mr:自己回帰の数、非季節階差の次数、移動平均、季節自己回帰、季節階差の次数、季節移動平均と季節期間)を指定しています。
  • 4~7行目は伝達関数モデルの次数(mt)を指定しています。
  • 8行目は多入力モデルの引数(para)を指定しています。
  • 9~48行目に入力時系列と出力時系列の値(xxy)を指定しています。

出力結果

(本関数の詳細はg13be のマニュアルページを参照)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73

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

  The number of iterations carried out is  11

 Final values of the parameters and their standard deviations

    I            PARA(I)                 SD

     1            0.380924            0.166379
     2           -0.257786            0.178178
     3            8.956084            0.948061
     4            0.659641            0.060239
     5          -75.435521           33.505341

 The correlation matrix is

     1.0000    -0.1839    -0.1775    -0.0340     0.1394
    -0.1839     1.0000     0.0518     0.2547    -0.2860
    -0.1775     0.0518     1.0000    -0.3070    -0.2926
    -0.0340     0.2547    -0.3070     1.0000    -0.8185
     0.1394    -0.2860    -0.2926    -0.8185     1.0000


 The residuals and the z and n values are

    I         RES(I)          z(t)           n(t)

    1           0.397         180.567         -75.567
    2           3.086         191.430         -72.430
    3          -2.818         196.302         -77.302
    4          -9.941         195.460         -86.460
    5          -5.061         201.594         -84.594
    6          14.053         199.076         -64.076
    7           2.624         195.211         -69.211
    8          -5.823         193.450         -81.450
    9          -2.147         197.179         -81.179
   10          -0.216         196.217         -74.217
   11          -2.517         191.812         -76.812
   12           7.916         184.544         -69.544
   13           1.423         194.322         -72.322
   14          11.936         200.369         -62.369
   15           5.117         200.990         -65.990
   16          -5.672         200.468         -75.468
   17          -5.681         195.763         -80.763
   18          -1.637         184.025         -76.025
   19          -1.019         175.360         -75.360
   20          -2.623         175.492         -79.492
   21           3.283         182.162         -75.162
   22           6.896         183.857         -68.857
   23           5.395         190.797         -67.797
   24           0.875         194.327         -72.327
   25          -4.153         205.558         -77.558
   26           6.206         204.261         -68.261
   27           4.208         207.104         -67.104
   28          -2.387         196.423         -74.423
   29         -11.803         189.924         -87.924
   30           6.435         175.158         -72.158
   31           1.342         160.761         -71.761
   32          -4.924         156.575         -79.575
   33           4.799         164.256         -75.256
   34          -0.074         167.783         -73.783
   35          -6.023         184.483         -80.483
   36          -6.427         193.055         -85.055
   37          -2.527         199.390         -80.390
   38           2.039         201.302         -75.302
   39           0.243         195.695         -76.695
   40          -3.166         183.738         -80.738

  The state set consists of   6 values

     6.0530   183.7384    -5.7855    -0.1645     0.1800    -3.0977

  The number of degrees of freedom is  34

  • 3行目には実行した反復数が出力されています。
  • 9~13行目にはパラメータの最終値と標準偏差が出力されています。
  • 17から21行目には相関行列が出力されています。
  • 28~67行目には残差、Z値、ノイズが出力されています。
  • 71行目には状態集合を構成する6つの値が出力されています。
  • 73行目には自由度が出力されています。

ソースコード

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256

このソースコードをダウンロード
//      g13be Example Program Text
//      C# version, nAG Copyright 2008
using System;
using NagLibrary;
namespace NagDotNetExamples
{
  public class G13BEE
  {
    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/g13bee.d");
        }
        else
        {
          sr = new DataReader(datafile);
        }
        double d,   s; int dp,  i,   inc,  itc,   j,   kef,   kfc,   kpriv,   kzef,   kzsp,
        mx,  ncd,  nce,  ncf,  ndf,   ndv,   nit,   npara,   ncg,  nser,   nsttf,    
        nxxy, qp, qx, smx ;
        double[] zsp = new double[4];
        int[] mr = new int[7];
        int ifail;
        Console.WriteLine("g13be Example Program Results");
        //      Skip heading in data file
        sr.Reset();
        sr.Reset();
        kzef = int.Parse(sr.Next());
        kfc = int.Parse(sr.Next());
        nxxy = int.Parse(sr.Next());
        nser = int.Parse(sr.Next());
        kef = int.Parse(sr.Next());
        nit = int.Parse(sr.Next());
        kzsp = int.Parse(sr.Next());
        int[,] mt = new int[4, nser];
        if (nxxy > 0 && nser > 0)
        {
          if (kzsp != 0)
          {
            sr.Reset();
            for (int zsplen = 0; zsplen < zsp.Length; zsplen++)
            {
              zsp[zsplen] = Double.Parse(sr.Next());
            }
          }
          sr.Reset();
          for (i = 1; i <= 7; i++)
          {
            mr[i - 1] = int.Parse(sr.Next());
          }
          for (i = 1; i <= 4; i++)
          {
            sr.Reset();
            for (j = 1; j <= nser; j++)
            {
              mt[i - 1, j - 1] = int.Parse(sr.Next());
            }
          }
          npara = 0;
          ncg = 0;
          qx = 0;
          smx = 0;
          ncf = nser;
          inc = 1;
          for ( i = 1; i<= nser-1; i++)
          {
            npara = npara + mt[2-1,i-1] + mt[3-1,i-1];
            if (mt[4-1,i-1]>1)  
            {
              ncg = ncg +  mt[0,i-1]+ mt[1,i-1]+ mt[2,i-1];
              if (mt[4-1,i-1]==3) 
              {
                mx = Math.Max(mt[1-1,i-1]+mt[2-1,i-1],mt[3-1,i-1]);
                qx = Math.Max(qx,mx);
                smx = smx + mx;
              }
            }
            else if (mt[4-1,i-1]==1 && kef==3) 
            {
              if (mt[3-1,i-1]>0) 
              {
                ncf = ncf + 1;
              }
              inc = inc + 1;
            }
          }
          npara = npara + mr[0] + mr[2] + mr[3] + mr[5] + nser;
          //      Calculate size of arrays
          int isttf = mr[4-1]*mr[7-1] + mr[2-1] + mr[5-1]*mr[7-1] + mr[3-1] + 
          Math.Max(mr[1-1],mr[6-1]*mr[7-1]) + ncg;
          qp = mr[3-1] + mr[6-1]*mr[7-1];
          dp = mr[2-1] + mr[5-1]*mr[7-1];
          if (mr[3-1]>0 && kef>1) 
          {
            inc = inc + 1;
          }
          if (kfc>0 && kef==3) 
          {
            inc = inc + 1;
          }
          qx = qp;
          ncd = npara + kfc + smx;
          if (mr[1-1]>0) 
          {
            ncf = ncf + inc;
          }
          if (mr[3-1]>0) 
          {
            ncf = ncf + inc;
          }
          if (mr[4-1]>0) 
          {
            ncf = ncf + inc;
          }
          if (mr[6-1]>0) 
          {
            ncf = ncf + inc;
          }
          if (qx>0) 
          {
            ncf = ncf + 1;
          }
          if (kfc>0) 
          {
            ncf = ncf + 1;
          }
          ncd = ncd + qx;
          nce = nxxy + dp + 6*qx;
          double[,] cm = new double[npara, npara];
          double[] para = new double[npara];
          double[] res = new double[nxxy];
          double[] sd = new double[npara];
          double[] sttf = new double[isttf];
          double[,] xxy = new double[nxxy, nser];
          if (npara > 0)
          {
            sr.Reset();
            for (i = 1; i <= npara; i++)
            {
              para[i - 1] = double.Parse(sr.Next());
            }
            for (i = 1; i <= nxxy; i++)
            {
              sr.Reset();
              for (j = 1; j <= nser; j++)
              {
                xxy[i - 1, j - 1] = double.Parse(sr.Next());
              }
            }
            // Set kpriv to 1 to obtain monitoring information *
            kpriv = 0;
            //
            G13.g13be(mr, nser, mt, para, npara, kfc, nxxy, xxy, kef, nit, kzsp, zsp, out itc, sd, cm,
            out s, out d, out ndf, kzef, res, sttf, out nsttf, kpriv, out ifail);
            //
            if (ifail != 0)
            {
              Console.WriteLine("");
              Console.WriteLine("  {0}{1,4}", "g13be fails. ifail =", ifail);
            }
            if ((((ifail == 0) || (ifail == 8)) || (ifail == 9)) || (ifail == 11))
            {
              Console.WriteLine("");
              Console.WriteLine("  {0}{1,4}", "The number of iterations carried out is", itc);
              Console.WriteLine("");
              Console.WriteLine(" {0}", "Final values of the parameters and their standard deviations");
              Console.WriteLine("");
              Console.WriteLine(" {0}", "   I            PARA(I)                 SD");
              Console.WriteLine("");
              for (i = 1; i <= npara; i++)
              {
                Console.WriteLine("  {0,4}{1,20:f6}{2,20:f6}", i, para[i - 1], sd[i - 1]);
              }
              Console.WriteLine("");
              Console.WriteLine(" {0}", "The correlation matrix is");
              Console.WriteLine("");
              for (i = 1; i <= npara; i++)
              {
                for (j = 1; j <= npara; j++)
                {
                  Console.Write(" {0, 10:f4}", cm[i - 1, j - 1]);
                }
                Console.WriteLine(""); ;
              }
              Console.WriteLine(""); ;
              Console.WriteLine("");
              Console.WriteLine(" {0}", "The residuals and the z and n values are");
              Console.WriteLine("");
              Console.WriteLine(" {0}", "   I         RES(I)          z(t)           n(t)");
              Console.WriteLine("");
              ndv = nxxy - mr[1] - mr[4] * mr[6];
              for (i = 1; i <= nxxy; i++)
              {
                if (i <= ndv)
                {
                  Console.Write(" {0,4}", i);
                  Console.Write(" {0, 15:f3}", res[i - 1]);
                  for (j = 1; j <= nser; j++)
                  {
                    Console.Write(" {0, 15:f3}", xxy[i - 1, j - 1]);
                  }
                  Console.WriteLine(""); ;
                }
                else
                {
                  Console.WriteLine(" {0, 4}", i);
                  for (j = 1; j <= nser; j++)
                  {
                    Console.Write(" {0, 15:f3}", xxy[i - 1, j - 1]);
                  }
                  Console.WriteLine(""); ;
                }
              }
              if ((mr[1] != 0) || (mr[4] != 0))
              {
                Console.WriteLine("");
                Console.WriteLine(" {0}", "** Note that the residuals relate to differenced values **");
              }
              Console.WriteLine("");
              Console.WriteLine("  {0}{1,4}{2}", "The state set consists of", nsttf, " values");
              Console.WriteLine("");
              for (i = 1; i <= nsttf; i++)
              {
                Console.Write(" {0, 10:f4}", sttf[i - 1] );
              }
              Console.WriteLine(""); ;
              Console.WriteLine("");
              Console.WriteLine("  {0}{1,4}", "The number of degrees of freedom is", ndf);
            }
          }
        }
        //
      }
      catch (Exception e)
      {
        Console.WriteLine(e.Message);
        Console.WriteLine("Exception Raised");
      }
    }
  }
}


関連情報
© 日本ニューメリカルアルゴリズムズグループ株式会社 2024
Privacy Policy  /  Trademarks