internal static Matrix CovarianceMatrixSerialCorrelationCorrected(double[] array1, double[] array2, double decayFactor, int length)
        {
            double[] array1Len = Tools.MostRecentValues(array1, length);
            double[] array2Len = Tools.MostRecentValues(array2, length);
            double[] array1Lag = Tools.LagArray(array1, length, 1);
            double[] array2Lag = Tools.LagArray(array2, length, 1);

            double[,] lagArray = new double[length, 2];
            for (int i = 0; i < length; i++)
            {
                lagArray[i, 0] = array1Lag[i];
                lagArray[i, 1] = array2Lag[i];
            }
            WeightedLeastSquares wls1 = new WeightedLeastSquares(array1Len, lagArray, true, decayFactor);
            WeightedLeastSquares wls2 = new WeightedLeastSquares(array2Len, lagArray, true, decayFactor);
            Matrix D = new Matrix(2, 2);

            D[0, 0] = wls1.Betas[1].Value;
            D[0, 1] = wls1.Betas[2].Value;
            D[1, 0] = wls2.Betas[1].Value;
            D[1, 1] = wls2.Betas[2].Value;

            Matrix C = new Matrix(2, 2);

            C[0, 0] = Variance(array1Len, decayFactor);
            C[0, 1] = Covariance(array1Len, array2Len, decayFactor);
            C[1, 0] = C[0, 1];
            C[1, 1] = Variance(array2Len, decayFactor);

            Matrix M     = SerialCorrelationCorrection.SerialCorrelationVarianceCorrection(D, C);
            Matrix CStar = M.Multiply(C);

            return(CStar);
        }
        internal static Matrix CovarianceMatrixSerialCorrelationCorrected(double[] array1, double[] array2, double decayFactor, int length)
        {
            double[] array1Len = Tools.MostRecentValues(array1, length);
            double[] array2Len = Tools.MostRecentValues(array2, length);
            double[] array1Lag = Tools.LagArray(array1, length, 1);
            double[] array2Lag = Tools.LagArray(array2, length, 1);

            double[,] lagArray = new double[length, 2];
            for (int i = 0; i < length; i++)
            {
                lagArray[i, 0] = array1Lag[i];
                lagArray[i, 1] = array2Lag[i];
            }
            WeightedLeastSquares wls1 = new WeightedLeastSquares(array1Len, lagArray, true, decayFactor);
            WeightedLeastSquares wls2 = new WeightedLeastSquares(array2Len, lagArray, true, decayFactor);
            Matrix D = new Matrix(2, 2);
            D[0, 0] = wls1.Betas[1].Value;
            D[0, 1] = wls1.Betas[2].Value;
            D[1, 0] = wls2.Betas[1].Value;
            D[1, 1] = wls2.Betas[2].Value;

            Matrix C = new Matrix(2, 2);
            C[0, 0] = Variance(array1Len, decayFactor);
            C[0, 1] = Covariance(array1Len, array2Len, decayFactor);
            C[1, 0] = C[0, 1];
            C[1, 1] = Variance(array2Len, decayFactor);

            Matrix M = SerialCorrelationCorrection.SerialCorrelationVarianceCorrection(D, C);
            Matrix CStar = M.Multiply(C);
            return CStar;
        }