/// <summary> /// Calculates a Costa Soares correlation coefficient between this and /// another set of numbers. /// </summary> /// <param name="s">Second set of numbers</param> /// <param name="limitRank">Exclude pairs where both rank below this limit</param> /// <returns>Correlation coefficient</returns> public double CostaSoares(Statistics s, int limitRank) { if (Length != s.Length) return double.NaN; int n = Length; int[] a = Rank(true); int[] b = s.Rank(true); a = FixZeroRanks(a, s, b); b = s.FixZeroRanks(b, this, a); double total = 0; for (int i = 0; i < n; i++) { if (a[i] <= limitRank || b[i] <= limitRank) total += Math.Pow(a[i] - b[i], 2) * ((n - a[i] + 1) + (n - b[i] + 1)); } double n2 = n * n; double n3 = n * n2; double n4 = n * n3; total *= 6.0 / (n4 + n3 - n2 - n); total = 1 - total; return total; }