Example: ARMAMaxLikelihood

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

{\rm{\hat \theta }}_{\rm{0}} {\rm{,\hat \phi }}_{\rm{1}} {\rm{,\hat \phi }}_{\rm{2}} {\rm{, and \, \hat \theta }}_{\rm{1}}
are computed for the ARMA(2, 1) model
z_t = \theta _0 + \phi _1 z_{t - 1} + \phi _2 z_{t - 2} - \theta _1 A_{t - 1} + A_t
where the errors A_t are independently normally distributed with mean zero and variance \sigma_A^2. 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.

using System;
using Imsl.Stat;
using Imsl.Math;
public class ARMAMaxLikelihoodEx1
{
	
	public static void  Main(String[] args)
	{
		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;
		double constantMM;
		double[] arLS, maLS;
		double constantLS;
		double[] ar, ma;
		double constant;
		double[,] forecastMM, forecastLS, forecast;
		double[] deviations;
		double likelihood, var, varMM, varLS;
		double[] avgDev = new double[]{0.0, 0.0, 0.0};
		ARMA armaMM = null;
		ARMA armaLS = null;
		ARMAMaxLikelihood maxArma = null;
		double[,] printOutput = null;
		double[,] printOutput2 = null;
		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();
		pm.SetColumnSpacing(3);
		pmf.SetNoRowLabels();
		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.Method = Imsl.Stat.ARMA.ParamEstimation.MethodOfMoments;
		armaMM.Compute();
		armaMM.BackwardOrigin = backwardOrigin;
		arMM = armaMM.GetAR();
		maMM = armaMM.GetMA();
		constantMM = armaMM.Constant;
		forecastMM = armaMM.Forecast(n_forecast);
		varMM = armaMM.InnovationVariance;
		
		/* Least Squares ARMA(2,1) Estimation */
		armaLS = new ARMA(2, 1, z);
		armaLS.Method = Imsl.Stat.ARMA.ParamEstimation.LeastSquares;
        Imsl.WarningObject w = Imsl.Warning.WarningObject;
        Imsl.Warning.WarningObject = null;
		armaLS.Compute();
        Imsl.Warning.WarningObject = w;
        armaLS.BackwardOrigin = backwardOrigin;
		arLS = armaLS.GetAR();
		maLS = armaLS.GetMA();
		constantLS = armaLS.Constant;
		varLS = armaLS.InnovationVariance;
		forecastLS = armaLS.Forecast(n_forecast);
		
		/* Maximum Likelihood ARMA(2,1) Estimation */
		maxArma = new ARMAMaxLikelihood(2, 1, z);
		maxArma.Compute();
		maxArma.BackwardOrigin = backwardOrigin;
		ar = maxArma.GetAR();
		ma = maxArma.GetMA();
		constant = maxArma.Constant;
		likelihood = maxArma.Likelihood;
		var = maxArma.InnovationVariance;
		maxArma.Confidence = 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);
		Console.Out.WriteLine("INNOVATION VARIANCE:");
		Console.Out.WriteLine("Method of Moments  " + varMM);
		Console.Out.WriteLine("Least Squares      " + varLS);
		Console.Out.WriteLine("Maximum Likelihood " + var);
		Console.Out.WriteLine("");
		
		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");
		pmf.SetColumnLabels(colLabels2);
		pmf.FirstRowNumber = 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];
		}
		pmf.SetColumnLabels(colLabels3);
		pmf.FirstRowNumber = 1860;
		pm.SetTitle("SUNSPOT MAX. LIKELIHOOD 90% CONFIDENCE INTERVALS");
		pm.Print(pmf, printOutput2);
	}
}

Output

                   ARMA(2,1) - Constant Term
   Method of Moments     Least Squares    Maximum Likelihood   
15.5439819435637    17.9316722242554    15.7580039181538    

                 ARMA(2,1) - AR(1) Coefficient
   Method of Moments     Least Squares    Maximum Likelihood   
1.24425777984372    1.53128221858841    1.22506595122502    

                  ARMA(2,1) - AR(2) Coefficient
    Method of Moments      Least Squares     Maximum Likelihood   
-0.575149766040151   -0.894433318954122   -0.560513922915966   

                  ARMA(2,1) - MA(1) Coefficient
    Method of Moments      Least Squares     Maximum Likelihood   
-0.124089747872598   -0.132018760615022   -0.382891621972049   

INNOVATION VARIANCE:
Method of Moments  287.242403738122
Least Squares      239.68797223859
Maximum Likelihood 214.508788425648

                             SUNSPOT FORECASTS FOR 1860-1869
       Observed Sunspots   Method of Moments      Least Squares     Maximum Likelihood   
1860         95.7          86.0415456007167     97.7310653809498     85.3832083889174    
1861         77.2          80.0982767366663    101.486892575095      78.9360864182773    
1862         59.1          65.7201111032504     85.9228250706849     64.6014386269177    
1863         44            51.2482363506636     58.7305082695945     50.6542513222013    
1864         47            41.5110922009792     31.0124176242576     41.602796706989     
1865         30.5          37.7190702173874     12.8899124522828     38.3317605186442    
1866         16.3          38.6011335425551      9.93122633714127    39.3979917935465    
1867          7.3          41.8796282538917     21.6100153473733     42.5376567504899    
1868         37.3          45.451602289546      42.1398847350968     45.7863159128644    
1869         73.9          48.0104333066195     63.1310106626735     48.0063117181664    

              SUNSPOT MAX. LIKELIHOOD 90% CONFIDENCE INTERVALS
       Lower Confidence Limit       Forecast       Upper Confidence Limit   
1860     61.2924871798927       85.3832083889174     109.473929597942       
1861     33.3191270061225       78.9360864182773     124.553045830432       
1862      7.73627623921441      64.6014386269177     121.466601014621       
1863      0                     50.6542513222013     110.894582772018       
1864      0                     41.602796706989      102.078011452932       
1865      0                     38.3317605186442      98.9832086298742      
1866      0                     39.3979917935465     100.662416899195       
1867      0                     42.5376567504899     104.322287798477       
1868      0                     45.7863159128644     107.769387498973       
1869      0                     48.0063117181664     110.009690460371       


Link to C# source.