using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BotSharp.Algorithm.HiddenMarkovModel.MathUtils.Statistics
{
///
/// Correlation: strength of a linear relationship.
///
/// Correleation, which always taks values between -1 and 1, describse the strength of the lienar relationship between two variables.
/// We denote the correlation by R.
///
/// Only when the relationship is perfectly linear is the correlation either -1 or +1.
/// If the relationship is strong and positive, the correlation will be near +1
/// If the relationship is strong and negative, the correlation will be near -1
/// If there is no apparent linear relationship between the variables, then the correlation will be near zero.
///
public class Correlation
{
///
/// Return the correlation for observations (x_1, y_1), (x_2, y_2), ... (x_n, y_n), where n is the sample size
/// The correlation is computed as correlation(x, y) = sum_i((x_i - mu_x) * (y_i - mu_y)) / (sum_i((x_i - mu_x)^2) * sum_i((y_i - mu_y)^2))
/// which can also be written as n * sum_i((x_i - mu_x) * (y_i - mu_y) / (sigma_x * sigma_y))
/// where mu_x = sum_i(x_i) / n and sigma_x = sqrt(sum_i((x_i - mu_x)^2) / n)
///
/// The observations (x_1, y_1), (x_2, y_2), ... (x_n, y_n), where n is the sample size
/// The correlation value for variable x and y
public double GetCorrelation(Tuple[] observations)
{
int n = observations.Length;
double[] x = new double[n];
double[] y = new double[n];
for (int i = 0; i < n; ++i)
{
x[i] = observations[i].Item1;
y[i] = observations[i].Item2;
}
double mu_x = Mean.GetMean(x);
double mu_y = Mean.GetMean(y);
double sigma_x = StdDev.GetStdDev(x, mu_x);
double sigma_y = StdDev.GetStdDev(y, mu_y);
double sum = 0;
for (int i = 0; i < n; ++i)
{
sum += ((x[i] - mu_x) / sigma_x) * ((y[i] - mu_y) / sigma_y);
}
return sum / n;
}
}
}