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
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);
}
}
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.