package com.imsl.test.example.stat;
import java.text.*;
import com.imsl.stat.*;
import com.imsl.math.*;
/**
*
*
* Fits an \(\text{ARMA}(2,1)\) to the Wolfer sunspot data and
* produces a forecast table.
*
* Consider the Wolfer Sunspot Data (Anderson 1971, p. 660) consisting of the
* number of sunspots observed each year from 1749 through 1924. The data set
* for this example consists of the number of sunspots observed from 1770
* through 1869. An \(\text{ARMA}(2,1)\) model is fitted to these data using the
* Method of Moments. With backward_origin=3
, the
* forecast
method is used to obtain forecasts starting from 1866,
* 1867, 1868, and 1869, respectively. Note that the values in the first row of
* the matrix returned by this method are the one-step ahead forecasts for 1867,
* 1868, ..., 1870. The values in the second row are the two-step ahead
* forecasts for 1868, 1869, ..., 1871, etc.
*
* Method getForecast
is used to compute the one-step ahead
* forecasts setting backward_origin
= 10. This obtains the
* one-step ahead forecasts for the last 10 observations in the series, i.e.
* years 1860-1869, plus the next 5 years. The upper 90% confidence limits are
* computed for these forecasts using the getDeviations
method.
*
*
* @see Code
* @see Output
*/
public class ARMAEx3 {
public static void main(String args[]) throws Exception {
/* sunspots from 1770 to 1869 */
double[] z = {
100.8, 81.6, 66.5, 34.8, 30.6, 7, 19.8, 92.5,
154.4, 125.9, 84.8, 68.1, 38.5, 22.8, 10.2, 24.1, 82.9,
132, 130.9, 118.1, 89.9, 66.6, 60, 46.9, 41, 21.3, 16,
6.4, 4.1, 6.8, 14.5, 34, 45, 43.1, 47.5, 42.2, 28.1, 10.1,
8.1, 2.5, 0, 1.4, 5, 12.2, 13.9, 35.4, 45.8, 41.1, 30.4,
23.9, 15.7, 6.6, 4, 1.8, 8.5, 16.6, 36.3, 49.7, 62.5, 67,
71, 47.8, 27.5, 8.5, 13.2, 56.9, 121.5, 138.3, 103.2,
85.8, 63.2, 36.8, 24.2, 10.7, 15, 40.1, 61.5, 98.5, 124.3,
95.9, 66.5, 64.5, 54.2, 39, 20.6, 6.7, 4.3, 22.8, 54.8,
93.8, 95.7, 77.2, 59.1, 44, 47, 30.5, 16.3, 7.3, 37.3,
73.9
};
int backwardOrigin = 3;
double[][] printTable = new double[15][4];
double[][] printEstimates = new double[1][4];
double[] forecasts, deviations;
PrintMatrixFormat pmf = new PrintMatrixFormat();
PrintMatrix pm = new PrintMatrix();
NumberFormat nf = NumberFormat.getNumberInstance();
pm.setColumnSpacing(3);
ARMA arma = new ARMA(2, 1, z);
arma.compute();
System.out.println("ARMA ESTIMATES");
double[] ar = arma.getAR();
double[] ma = arma.getMA();
printEstimates[0][0] = arma.getConstant();
printEstimates[0][1] = ar[0];
printEstimates[0][2] = ar[1];
printEstimates[0][3] = ma[0];
String[] estimateLabels = {"Constant", "AR(1)", "AR(2)", "MA(1)"};
pmf.setColumnLabels(estimateLabels);
nf.setMinimumFractionDigits(5);
nf.setMaximumFractionDigits(5);
pmf.setNumberFormat(nf);
pm.setTitle("ARMA ESTIMATES");
pm.print(pmf, printEstimates);
arma.setBackwardOrigin(backwardOrigin);
String[] labels = {"From 1866", "From 1867",
"From 1868", "From 1869"};
pmf.setColumnLabels(labels);
pmf.setFirstRowNumber(1);
nf.setMinimumFractionDigits(1);
nf.setMaximumFractionDigits(1);
pmf.setNumberFormat(nf);
pm.setTitle("FORECASTS");
pm.print(pmf, arma.forecast(5));
/* FORECASTING - An example of forecasting using the ARMA estimates
* In this case, forecasts are returned for the last 10 values in the
* series followed by the forecasts for the next 5 values.
*/
String[] forecastLabels = {
"Observed", "Forecast", "Residual", "UCL(90%)"
};
pmf.setColumnLabels(forecastLabels);
backwardOrigin = 10;
arma.setBackwardOrigin(backwardOrigin);
int n_forecast = 5;
arma.setConfidence(0.9);
forecasts = arma.getForecast(n_forecast);
deviations = arma.getDeviations();
for (int i = 0; i < backwardOrigin; i++) {
printTable[i][0] = z[z.length - backwardOrigin + i];
printTable[i][1] = forecasts[i];
printTable[i][2] = z[z.length - backwardOrigin + i] - forecasts[i];
printTable[i][3] = forecasts[i] + deviations[0];
}
for (int i = backwardOrigin; i < n_forecast + backwardOrigin; i++) {
printTable[i][0] = Double.NaN;
printTable[i][1] = forecasts[i];
printTable[i][2] = Double.NaN;
printTable[i][3] = forecasts[i] + deviations[i - backwardOrigin];
}
pmf.setFirstRowNumber(1869 - backwardOrigin + 1);
pm.setTitle("ARMA ONE-STEP AHEAD FORECASTS");
pm.print(pmf, printTable);
}
}