 # VAR Model

## Example: VAR Model in TSMT

Vector autoregressive models generalize the single variable autoregressive model to allow for more than one endogenous variable. The standard (or reduced) form of a VAR(1) model with two separate time series is:

yt,1 = α1 + φ11 yt-1,11,2 yt-1,2 + ut,1
yt,2 = α2 + φ21 yt-1,122 yt-1,2 + ut,2

Assuming:

1. y is an N by p matrix, where N is the length of the time series and p is the order of the VAR.
2. alpha is a 1 by p matrix, representing the intercept term.
3. e is an N by p matrix containing the error term.

We can express a VAR(p) model in matrix form, using GAUSS code as:

``y[t,1:p] = alpha + y[t-1,.] * phi' + e[t,.];``
The time series module provides a number of routines for performing pre-estimation data analysis, model parameter estimation, and post-estimation diagnosis of autoregressive time series.

### Load and plot time series

For this example, we will use a data set that comes with TSMT, named minkmt.asc. This file contains data for the prices of two commodities from 1850 to 1910. The first column contains the dates and the second and third columns contain the data.

``````//Get path to GAUSSHOME directory
path = getGAUSSHome();

fname = path \$+ "examples/minkmt.asc";

//Load data from the second and third columns
//of a space separated text file
y = csvReadM(fname, 1, 2|3, " ");

first_date = csvReadM(fname, 1|1, 1|1, " ");

//Plot data
plotTS(first_date, 1, y);``````

The above code should produce a plot that looks similar to this: The first thing that we notice is that the, at least the first series, seems to have a trend and that neither series has a mean near zero. We can use the TSMT function, vmdetrendmt to remove the trend and demean the data. The vmdetrendmt function takes two inputs:

1. An NxK matrix containing one or more time series to be acted upon.
2. A scalar, indicator variable with the following options:
 0 Return the original data untouched. 1 Detrend the data, based upon a linear model. 2+ Detrend the data based upon a polynomial model.

Now we will detrend and demean our data, assuming only a linear trend.

``````//Load TSMT library functions
library tsmt;

//Detrend and demean data
y_detrend = vmdetrendmt(y, 1);

//Plot transformed data
plotTS(first_date, 1, y_detrend);``````

The graph of the detrended data should look more like this: After detrending, the data appears to have a mean of zero and does not have a trend. However, the variance of the data seems to increase with time. Let's try differencing the data instead of detrending:

``````//Calculate the first difference
y_diff = vmdiffmt(y, 1);

//Plot transformed data
plotTS(first_date, 1, y_diff);``````

The plot of the differenced data should look like this: This plot does not appear to have a trend, the mean is near zero and the variance does not appear to increase with time.

## Estimating the Vector Autoregressive Model

The varmaxmt function is a convenient tool for estimating the parameters of VAR models with or without exogenous variables.  The varmaxmt function takes two required arguments:
1. A varmamtControl structure.
2. An N x K data vector, y, where each column of y is a different time series.
Note that varmaxmt will produce an error if the data is not stationary and invertible.

### The varmamtControl Structure

This structure handles the matrices and strings that control the estimation process such as specifying whether to include a constant, output appearance, and estimation parameters.  Continuing with the example above,
``````//Declare 'vctl' to be a varmamtControl structure
//and fill with default values
struct varmamtControl vctl;
vctl = varmamtControlCreate();

//Declare 'vout' to be an varmamtOut structure,
//to hold the results from 'varmaxmt'
struct varmamtOut vout;

//Specify the AR order to 2
vctl.ar = 2;

//Specify order of differencing
vctl.diff = 1;

//Specify MA order
vctl.ma = 0;

//No constant in model
vctl.const = 0;``````
This appropriately passes to varmaxmt that the model is an VAR(2) model and does not include a constant.  The remaining control elements (the ones that we did not set above), left at the default values, specify preferences for output display and estimation. With the control structure options set, we can now perform the estimation:
``````//Perform estimation with 'varmaxmt'
//Note that we are passing in the original, 'y'
//Since we told 'varmaxmt' to difference 'y',
//by setting vctl.diff = 1
vout = varmaxmt(vctl, y);``````
which will return output similar to:
``=============================================== VARMAX Version 2.1.3 =============================================== Phi Plane [1,.,.] -0.12309 0.57672 -0.67611 0.34425 Plane [2,.,.] 0.26190 -0.12894 -0.26000 -0.044378 standard errors Plane [1,.,.] 1.0000 1.0000 1.0000 1.0000 Plane [2,.,.] 1.0000 1.0000 1.0000 1.0000 t-values Plane [1,.,.] -0.12309 0.57672 -0.67611 0.34425 Plane [2,.,.] 0.26190 -0.12894 -0.26000 -0.044378 probabilities Plane [1,.,.] 0.90253 0.56672 0.50209 0.73210 Plane [2,.,.] 0.79447 0.89792 0.79593 0.96478 Residual Covariance Matrix 0.066376 0.026428 0.026428 0.065819 standard errors 1.0000 1.0000 1.0000 1.0000 t-values 0.066376 0.026428 0.026428 0.065819 probabilities 0.94734 0.97902 0.97902 0.94778 Beta0 -0.010973 0.021210 Augmented Dickey-Fuller UNIT ROOT Test for Y1 Critical Values ADF Stat 1% 5% 10% 90% 95% 99% No Intercept -5.2278 -2.5328 -1.9498 -1.6266 0.9152 1.3168 2.1179 Intercept -5.1774 -3.5663 -2.9370 -2.6152 -0.4393 -0.0499 0.6942 Intercept and Time Trend -5.2981 -4.0892 -3.4615 -3.1709 -1.2584 -0.9195 -0.2986 Augmented Dickey-Fuller UNIT ROOT Test for Y2 Critical Values ADF Stat 1% 5% 10% 90% 95% 99% No Intercept -4.7720 -2.5328 -1.9498 -1.6266 0.9152 1.3168 2.1179 Intercept -4.7352 -3.5663 -2.9370 -2.6152 -0.4393 -0.0499 0.6942 Intercept and Time Trend -4.6155 -4.0892 -3.4615 -3.1709 -1.2584 -0.9195 -0.2986 Phillips-Perron UNIT ROOT Test for Y1 PPt 1% 5% No Intercept -7.2621 -2.5328 -1.9498 Intercept -6.9186 -3.5663 -2.9370 Intercept and Time Trend -6.9497 -4.0892 -3.4615 Phillips-Perron UNIT ROOT Test for Y2 PPt 1% 5% No Intercept -6.3499 -2.5328 -1.9498 Intercept -5.9127 -3.5663 -2.9370 Intercept and Time Trend -5.8505 -4.0892 -3.4615 Augmented Dickey-Fuller COINTEGRATION Test for Y1 Y2 Critical Values ADF Stat 1% 5% 10% 90% 95% 99% No Intercept -5.0448 -3.4003 -2.8198 -2.4901 -0.2841 0.1628 0.9912 Intercept -5.0375 -4.0246 -3.4040 -3.0890 -0.9988 -0.6383 0.0929 Intercept and Time Trend -5.1691 -4.5041 -3.9157 -3.6062 -1.6464 -1.3413 -0.6750 Johansen's Trace and Maximum Eigenvalue Statistics. r = # of CI Equations Critical Values r Trace Max. Eig 1% 5% 10% 90% No Intercept 0 65.5906 46.3981 1 19.1925 19.1925 1.0524 1.7046 2.1927 9.3918 Intercept 0 65.6102 46.4140 1 19.1962 19.1962 2.2515 3.3599 4.0975 12.8635 Intercept and Time Trend 0 66.2392 46.3986 1 19.8406 19.8406 4.0389 5.3796 6.1879 16.1762 Dep. Variable(s) : Y1 Y2 No. of Observations : 61 61 Degrees of Freedom : 50 50 Mean of Y : 0.0018 0.0279 Std. Dev. of Y : 0.3014 0.3506 Y Sum of Squares : 5.4509 7.3772 SSE : 4.0489 4.0150 MSE : 0.0730 0.0723 sqrt(MSE) : 0.2701 0.2690 R-Squared : 0.2572 0.4558 Adjusted R-Squared : 0.1086 0.3469 Model Selection (Information) Criteria ...................................... Likelihood Function : -2.0830 Akaike AIC : -17.8339 Schwarz BIC : 49.3857 Likelihood Ratio : 4.1661 Characteristic Equation(s) for Stationarity and Invertibility AR Roots and Moduli: Real : 4.2121928 -1.9895302 Imag.: 0.0000000 0.0000000 Mod. : 4.2121928 1.9895302 MULTIVARIATE ACF LAG01 LAG02 LAG03 0.03143 0.06429 -0.1224 -0.0856 -0.0715 -0.1648 0.002152 -0.03561 -0.1163 -0.2181 0.133 0.1341 LAG04 LAG05 LAG06 -0.1864 -0.1613 -0.1483 0.09278 -0.3151 0.02871 -0.04398 -0.04798 0.01561 -0.04506 -0.1768 -0.03803 LAG07 LAG08 LAG09 0.008986 -0.02272 -0.04262 0.01081 0.2493 0.3194 -0.04619 -0.1493 -0.09121 0.06298 0.1083 0.08513 LAG10 LAG11 LAG12 0.4103 0.04377 0.01628 -0.1909 -0.01679 0.005056 0.1636 -0.1654 0.1557 0.1854 -0.09051 0.07984 ACF INDICATORS: SIGNIFICANCE = 0.95 (using Bartlett's large sample standard errors) LAG01 LAG02 LAG03 LAG04 LAG05 LAG06 -+-+ -+-+ -+-+ -+-+ -+-+ -+-+ -+-+ -+-+ -+-+ -+-+ -+-+ -+-+ LAG07 LAG08 LAG09 LAG10 LAG11 LAG12 -+-+ -+-+ -+-+ -+-+ -+-+ -+-+ -+-+ -+-+ -+-+ -+-+ -+-+ -+-+ Multivariate Goodness of Fit Test Lag Qs P-Value 3 9.5468 0.0488 4 12.4737 0.1313 5 17.3960 0.1353 6 26.3349 0.0495 7 28.0138 0.1091 8 29.4429 0.2039 9 38.2221 0.0943 10 55.2182 0.0066 11 64.9744 0.0022 12 66.9787 0.0048``

## Forecasting

We will produce forecasts from our model, using vmforecastmt. It takes five inputs:

1. A varmamtControl structure which, as we saw above, contains the AR order and other model settings.
2. A varmamtOut structure, possibly returned by varmaxmt, which will contain the parameter estimates for our VAR model.
3. A time series vector from which to produce forecasts. The length of this vector must be (p + 1), where p is the specified order of the AR process. However, vmforecast will read from the end of the vector. This allows you to pass in the entire time series if you want forecasts from the end of your data.
4. A vector or matrix, containing any exogenous variables in the model over the forecast horizon.
5. A scalar, the number of periods to forecast.

vmforecastmt returns a matrix in which the first column contains the forecast observation number (from 1 to the number of forecast periods), the remaining columns contain the forecast for each of the endogenous variables. Continuing on with our example, we will produce a 10 period forecast:

``//Produce 10 period forecast //Since we have no exogenous variables, //we pass a scalar zero for the 4th input f = vmforecastmt(vctl, vout, y, 0, 10);``

The forecast matrix, f should look similar to this:

`` 1 0.437 0.222 2 0.0291 -0.286 3 0.151 -0.338 4 -0.0829 -0.242 5 -0.169 -0.213 6 -0.0461 -0.0513 7 -0.0927 0.0731 8 -0.0407 0.0669 9 0.0481 0.102 10 0.00988 0.0714``

After calculating our forecast, we can plot the original differenced data and our forecasts together like this:

``//Declare 'myPlot' to be a plotControl structure struct plotControl myPlot; //Fill 'myPlot' with default values myPlot = plotGetDefaults("xy"); //Set line colors plotSetLineColor(&myPlot, "orange"\$|"blue"); plotSetTitle(&myPlot, "Differenced data and VAR(2) model forecast", "times", 18); //Plot differenced 'y' data plotTS(myPlot, 1850, 1, y); //Set line style dots for forecast period plotSetLineStyle(&myPlot, 3); //Add forecasts to plot plotAddTS(myPlot, 1910, 1, f[.,2:3]);``

Which should produce the following graph. ## The Command File

Finally we put it all together in the command file below, which will reproduce all output shown above.
``//Load TSMT library functions library tsmt; /******************************************* ** ** ** Load and process data ** ** ** *******************************************/ //Create file name with full path fname = getGAUSSHome() \$+ "examples/minkmt.asc"; //Load all rows of the second and third columns of //a space separated file y = csvReadM(fname, 1, 2, " "); //Difference the data y = vmdiffmt(y, 1); /******************************************* ** ** ** Estimate ** ** ** *******************************************/ //Declare 'vctl' to be a varmamtControl structure struct varmamtControl vctl; //Fill 'vctl' with default values vctl = varmamtControlCreate(); //Specify a VAR(2) model vctl.ar = 2; //Declare 'vout' to be a varmamtOut structure //to hold the return values from 'vout' struct varmamtOut vout; //Estimate the parameters of the VAR(2) model //and print diagnostic information vout = varmaxmt(vctl, y); /******************************************* ** ** ** Forecast ** ** ** *******************************************/ //Create a 10 period forecast f = vmforecastmt(vctl, vout, y, 0, 10); /******************************************* ** ** ** Plot differenced data and forecast ** ** ** *******************************************/ //Declare 'myPlot' to be a plotControl structure struct plotControl myPlot; //Fill 'myPlot' with default values myPlot = plotGetDefaults("xy"); //Set line colors plotSetLineColor(&myPlot, "orange"\$|"blue"); plotSetTitle(&myPlot, "Differenced data and VAR(2) model forecast", "times", 18); //Plot differenced 'y' data plotTS(myPlot, 1850, 1, y); plotSetLineStyle(&myPlot, 3); //Add forecasts to plot plotAddTS(myPlot, 1910, 1, f[.,2:3]);``

### Have a Specific Question?

Get a real answer from a real person

### Need Support?

Get help from our friendly experts.