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 88 98 88 1861 77 82 102 82 1862 59 67 86 67 1863 44 52 59 52 1864 47 42 31 42 1865 30 37 13 38 1866 16 38 10 39 1867 7 41 21 42 1868 37 45 42 45 1869 74 48 63 48 SUNSPOT MAX. LIKELIHOOD 90% CONFIDENCE INTERVALS Lower Confidence Limit Forecast Upper Confidence Limit 1860 64 88 112 1861 36 82 128 1862 10 67 124 1863 0 52 112 1864 0 42 102 1865 0 38 98 1866 0 39 100 1867 0 42 104 1868 0 45 107 1869 0 48 110Link to Java source.