public double[] ArimaTest(int lag)
        {
            // The time series data is stored in a numerical variable:
            var sunspots = Vector.Create(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);

            //Find 'd'.
            AugmentedDickeyFullerTest adf = new AugmentedDickeyFullerTest(sunspots, 0);
            double d = adf.Statistic;
            // Console.WriteLine(d);
            // Console.WriteLine(adf.PValue);

            // 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 model = new ArimaModel(sunspots, 2, 1);

            model.EstimateMean = true;

            // The Compute methods fits the model.
            model.Fit();

            //Predict a specified number of values:
            var nextValues = model.Forecast(5);

            //Cast to double[].
            var castedNextValues = new double[nextValues.Length];

            for (var i = 0; i < nextValues.Length; i++)
            {
                castedNextValues[i] = nextValues[i];
            }

            return(castedNextValues);
        }
        public double[] Arima(int forecast, double[] values)
        {
            Vector <double> tempValues = Vector.Create(values);

            //Find 'd'.
            var adf = new AugmentedDickeyFullerTest(values, 0);
            var p   = adf.PValue;

            var acf = tempValues.AutocorrelationFunction(20);

            if (p > 0.05D)
            {
                p = 1;
            }

            tempValues = tempValues.Difference();

            // 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).
            var model = new ArimaModel(values, (int)p, 3, 3);

            model.EstimateMean = true;

            // The Compute methods fits the model.
            model.Fit();

            //Predict a specified number of values:
            var nextValues = model.Forecast(forecast);

            //Cast to double[].
            var castedNextValues = new double[nextValues.Length];

            for (var i = 0; i < nextValues.Length; i++)
            {
                castedNextValues[i] = nextValues[i];
            }

            // return castedNextValues;
            return(castedNextValues);
        }