public static double[,] DiscretePartialAutocorrelation(double[,] x) { int length = x.Length; double[,] r = new double[1, length]; r[0, 0] = 1; r[0, 1] = DiscreteAutocorrelation(x)[0, 1]; for (int k = 2; k < length; k++) { double[,] Px = new double[length - k, k - 1]; double[,] PyL = new double[length - k, 1]; double[,] PyR = new double[length - k, 1]; for (int i = 0; i < length - k; i++) { for (int j = 0; j < k - 1; j++) { Px[i, j] = x[0, j + 1 + i]; } PyL[i, 0] = x[0, i]; PyR[i, 0] = x[0, i + k]; } r[0, k] = Matrix.Product( Matrix.Trans(Matrix.Subtract(PyL, Matrix.Product(Px, OrdinaryLeastSquares.Beta(Px, PyL)))), Matrix.Subtract(PyR, Matrix.Product(Px, OrdinaryLeastSquares.Beta(Px, PyR))) )[0, 0] / Math.Sqrt( Matrix.Product( Matrix.Product( Matrix.Trans(Matrix.Subtract(PyL, Matrix.Product(Px, OrdinaryLeastSquares.Beta(Px, PyL)))), Matrix.Subtract(PyL, Matrix.Product(Px, OrdinaryLeastSquares.Beta(Px, PyL))) ), Matrix.Product( Matrix.Trans(Matrix.Subtract(PyR, Matrix.Product(Px, OrdinaryLeastSquares.Beta(Px, PyR)))), Matrix.Subtract(PyR, Matrix.Product(Px, OrdinaryLeastSquares.Beta(Px, PyR))) ) )[0, 0]); } return(r); }