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. The maximum likelihood estimates
for the ARMA(2, 1) model
where the errors
are independently normally distributed with mean zero and variance
The maximum likelihood estimates from ARMAMaxLikelihood
are compared to the same estimates using the method of moments and least squares from the ARMA
class. For each method, the coefficients and forecasts for the last ten years, 1860-1869, are compared. The method of moments and maximum likelihood estimates produced similar results, but the least squares estimates were very different from the other two.
import java.text.*;
import com.imsl.stat.*;
import com.imsl.math.*;
public class ARMAMaxLikelihoodEx1 {
public static void main(String args[]) throws Exception {
int backwardOrigin = 0, n_forecast = 10, n_series = 100;
double[] sunspots = {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};
double[] z = null;
double arMM[], maMM[], constantMM;
double arLS[], maLS[], constantLS;
double ar[], ma[], constant;
double forecastMM[][], forecastLS[][], forecast[][];
double deviations[];
double likelihood, var, varMM, varLS;
double[] avgDev = {0.0, 0.0, 0.0};
double sum=0;
ARMA armaMM = null;
ARMA armaLS = null;
ARMAMaxLikelihood maxArma = null;
double[][] printOutput = null;
double[][] printOutput2 = null;
String title="ARMA(p=2, q=1)";
String[] colLabels = {
"Method of Moments",
"Least Squares",
"Maximum Likelihood"};
String[] colLabels1 = {
"Least Squares",
"Maximum Likelihood"};
String[] colLabels2 = {
"Observed Sunspots",
"Method of Moments",
"Least Squares",
"Maximum Likelihood"};
String[] colLabels3 = {
"Lower Confidence Limit",
"Forecast",
"Upper Confidence Limit"};
PrintMatrixFormat pmf = new PrintMatrixFormat();
PrintMatrix pm = new PrintMatrix();
NumberFormat nf = NumberFormat.getNumberInstance();
pm.setColumnSpacing(3);
nf.setMinimumFractionDigits(3);
pmf.setNoRowLabels();
pmf.setNumberFormat(nf);
pmf.setColumnLabels(colLabels);
printOutput = new double[1][3];
printOutput2 = new double[n_forecast][4];
z = new double[n_series];
for(int i=0; i<n_series; i++) z[i] = sunspots[i];
/* Method of Moments ARMA(2,1) Estimation */
armaMM = new ARMA(2,1, z);
armaMM.setMethod(ARMA.METHOD_OF_MOMENTS);
armaMM.compute();
armaMM.setBackwardOrigin(backwardOrigin);
arMM = armaMM.getAR();
maMM = armaMM.getMA();
constantMM = armaMM.getConstant();
forecastMM = armaMM.forecast(n_forecast);
varMM = armaMM.getInnovationVariance();
/* Least Squares ARMA(2,1) Estimation */
armaLS = new ARMA(2,1, z);
armaLS.setMethod(ARMA.LEAST_SQUARES);
armaLS.compute();
armaLS.setBackwardOrigin(backwardOrigin);
arLS = armaLS.getAR();
maLS = armaLS.getMA();
constantLS = armaLS.getConstant();
varLS = armaLS.getInnovationVariance();
forecastLS = armaLS.forecast(n_forecast);
/* Maximum Likelihood ARMA(2,1) Estimation */
maxArma = new ARMAMaxLikelihood(2, 1, z);
maxArma.compute();
maxArma.setBackwardOrigin(backwardOrigin);
ar = maxArma.getAR();
ma = maxArma.getMA();
constant = maxArma.getConstant();
likelihood = maxArma.getLikelihood();
var = maxArma.getInnovationVariance();
maxArma.setConfidence(0.9);
forecast = maxArma.forecast(n_forecast);
deviations = maxArma.getDeviations();
printOutput[0][0] = constantMM;
printOutput[0][1] = constantLS;
printOutput[0][2] = constant;
pm.setTitle("ARMA(2,1) - Constant Term");
pm.print(pmf, printOutput);
printOutput[0][0] = arMM[0];
printOutput[0][1] = arLS[0];
printOutput[0][2] = ar[0];
pm.setTitle("ARMA(2,1) - AR(1) Coefficient");
pm.print(pmf, printOutput);
printOutput[0][0] = arMM[1];
printOutput[0][1] = arLS[1];
printOutput[0][2] = ar[1];
pm.setTitle("ARMA(2,1) - AR(2) Coefficient");
pm.print(pmf, printOutput);
printOutput[0][0] = maMM[0];
printOutput[0][1] = maLS[0];
printOutput[0][2] = ma[0];
pm.setTitle("ARMA(2,1) - MA(1) Coefficient");
pm.print(pmf, printOutput);
System.out.println("INNOVATION VARIANCE:");
System.out.println("Method of Moments "+varMM);
System.out.println("Least Squares "+varLS);
System.out.println("Maximum Likelihood "+var);
System.out.println("");
for(int i=0; i<n_forecast; i++){
printOutput2[i][0] = sunspots[90+i];
printOutput2[i][1] = forecastMM[i][backwardOrigin];
printOutput2[i][2] = forecastLS[i][backwardOrigin];
printOutput2[i][3] = forecast[i][backwardOrigin];
}
pm.setTitle("SUNSPOT FORECASTS FOR 1860-1869");
nf.setMaximumFractionDigits(0);
pmf.setNumberFormat(nf);
pmf.setColumnLabels(colLabels2);
pmf.setFirstRowNumber(1860);
pm.print(pmf, printOutput2);
/* Get Confidence Interval Deviations */
printOutput2 = new double[n_forecast][3];
for(int i=0; i<n_forecast; i++){
printOutput2[i][0] = Math.max(0,
forecast[i][backwardOrigin] - deviations[i+backwardOrigin]);
printOutput2[i][1] = forecast[i][backwardOrigin];
printOutput2[i][2] = forecast[i][backwardOrigin] + deviations[i];
}
nf.setMaximumFractionDigits(0);
pmf.setNumberFormat(nf);
pmf.setColumnLabels(colLabels3);
pmf.setFirstRowNumber(1860);
pm.setTitle("SUNSPOT MAX. LIKELIHOOD 90% CONFIDENCE INTERVALS");
pm.print(pmf, printOutput2);
}
}
ARMA(2,1) - Constant Term
Method of Moments Least Squares Maximum Likelihood
15.544 17.932 15.758
ARMA(2,1) - AR(1) Coefficient
Method of Moments Least Squares Maximum Likelihood
1.244 1.531 1.225
ARMA(2,1) - AR(2) Coefficient
Method of Moments Least Squares Maximum Likelihood
-0.575 -0.894 -0.561
ARMA(2,1) - MA(1) Coefficient
Method of Moments Least Squares Maximum Likelihood
-0.124 -0.132 -0.383
INNOVATION VARIANCE:
Method of Moments 287.2424037381216
Least Squares 239.68797223858988
Maximum Likelihood 214.5087884256287
SUNSPOT FORECASTS FOR 1860-1869
Observed Sunspots Method of Moments Least Squares Maximum Likelihood
1860 96 86 98 85
1861 77 80 101 79
1862 59 66 86 65
1863 44 51 59 51
1864 47 42 31 42
1865 30 38 13 38
1866 16 39 10 39
1867 7 42 22 43
1868 37 45 42 46
1869 74 48 63 48
SUNSPOT MAX. LIKELIHOOD 90% CONFIDENCE INTERVALS
Lower Confidence Limit Forecast Upper Confidence Limit
1860 61 85 109
1861 33 79 125
1862 8 65 121
1863 0 51 111
1864 0 42 102
1865 0 38 99
1866 0 39 101
1867 0 43 104
1868 0 46 108
1869 0 48 110
Link to Java source.