C++ - Calculate Covariance and Correlation
Mean, Variance and Standard Deviation are widely used in statistical application for single series. If we have two sets of series, then we may need covariance and correlation to find the relationship between the two. It is a good idea to start writing program in C++ on this.
To calculate covariance between two sets of series, we need to multiply the difference between its mean for each term for the two series and add each term resultant value. Finally divide by N - number of terms in the series.
Correlation coefficient is the ratio between the covariance and the multiplication of the standard deviation for the two series. The range for correlation is always between -1 to +1.
The complete program compatible in Turbo C++ and Visual C++ Compilers and test run output are given below:
Source Code
#include <stdio.h>
#include <math.h>
class StdDeviation
{
private:
int max;
double value[100];
double mean;
public:
double CalculateMean()
{
double sum = 0;
for(int i = 0; i < max; i++)
sum += value[i];
return (sum / max);
}
double CalculateVariane()
{
mean = CalculateMean();
double temp = 0;
for(int i = 0; i < max; i++)
{
temp += (value[i] - mean) * (value[i] - mean) ;
}
return temp / max;
}
double CalculateSampleVariane()
{
mean = CalculateMean();
double temp = 0;
for(int i = 0; i < max; i++)
{
temp += (value[i] - mean) * (value[i] - mean) ;
}
return temp / (max - 1);
}
int SetValues(double *p, int count)
{
if(count > 100)
return -1;
max = count;
for(int i = 0; i < count; i++)
value[i] = p[i];
return 0;
}
double Calculate_StandardDeviation()
{
return sqrt(CalculateVariane());
}
double Calculate_SampleStandardDeviation()
{
return sqrt(CalculateSampleVariane());
}
};
class FinanceCalculator
{
private:
double XSeries[100];
double YSeries[100];
int max;
StdDeviation x;
StdDeviation y;
public:
void SetValues(double *xvalues, double *yvalues, int count)
{
for(int i = 0; i < count; i++)
{
XSeries[i] = xvalues[i];
YSeries[i] = yvalues[i];
}
x.SetValues(xvalues, count);
y.SetValues(yvalues, count);
max = count;
}
double Calculate_Covariance()
{
double xmean = x.CalculateMean();
double ymean = y.CalculateMean();
double total = 0;
for(int i = 0; i < max; i++)
{
total += (XSeries[i] - xmean) * (YSeries[i] - ymean);
}
return total / max;
}
double Calculate_Correlation()
{
double cov = Calculate_Covariance();
double correlation = cov / (x.Calculate_StandardDeviation() * y.Calculate_StandardDeviation());
return correlation;
}
};
void main()
{
FinanceCalculator calc;
{
printf("\n\nZero Correlation and Covariance Data Set\n");
double xarr[] = { 8, 6, 4, 6, 8 };
double yarr[] = { 10, 12, 14, 16, 18 };
calc.SetValues(xarr,yarr,sizeof(xarr) / sizeof(xarr[0]));
printf("Covariance = %.10lf\n", calc.Calculate_Covariance());
printf("Correlation = %.10lf\n", calc.Calculate_Correlation());
}
{
printf("\n\nPositive Correlation and Low Covariance Data Set\n");
double xarr[] = { 0, 2, 4, 6, 8 };
double yarr[] = { 6, 13, 15, 16, 20 };
calc.SetValues(xarr,yarr,sizeof(xarr) / sizeof(xarr[0]));
printf("Covariance = %.10lf\n", calc.Calculate_Covariance());
printf("Correlation = %.10lf\n", calc.Calculate_Correlation());
}
{
printf("\n\nNegative Correlation and Low Covariance Data Set\n");
double xarr[] = { 8, 6, 4, 2, 0 };
double yarr[] = { 6, 13, 15, 16, 20 };
calc.SetValues(xarr,yarr,sizeof(xarr) / sizeof(xarr[0]));
printf("Covariance = %.10lf\n", calc.Calculate_Covariance());
printf("Correlation = %.10lf\n", calc.Calculate_Correlation());
}
{
printf("\n\nPositive Correlation and High Covariance Data Set\n");
double xarr[] = { 8, 6, 4, 2, 0 };
double yarr[] = { 1006, 513, 315, 216, 120 };
calc.SetValues(xarr,yarr,sizeof(xarr) / sizeof(xarr[0]));
printf("Covariance = %.10lf\n", calc.Calculate_Covariance());
printf("Correlation = %.10lf\n", calc.Calculate_Correlation());
}
{
printf("\n\nNegative Correlation and High Covariance Data Set\n");
double xarr[] = { 8, 6, 4, 2, 0 };
double yarr[] = { 120, 216, 315, 513, 1006 };
calc.SetValues(xarr,yarr,sizeof(xarr) / sizeof(xarr[0]));
printf("Covariance = %.10lf\n", calc.Calculate_Covariance());
printf("Correlation = %.10lf\n", calc.Calculate_Correlation());
}
}
Output
Zero Correlation and Covariance Data Set
Covariance = 0.0000000000
Correlation = 0.0000000000
Positive Correlation and Low Covariance Data Set
Covariance = 12.4000000000
Correlation = 0.9521574311
Negative Correlation and Low Covariance Data Set
Covariance = -12.4000000000
Correlation = -0.9521574311
Positive Correlation and High Covariance Data Set
Covariance = 827.6000000000
Correlation = 0.9311642376
Negative Correlation and High Covariance Data Set
Covariance = -827.6000000000
Correlation = -0.9311642376
|