ARIMA Models in C# QuickStart Sample
Illustrates how to work with ARIMA time series models using classes in the Numerics.NET.Statistics.TimeSeriesAnalysis namespace in C#.
View this sample in: Visual Basic F# IronPython
using System;
using Numerics.NET;
using Numerics.NET.Statistics;
using Numerics.NET.Statistics.TimeSeriesAnalysis;
namespace Numerics.NET.QuickStart.CSharp {
/// <summary>
/// Illustrates the use of the ArimaModel class to perform
/// estimation and forecasting of ARIMA time series models..
/// </summary>
class ArimaModels {
static void Main(string[] args) {
// The license is verified at runtime. We're using
// a 30 day trial key here. For more information, see
// https://numerics.net/trial-key
Numerics.NET.License.Verify("64542-18980-57619-62268");
// This QuickStart Sample fits an ARMA(2,1) model and
// an ARIMA(0,1,1) model to sunspot data.
// The time series data is stored in a numerical variable:
var sunspots = Vector.Create(new double[] {
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});
// ARMA models (no differencing) are constructed from
// the variable containing the time series data, and the
// AR and MA orders. The following constructs an ARMA(2,1)
// model:
ArimaModel model = new ArimaModel(sunspots, 2, 1);
// The Fit methods fits the model.
model.Fit();
// The model's Parameters collection contains the fitted values.
// For an ARIMA(p,d,q) model, the first p parameters are the
// auto-regressive parameters. The last q parametere are the
// moving average parameters.
Console.WriteLine("Variable Value Std.Error t-stat p-Value");
foreach (var parameter in model.Parameters)
// Parameter objects have the following properties:
Console.WriteLine("{0,-20}{1,10:F5}{2,10:F5}{3,8:F2} {4,7:F4}",
// Name, usually the name of the variable:
parameter.Name,
// Estimated value of the parameter:
parameter.Value,
// Standard error:
parameter.StandardError,
// The value of the t statistic for the hypothesis that the parameter
// is zero.
parameter.Statistic,
// Probability corresponding to the t statistic.
parameter.PValue);
// The log-likelihood of the computed solution is also available:
Console.WriteLine($"Log-likelihood: {model.LogLikelihood:F4}");
// as is the Akaike Information Criterion (AIC):
Console.WriteLine($"AIC: {model.GetAkaikeInformationCriterion():F4}");
// and the Baysian Information Criterion (BIC):
Console.WriteLine($"BIC: {model.GetBayesianInformationCriterion():F4}");
// The Forecast method can be used to predict the next value in the series...
double nextValue = model.Forecast();
Console.WriteLine($"One step ahead forecast: {nextValue:F3}");
// or to predict a specified number of values:
var nextValues = model.Forecast(5);
Console.WriteLine($"First five forecasts: {nextValues:F3}");
// An integrated model (with differencing) is constructed
// by supplying the degree of differencing. Note the order
// of the orders is the traditional one for an ARIMA(p,d,q)
// model (p, d, q).
// The following constructs an ARIMA(0,1,1) model:
ArimaModel model2 = new ArimaModel(sunspots, 0, 1, 1);
// By default, the mean is assumed to be zero for an integrated model.
// We can override this by setting the EstimateMean property to true:
model2.EstimateMean = true;
// The Compute methods fits the model.
model2.Fit();
Console.WriteLine(model2.Summarize());
// The mean shows up as one of the parameters.
Console.WriteLine("Variable Value Std.Error t-stat p-Value");
foreach (var parameter in model2.Parameters)
Console.WriteLine("{0,-20}{1,10:F5}{2,10:F5}{3,8:F2} {4,7:F4}",
parameter.Name,
parameter.Value,
parameter.StandardError,
parameter.Statistic,
parameter.PValue);
// We can also get the error variance:
Console.WriteLine($"Error variance: {model2.ErrorVariance:F4}");
Console.WriteLine($"Log-likelihood: {model2.LogLikelihood:F4}");
Console.WriteLine($"AIC: {model2.GetAkaikeInformationCriterion():F4}");
Console.WriteLine($"BIC: {model2.GetBayesianInformationCriterion():F4}");
Console.Write("Press any key to exit.");
Console.ReadLine();
}
}
}