package com.imsl.test.example.stat;
import com.imsl.stat.*;
import java.util.*;
/**
*
* Performs outlier identification and simultaneously
* fits an \(\text{ARIMA}(2,2,0)\) to the Canadian Lynx dataset.
*
* The data is a time series of the estimated population of Canadian lynx.
* Class ARMAOutlierIdentification
is used to fit an
* \(\text{ARIMA}(2,2,0)\) model of the form
* \((1-B)(1-\phi_1B-\phi_2B^2)Y_t=a_t,\, t=1,2,\ldots,144,\,\) where \( \{a_t\}\)
* is Gaussian white noise.
* The compute
method determines the estimates
* \(\hat{\phi}_1=0.10682\) and \(\hat{\phi}_2=-0.19666\) and identifies a
* level shift (LS) type outlier at time point \(t=16\).
*
*
* @see Code
* @see Output
*/
public class ARMAOutlierIdentificationEx1 {
public static void main(String args[]) throws Exception {
double[] series = {
0.24300E01, 0.25060E01, 0.27670E01, 0.29400E01, 0.31690E01,
0.34500E01, 0.35940E01, 0.37740E01, 0.36950E01, 0.34110E01,
0.27180E01, 0.19910E01, 0.22650E01, 0.24460E01, 0.26120E01,
0.33590E01, 0.34290E01, 0.35330E01, 0.32610E01, 0.26120E01,
0.21790E01, 0.16530E01, 0.18320E01, 0.23280E01, 0.27370E01,
0.30140E01, 0.33280E01, 0.34040E01, 0.29810E01, 0.25570E01,
0.25760E01, 0.23520E01, 0.25560E01, 0.28640E01, 0.32140E01,
0.34350E01, 0.34580E01, 0.33260E01, 0.28350E01, 0.24760E01,
0.23730E01, 0.23890E01, 0.27420E01, 0.32100E01, 0.35200E01,
0.38280E01, 0.36280E01, 0.28370E01, 0.24060E01, 0.26750E01,
0.25540E01, 0.28940E01, 0.32020E01, 0.32240E01, 0.33520E01,
0.31540E01, 0.28780E01, 0.24760E01, 0.23030E01, 0.23600E01,
0.26710E01, 0.28670E01, 0.33100E01, 0.34490E01, 0.36460E01,
0.34000E01, 0.25900E01, 0.18630E01, 0.15810E01, 0.16900E01,
0.17710E01, 0.22740E01, 0.25760E01, 0.31110E01, 0.36050E01,
0.35430E01, 0.27690E01, 0.20210E01, 0.21850E01, 0.25880E01,
0.28800E01, 0.31150E01, 0.35400E01, 0.38450E01, 0.38000E01,
0.35790E01, 0.32640E01, 0.25380E01, 0.25820E01, 0.29070E01,
0.31420E01, 0.34330E01, 0.35800E01, 0.34900E01, 0.34750E01,
0.35790E01, 0.28290E01, 0.19090E01, 0.19030E01, 0.20330E01,
0.23600E01, 0.26010E01, 0.30540E01, 0.33860E01, 0.35530E01,
0.34680E01, 0.31870E01, 0.27230E01, 0.26860E01, 0.28210E01,
0.30000E01, 0.32010E01, 0.34240E01, 0.35310E01
};
int[] model = new int[4];
double[] outlierFreeSeries;
double resStdErr, aic, constant;
double[] ar;
int[][] outlierStatistics;
int numOutliers;
model[0] = 2;
model[1] = 0;
model[2] = 1;
model[3] = 2;
ARMAOutlierIdentification armaOutlier
= new ARMAOutlierIdentification(series);
armaOutlier.setCriticalValue(3.5);
armaOutlier.compute(model);
outlierFreeSeries = armaOutlier.getOutlierFreeSeries();
numOutliers = armaOutlier.getNumberOfOutliers();
outlierStatistics = armaOutlier.getOutlierStatistics();
constant = armaOutlier.getConstant();
ar = armaOutlier.getAR();
resStdErr = armaOutlier.getResidualStandardError();
aic = armaOutlier.getAIC();
System.out.printf("%n%n ARMA parameters:%n");
System.out.printf(Locale.ENGLISH, "constant:%9.6f%n", constant);
System.out.printf(Locale.ENGLISH, "ar[0]:%12.6f%n", ar[0]);
System.out.printf(Locale.ENGLISH, "ar[1]:%12.6f%n%n", ar[1]);
System.out.printf("Number of outliers:%3d%n", numOutliers);
System.out.printf("%n Outlier statistics:%n");
System.out.printf("Time point%6sOutlier type%n", " ");
for (int i = 0; i < numOutliers; i++) {
System.out.printf("%10d%18d%n", outlierStatistics[i][0],
outlierStatistics[i][1]);
}
System.out.printf(Locale.ENGLISH, "%nRSE:%9.6f%n", resStdErr);
System.out.printf(Locale.ENGLISH, "AIC:%11.6f", aic);
System.out.printf("%n%n Extract from the series:%n");
System.out.printf("time original outlier free%n");
for (int i = 0; i < 36; i++) {
System.out.printf(Locale.ENGLISH, "%4d%11.4f%15.4f%n",
i + 1, series[i], outlierFreeSeries[i]);
}
}
}