# NAG Library Function Documentnag_rand_varma (g05pjc)

## 1  Purpose

nag_rand_varma (g05pjc) generates a realization of a multivariate time series from a vector autoregressive moving average (VARMA) model. The realization may be continued or a new realization generated at subsequent calls to nag_rand_varma (g05pjc).

## 2  Specification

#include <nag.h>
#include <nagg05.h>

void  nag_rand_varma (Nag_OrderType order, Nag_ModeRNG mode, Integer n, Integer k, const double xmean[], Integer p, const double phi[], Integer q, const double theta[], const double var[], Integer pdv, double r[], Integer lr, Integer state[], double x[], Integer pdx,  NagError *fail)

## 3  Description

Let the vector ${X}_{t}={\left({x}_{1t},{x}_{2t},\dots ,{x}_{kt}\right)}^{\mathrm{T}}$, denote a $k$-dimensional time series which is assumed to follow a vector autoregressive moving average (VARMA) model of the form:

$Xt-μ= ϕ1Xt-1-μ+ϕ2Xt-2-μ+⋯+ϕpXt-p-μ+ εt-θ1εt-1-θ2εt-2-⋯-θqεt-q$  (1)
where ${\epsilon }_{t}={\left({\epsilon }_{1t},{\epsilon }_{2t},\dots ,{\epsilon }_{kt}\right)}^{\mathrm{T}}$, is a vector of $k$ residual series assumed to be Normally distributed with zero mean and covariance matrix $\Sigma $. The components of ${\epsilon }_{t}$ are assumed to be uncorrelated at non-simultaneous lags. The ${\varphi }_{i}$'s and ${\theta }_{j}$'s are $k$ by $k$ matrices of parameters. $\left\{{\varphi }_{i}\right\}$, for $\mathit{i}=1,2,\dots ,p$, are called the autoregressive (AR) parameter matrices, and $\left\{{\theta }_{j}\right\}$, for $\mathit{j}=1,2,\dots ,q$, the moving average (MA) parameter matrices. The parameters in the model are thus the $p$ $k$ by $k$ $\varphi $-matrices, the $q$ $k$ by $k$ $\theta $-matrices, the mean vector $\mu $ and the residual error covariance matrix $\Sigma $. Let

$Aϕ= ϕ1 I 0 . . . 0 ϕ2 0 I 0 . . 0 . . . . . . ϕp-1 0 . . . 0 I ϕp 0 . . . 0 0 pk×pk and Bθ= θ1 I 0 . . . 0 θ2 0 I 0 . . 0 . . . . . . θq- 1 0 . . . 0 I θq 0 . . . 0 0 qk×qk$
where $I$ denotes the $k$ by $k$ identity matrix.
The model (1) must be both stationary and invertible. The model is said to be stationary if the eigenvalues of $A\left(\varphi \right)$ lie inside the unit circle and invertible if the eigenvalues of $B\left(\theta \right)$ lie inside the unit circle.
For $k\ge 6$ the VARMA model (1) is recast into state space form and a realization of the state vector at time zero computed. For all other cases the function computes a realization of the pre-observed vectors ${X}_{0},{X}_{-1},\dots ,{X}_{1-p}$, ${\epsilon }_{0},{\epsilon }_{-1},\dots ,{\epsilon }_{1-q}$, from (1), see Shea (1988). This realization is then used to generate a sequence of successive time series observations. Note that special action is taken for pure MA models, that is for $p=0$.
At your request a new realization of the time series may be generated more efficiently using the information in a reference vector created during a previous call to nag_rand_varma (g05pjc). See the description of the argument mode in Section 5 for details.
The function returns a realization of ${X}_{1},{X}_{2},\dots ,{X}_{n}$. On a successful exit, the recent history is updated and saved in the array r so that nag_rand_varma (g05pjc) may be called again to generate a realization of ${X}_{n+1},{X}_{n+2},\dots $, etc. See the description of the argument mode in Section 5 for details.
Further computational details are given in Shea (1988). Note, however, that nag_rand_varma (g05pjc) uses a spectral decomposition rather than a Cholesky factorization to generate the multivariate Normals. Although this method involves more multiplications than the Cholesky factorization method and is thus slightly slower it is more stable when faced with ill-conditioned covariance matrices. A method of assigning the AR and MA coefficient matrices so that the stationarity and invertibility conditions are satisfied is described in Barone (1987).
One of the initialization functions nag_rand_init_repeatable (g05kfc) (for a repeatable sequence if computed sequentially) or nag_rand_init_nonrepeatable (g05kgc) (for a non-repeatable sequence) must be called prior to the first call to nag_rand_varma (g05pjc).

## 4  References

Barone P (1987) A method for generating independent realisations of a multivariate normal stationary and invertible ARMA$\left(p,q\right)$ process J. Time Ser. Anal. 8 125–130
Shea B L (1988) A note on the generation of independent realisations of a vector autoregressive moving average process J. Time Ser. Anal. 9 403–410

## 5  Arguments

1:     order – Nag_OrderTypeInput
On entry: the order argument specifies the two-dimensional storage scheme being used, i.e., row-major ordering or column-major ordering. C language defined storage is specified by ${\mathbf{order}}=\mathrm{Nag_RowMajor}$. See Section 3.2.1.3 in the Essential Introduction for a more detailed explanation of the use of this argument.
Constraint: ${\mathbf{order}}=\mathrm{Nag_RowMajor}$ or Nag_ColMajor.
2:     mode – Nag_ModeRNGInput
On entry: a code for selecting the operation to be performed by the function.
${\mathbf{mode}}=\mathrm{Nag_InitializeReference}$
Set up reference vector and compute a realization of the recent history.
${\mathbf{mode}}=\mathrm{Nag_GenerateFromReference}$
Generate terms in the time series using reference vector set up in a prior call to nag_rand_varma (g05pjc).
${\mathbf{mode}}=\mathrm{Nag_InitializeAndGenerate}$
Combine the operations of ${\mathbf{mode}}=\mathrm{Nag_InitializeReference}$ and $\mathrm{Nag_GenerateFromReference}$.
${\mathbf{mode}}=\mathrm{Nag_ReGenerateFromReference}$
A new realization of the recent history is computed using information stored in the reference vector, and the following sequence of time series values are generated.
If ${\mathbf{mode}}=\mathrm{Nag_GenerateFromReference}$ or $\mathrm{Nag_ReGenerateFromReference}$, then you must ensure that the reference vector r and the values of k, p, q, xmean, phi, theta, var and pdv have not been changed between calls to nag_rand_varma (g05pjc).
Constraint: ${\mathbf{mode}}=\mathrm{Nag_InitializeReference}$, $\mathrm{Nag_GenerateFromReference}$, $\mathrm{Nag_InitializeAndGenerate}$ or $\mathrm{Nag_ReGenerateFromReference}$.
3:     n – IntegerInput
On entry: $n$, the number of observations to be generated.
Constraint: ${\mathbf{n}}\ge 0$.
4:     k – IntegerInput
On entry: $k$, the dimension of the multivariate time series.
Constraint: ${\mathbf{k}}\ge 1$.
5:     xmean[k] – const doubleInput
On entry: $\mu $, the vector of means of the multivariate time series.
6:     p – IntegerInput
On entry: $p$, the number of autoregressive parameter matrices.
Constraint: ${\mathbf{p}}\ge 0$.
7:     phi[${\mathbf{k}}×{\mathbf{k}}×{\mathbf{p}}$] – const doubleInput
On entry: must contain the elements of the ${\mathbf{p}}×{\mathbf{k}}×{\mathbf{k}}$ autoregressive parameter matrices of the model, ${\varphi }_{1},{\varphi }_{2},\dots ,{\varphi }_{p}$. The $\left(i,j\right)$th element of ${\varphi }_{\mathit{l}}$ is stored in ${\mathbf{phi}}\left[\left(\mathit{l}-1\right)×k×k+\left(j-1\right)×k+i-1\right]$, for $\mathit{l}=1,2,\dots ,p$, $i=1,2,\dots ,k$ and $j=1,2,\dots ,k$.
Constraint: the elements of phi must satisfy the stationarity condition.
8:     q – IntegerInput
On entry: $q$, the number of moving average parameter matrices.
Constraint: ${\mathbf{q}}\ge 0$.
9:     theta[${\mathbf{k}}×{\mathbf{k}}×{\mathbf{q}}$] – const doubleInput
On entry: must contain the elements of the ${\mathbf{q}}×{\mathbf{k}}×{\mathbf{k}}$ moving average parameter matrices of the model, ${\theta }_{1},{\theta }_{2},\dots ,{\theta }_{q}$. The $\left(i,j\right)$th element of ${\theta }_{\mathit{l}}$ is stored in ${\mathbf{theta}}\left[\left(\mathit{l}-1\right)×k×k+\left(\mathit{j}-1\right)×k+\mathit{i}-1\right]$, for $\mathit{l}=1,2,\dots ,q$, $\mathit{i}=1,2,\dots ,k$ and $\mathit{j}=1,2,\dots ,k$.
Constraint: the elements of theta must be within the invertibility region.
10:   var[$\mathit{dim}$] – const doubleInput
Note: the dimension, dim, of the array var must be at least ${\mathbf{pdv}}×{\mathbf{k}}$.
Where ${\mathbf{VAR}}\left(i,j\right)$ appears in this document, it refers to the array element
• ${\mathbf{var}}\left[\left(j-1\right)×{\mathbf{pdv}}+i-1\right]$ when ${\mathbf{order}}=\mathrm{Nag_ColMajor}$;
• ${\mathbf{var}}\left[\left(i-1\right)×{\mathbf{pdv}}+j-1\right]$ when ${\mathbf{order}}=\mathrm{Nag_RowMajor}$.
On entry: ${\mathbf{VAR}}\left(\mathit{i},\mathit{j}\right)$ must contain the ($\mathit{i},\mathit{j}$)th element of $\Sigma $, for $\mathit{i}=1,2,\dots ,{\mathbf{k}}$ and $\mathit{j}=1,2,\dots ,{\mathbf{k}}$. Only the lower triangle is required.
Constraint: the elements of var must be such that $\Sigma $ is positive semidefinite.
11:   pdv – IntegerInput
On entry: the stride separating row or column elements (depending on the value of order) in the array var.
Constraint: ${\mathbf{pdv}}\ge {\mathbf{k}}$.
12:   r[lr] – doubleCommunication Array
On entry: if ${\mathbf{mode}}=\mathrm{Nag_GenerateFromReference}$ or $\mathrm{Nag_ReGenerateFromReference}$, the array r as output from the previous call to nag_rand_varma (g05pjc) must be input without any change.
If ${\mathbf{mode}}=\mathrm{Nag_InitializeReference}$ or $\mathrm{Nag_InitializeAndGenerate}$, the contents of r need not be set.
On exit: information required for any subsequent calls to the function with ${\mathbf{mode}}=\mathrm{Nag_GenerateFromReference}$ or $\mathrm{Nag_ReGenerateFromReference}$. See Section 8.
13:   lr – IntegerInput
On entry: the dimension of the array r.
Constraints:
• if ${\mathbf{k}}\ge 6$, ${\mathbf{lr}}\ge \left(5{\mathit{r}}^{2}+1\right)×{{\mathbf{k}}}^{2}+\left(4\mathit{r}+3\right)×{\mathbf{k}}+4$;
• if ${\mathbf{k}}<6$, ${\mathbf{lr}}\ge \left({\left({\mathbf{p}}+{\mathbf{q}}\right)}^{2}+1\right)×{{\mathbf{k}}}^{2}+\phantom{\rule{0ex}{0ex}}\left(4×\left({\mathbf{p}}+{\mathbf{q}}\right)+3\right)×{\mathbf{k}}+\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left\{{\mathbf{k}}\mathit{r}\left({\mathbf{k}}\mathit{r}+2\right),{{\mathbf{k}}}^{2}{\left({\mathbf{p}}+{\mathbf{q}}\right)}^{2}+\mathit{l}\left(\mathit{l}+3\right)+{{\mathbf{k}}}^{2}\left({\mathbf{q}}+1\right)\right\}+4$.
Where $\mathit{r}=\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left({\mathbf{p}},{\mathbf{q}}\right)$ and if ${\mathbf{p}}=0$, $\mathit{l}={\mathbf{k}}\left({\mathbf{k}}+1\right)/2$, or if ${\mathbf{p}}\ge 1$, $\mathit{l}={\mathbf{k}}\left({\mathbf{k}}+1\right)/2+\left({\mathbf{p}}-1\right){{\mathbf{k}}}^{2}$.
See Section 8 for some examples of the required size of the array r.
14:   state[$\mathit{dim}$] – IntegerCommunication Array
Note: the actual argument supplied must be the array state supplied to the initialization functions nag_rand_init_repeatable (g05kfc) or nag_rand_init_nonrepeatable (g05kgc).
On entry: contains information on the selected base generator and its current state.
On exit: contains updated information on the state of the generator.
15:   x[$\mathit{dim}$] – doubleOutput
Note: the dimension, dim, of the array x must be at least
• $\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,{\mathbf{pdx}}×{\mathbf{n}}\right)$ when ${\mathbf{order}}=\mathrm{Nag_ColMajor}$;
• $\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,{\mathbf{k}}×{\mathbf{pdx}}\right)$ when ${\mathbf{order}}=\mathrm{Nag_RowMajor}$.
Where ${\mathbf{X}}\left(i,t\right)$ appears in this document, it refers to the array element
• ${\mathbf{x}}\left[\left(t-1\right)×{\mathbf{pdx}}+i-1\right]$ when ${\mathbf{order}}=\mathrm{Nag_ColMajor}$;
• ${\mathbf{x}}\left[\left(i-1\right)×{\mathbf{pdx}}+t-1\right]$ when ${\mathbf{order}}=\mathrm{Nag_RowMajor}$.
On exit: ${\mathbf{X}}\left(\mathit{i},\mathit{t}\right)$ will contain a realization of the $\mathit{i}$th component of ${X}_{\mathit{t}}$, for $\mathit{i}=1,2,\dots ,k$ and $\mathit{t}=1,2,\dots ,n$.
16:   pdx – IntegerInput
On entry: the stride separating row or column elements (depending on the value of order) in the array x.
Constraints:
• if ${\mathbf{order}}=\mathrm{Nag_ColMajor}$, ${\mathbf{pdx}}\ge {\mathbf{k}}$;
• if ${\mathbf{order}}=\mathrm{Nag_RowMajor}$, ${\mathbf{pdx}}\ge {\mathbf{n}}$.
17:   fail – NagError *Input/Output
The NAG error argument (see Section 3.6 in the Essential Introduction).

## 6  Error Indicators and Warnings

NE_ALLOC_FAIL
Dynamic memory allocation failed.
NE_BAD_PARAM
On entry, argument $〈\mathit{\text{value}}〉$ had an illegal value.
NE_CLOSE_TO_STATIONARITY
The reference vector cannot be computed because the AR parameters are too close to the boundary of the stationarity region.
NE_INT
On entry, ${\mathbf{k}}=〈\mathit{\text{value}}〉$.
Constraint: ${\mathbf{k}}\ge 1$.
On entry, lr is not large enough, ${\mathbf{lr}}=〈\mathit{\text{value}}〉$: minimum length required $\text{}=〈\mathit{\text{value}}〉$.
On entry, ${\mathbf{n}}=〈\mathit{\text{value}}〉$.
Constraint: ${\mathbf{n}}\ge 0$.
On entry, ${\mathbf{p}}=〈\mathit{\text{value}}〉$.
Constraint: ${\mathbf{p}}\ge 0$.
On entry, ${\mathbf{pdv}}=〈\mathit{\text{value}}〉$.
Constraint: ${\mathbf{pdv}}>0$.
On entry, ${\mathbf{pdx}}=〈\mathit{\text{value}}〉$.
Constraint: ${\mathbf{pdx}}>0$.
On entry, ${\mathbf{q}}=〈\mathit{\text{value}}〉$.
Constraint: ${\mathbf{q}}\ge 0$.
NE_INT_2
On entry, ${\mathbf{pdv}}=〈\mathit{\text{value}}〉$ and ${\mathbf{k}}=〈\mathit{\text{value}}〉$.
Constraint: ${\mathbf{pdv}}\ge {\mathbf{k}}$.
On entry, ${\mathbf{pdx}}=〈\mathit{\text{value}}〉$ and ${\mathbf{k}}=〈\mathit{\text{value}}〉$.
Constraint: ${\mathbf{pdx}}\ge {\mathbf{k}}$.
On entry, ${\mathbf{pdx}}=〈\mathit{\text{value}}〉$ and ${\mathbf{n}}=〈\mathit{\text{value}}〉$.
Constraint: ${\mathbf{pdx}}\ge {\mathbf{n}}$.
NE_INTERNAL_ERROR
An internal error has occurred in this function. Check the function call and any array sizes. If the call is correct then please contact NAG for assistance.
NE_INVALID_STATE
On entry, state vector has been corrupted or not initialized.
NE_INVERTIBILITY
On entry, the moving average parameter matrices are such that the model is non-invertible.
NE_POS_DEF
On entry, the covariance matrix var is not positive semidefinite to machine precision.
NE_PREV_CALL
k is not the same as when r was set up in a previous call.
Previous value of ${\mathbf{k}}=〈\mathit{\text{value}}〉$ and ${\mathbf{k}}=〈\mathit{\text{value}}〉$.
NE_STATIONARY_AR
On entry, the AR parameters are outside the stationarity region.
NE_TOO_MANY_ITER
An excessive number of iterations were required by the NAG function used to evaluate the eigenvalues of the covariance matrix.
An excessive number of iterations were required by the NAG function used to evaluate the eigenvalues of the matrices used to test for stationarity or invertibility.
An excessive number of iterations were required by the NAG function used to evaluate the eigenvalues stored in the reference vector.

## 7  Accuracy

The accuracy is limited by the matrix computations performed, and this is dependent on the condition of the argument and covariance matrices.

## 8  Further Comments

Note that, in reference to NE_INVERTIBILITY, nag_rand_varma (g05pjc) will permit moving average parameters on the boundary of the invertibility region.
The elements of r contain amongst other information details of the spectral decompositions which are used to generate future multivariate Normals. Note that these eigenvectors may not be unique on different machines. For example the eigenvectors corresponding to multiple eigenvalues may be permuted. Although an effort is made to ensure that the eigenvectors have the same sign on all machines, differences in the signs may theoretically still occur.
The following table gives some examples of the required size of the array r, specified by the argument lr, for $k=1,2$ or $3$, and for various values of $p$ and $q$.
|    |    |     |      |                                                                              |      |
|----|----|-----|------|------------------------------------------------------------------------------|------|
|    |    |     |      | $q$ |      |
|    |    |     |      |                                                                              |      |
|    |    | 0   | 1    | 2                                                                            | 3    |
|    |    |     |      |                                                                              |      |
|    |    | 13  | 20   | 31                                                                           | 46   |
|    | 0  | 36  | 56   | 92                                                                           | 144  |
|    |    | 85  | 124  | 199                                                                          | 310  |
|    |    |     |      |                                                                              |      |
|    |    | 19  | 30   | 45                                                                           | 64   |
|    | 1  | 52  | 88   | 140                                                                          | 208  |
|    |    | 115 | 190  | 301                                                                          | 448  |
| p  |    |     |      |                                                                              |      |
|    |    | 35  | 50   | 69                                                                           | 92   |
|    | 2  | 136 | 188  | 256                                                                          | 340  |
|    |    | 397 | 508  | 655                                                                          | 838  |
|    |    |     |      |                                                                              |      |
|    |    | 57  | 76   | 99                                                                           | 126  |
|    | 3  | 268 | 336  | 420                                                                          | 520  |
|    |    | 877 | 1024 | 1207                                                                         | 1426 |
Note that nag_tsa_arma_roots (g13dxc) may be used to check whether a VARMA model is stationary and invertible.
The time taken depends on the values of $p$, $q$ and especially $n$ and $k$.

## 9  Example

This program generates two realizations, each of length $48$, from the bivariate AR(1) model

$Xt-μ=ϕ1Xt-1-μ+εt$
with

$ϕ1= 0.80 0.07 0.00 0.58 ,$

$μ= 5.00 9.00 ,$
and

$Σ= 2.97 0 0.64 5.38 .$
The pseudorandom number generator is initialized by a call to nag_rand_init_repeatable (g05kfc). Then, in the first call to nag_rand_varma (g05pjc), ${\mathbf{mode}}=\mathrm{Nag_InitializeAndGenerate}$ in order to set up the reference vector before generating the first realization. In the subsequent call ${\mathbf{mode}}=\mathrm{Nag_ReGenerateFromReference}$ and a new recent history is generated and used to generate the second realization.

### 9.1  Program Text

Program Text (g05pjce.c)

### 9.2  Program Data

Program Data (g05pjce.d)

### 9.3  Program Results

Program Results (g05pjce.r)
{"extraction_info": {"found_math": true, "script_math_tex": 0, "script_math_asciimath": 0, "math_annotations": 0, "math_alttext": 0, "mathml": 170, "mathjax_tag": 0, "mathjax_inline_tex": 0, "mathjax_display_tex": 0, "mathjax_asciimath": 0, "img_math": 0, "codecogs_latex": 0, "wp_latex": 0, "mimetex.cgi": 0, "/images/math/codecogs": 0, "mathtex.cgi": 0}, "config": {"markdown_headings": true, "markdown_code": true, "boilerplate_config": {"ratio_threshold": 0.18, "absolute_threshold": 10, "end_threshold": 15, "enable": true}, "remove_buttons": true, "remove_image_figures": true, "remove_link_clusters": true, "table_config": {"min_rows": 2, "min_cols": 3, "format": "github"}, "remove_chinese": true, "remove_edit_buttons": true, "extract_latex": true}, "english_confidence": 0.6743291020393372, "perplexity_flag": "middle"}