Keyword: VARMA, 多変量, 時系列, 実現値
概要
本サンプルはVARMAモデルの多変量時系列の実現値の生成を行うC#によるサンプルプログラムです。 本サンプルは以下の式で示されるVARMAモデルに対して1つの実現値が48個の観測値をもつ2変量時系列の2つの実現値を生成し出力します。
※本サンプルはnAG Library for .NETに含まれる関数 g05pj() のExampleコードです。本サンプル及び関数の詳細情報は g05pj のマニュアルページをご参照ください。
ご相談やお問い合わせはこちらまで
入力データ
(本関数の詳細はg05pj のマニュアルページを参照)| このデータをダウンロード |
g05pj Example Program Data 2 1 0 48 : K, IP, IQ, N 0.80 0.07 0.00 0.58 : End of PHI(,,1) 5.00 9.00 : XMEAN 2.97 0.64 5.38 : End of matrix VAR
- 1行目はタイトル行で読み飛ばされます。
- 2行目に多変量時系列の次数(k)、自己回帰パラメータの数(ip)、移動平均パラメータ行列の数(iq)、生成される観測値の数(n)を指定しています。
- 3〜4行目にモデルの自己回帰パラメータ行列(phi)を指定しています。
- 5行目に多変量時系列の平均ベクトル(xmean)を指定しています。
- 6〜7行目に共分散行列の要素(var)を指定しています。
出力結果
(本関数の詳細はg05pj のマニュアルページを参照)| この出力例をダウンロード |
g05pj Example Program Results
Realisation Number 1
Series number 1
-------------
4.833 2.813 3.224 3.825 1.023 1.415 2.184 3.005
5.547 4.832 4.705 5.484 9.407 10.335 8.495 7.478
6.373 6.692 6.698 6.976 6.200 4.458 2.520 3.517
3.054 5.439 5.699 7.136 5.750 8.497 9.563 11.604
9.020 10.063 7.976 5.927 4.992 4.222 3.982 7.107
3.554 7.045 7.025 4.106 5.106 5.954 8.026 7.212
Series number 2
-------------
8.458 9.140 10.866 10.975 9.245 5.054 5.023 12.486
10.534 10.590 11.376 8.793 14.445 13.237 11.030 8.405
7.187 8.291 5.920 9.390 10.055 6.222 7.751 10.604
12.441 10.664 10.960 8.022 10.073 12.870 12.665 14.064
11.867 12.894 10.546 12.754 8.594 9.042 12.029 12.557
9.746 5.487 5.500 8.629 9.723 8.632 6.383 12.484
Realisation Number 2
Series number 1
-------------
5.396 4.811 2.685 5.824 2.449 3.563 5.663 6.209
3.130 4.308 4.333 4.903 1.770 1.278 1.340 -0.527
1.745 3.211 4.478 5.170 5.365 4.852 6.080 6.464
2.765 2.148 6.641 7.224 10.316 7.102 5.604 3.934
4.839 3.698 5.210 5.384 7.652 7.315 7.332 7.561
7.537 7.788 6.868 7.575 6.108 6.188 8.132 10.310
Series number 2
-------------
11.345 10.070 13.654 12.409 11.329 13.054 12.465 9.867
10.263 13.394 10.553 10.331 7.814 8.747 10.025 11.167
10.626 9.366 9.607 9.662 10.492 10.766 11.512 10.813
10.799 8.780 9.221 14.245 11.575 10.620 8.282 5.447
9.935 9.386 11.627 10.066 11.394 7.951 7.907 12.616
15.246 9.962 13.216 11.350 11.227 6.021 6.968 12.428
- 9〜14行目に生成された1つ目の実現値の時系列1が出力されています。
- 20〜25行目に生成された1つ目の実現値の時系列2が出力されています。
- 33〜38行目に生成された2つ目の実現値の時系列1が出力されています。
- 44〜49行目に生成された2つ目の実現値の時系列2が出力されています。
ソースコード
(本関数の詳細はg05pj のマニュアルページを参照)
※本サンプルソースコードは .NET環境用の科学技術・統計計算ライブラリである「nAG Library for .NET」の関数を呼び出します。
サンプルのコンパイル及び実行方法
| このソースコードをダウンロード |
// g05pj Example Program Text
// C# version, nAG Copyright 2008
using System;
using NagLibrary;
using System.IO;
namespace NagDotNetExamples
{
public class G05PJE
{
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;
if (defaultdata == true)
{
sr = new DataReader("exampledata/g05pje.d");
}
else
{
sr = new DataReader(datafile);
}
const int mseed=1;
int genid, i, ii, ip, iq, j, k, l, n, subid; int ifail;
Console.WriteLine("g05pj Example Program Results");
Console.WriteLine("");
// Read data from a file
// Skip heading
sr.Reset();
// Read in initial parameters
sr.Reset();
k = int.Parse(sr.Next());
ip = int.Parse(sr.Next());
iq = int.Parse(sr.Next());
n = int.Parse(sr.Next());
int rn = Math.Max(ip, iq); l = k*(k+1)/2;
int k2 = k*k;
if (ip>0)
{
l = l + (ip-1)*k2;
}
double[] phi = new double[ip*k*k];
int lr;
if (k>=6)
{
lr = (5*rn*rn+1)*k2 + (4*rn+3) + 4;
}
else
{
lr = ((ip+iq)*(ip+iq)+1)*k2 + (4*(ip+iq)+3)*k +
Math.Max(k*rn*(k*rn+2),k2*(ip+iq)*(ip+iq)+l*(l+3)+k2*(iq+1)) + 4;
}
double[] theta = new double[iq*k*k];
double[,] var = new double[k, k];
double[,] x = new double[k, n];
double[] xmean = new double[k];
int[] seed = new int[mseed];
double[] r = new double[lr];
// Check the specified array limits
if (k <= 0 || ip < 0 || iq < 0 || n <= 0)
{
Console.WriteLine(" ** Problem size is too small.");
goto L160;
}
// Read in the AR parameters
for (l = 1 ; l <= ip ; l++)
{
for (i = 1 ; i <= k ; i++)
{
ii = (l - 1) * k * k + i;
sr.Reset();
for (j = 1 ; j <= k ; j++)
{
phi[ii + k * (j - 1) - 1] = double.Parse(sr.Next());
}
}
}
// Read in the MA parameters
for (l = 1 ; l <= iq ; l++)
{
for (i = 1 ; i <= k ; i++)
{
ii = (l - 1) * k * k + i;
sr.Reset();
for (j = 1 ; j <= k ; j++)
{
theta[ii + k * (j - 1) - 1] = double.Parse(sr.Next());
}
}
}
// Read in the means
sr.Reset();
for (i = 1 ; i <= k ; i++)
{
xmean[i - 1] = double.Parse(sr.Next());
}
// Read in the variance / covariance matrix
for (i = 1 ; i <= k ; i++)
{
sr.Reset();
for (j = 1 ; j <= i ; j++)
{
var[i - 1 , j - 1] = double.Parse(sr.Next());
}
}
// Initialise the seed
seed[0] = 1762543;
// genid and subid identify the base generator
genid = 1;
subid = 1;
// Initialise the generator to a repeatable sequence
G05.G05State g05State = new G05.G05State(genid, subid, seed, out ifail);
if (ifail != 0)
{
Console.WriteLine("** Generator initialisation failed with ifail = {0,5}", ifail);
goto L160;
}
// Generate the first realisation
// Use mode = 2 to set up R and generate values
G05.g05pj(2, n, k, xmean, ip, phi, iq, theta, var, r, g05State, x, out ifail);
if (ifail != 0)
{
Console.WriteLine("** g05pj failed with ifail = {0,5}", ifail);
goto L160;
}
// Display the results
Console.WriteLine("");
Console.WriteLine(" {0:0.000}"," Realisation Number 1");
for (i = 1 ; i <= k ; i++)
{
Console.WriteLine("\n {0}{1,3}"," Series number ",i);
Console.WriteLine(" {0}"," -------------");
Console.WriteLine("");
for (j = 1 ; j <= n ; j++)
{
Console.Write(" {0,8:f3}{1}", x[i - 1 , j - 1],j%8==0||j==n?"\n":"");
}
Console.WriteLine("");
}
// Generate a second realisation
// Use mode = 3 to reset the series and generate values
G05.g05pj(3, n, k, xmean, ip, phi, iq, theta, var, r, g05State, x, out ifail);
if (ifail != 0)
{
Console.WriteLine("** g05pj failed with ifail = {0,5}", ifail);
goto L160;
}
// Display the results
Console.WriteLine("");
Console.WriteLine(" {0}"," Realisation Number 2");
for (i = 1 ; i <= k ; i++)
{
Console.WriteLine("\n {0}{1,3}"," Series number ",i);
Console.WriteLine(" {0}"," -------------");
Console.WriteLine("");
for (j = 1 ; j <= n ; j++)
{
Console.Write(" {0,8:f3}{1}", x[i - 1 , j - 1],j%8==0||j==n?"\n":"");
}
Console.WriteLine("");
}
//
L160: ;
//
}
catch (Exception e)
{
Console.WriteLine(e.Message);
Console.WriteLine( "Exception Raised");
}
}
}
}
