int main(){ std::vector<double> const array1{ 1.2, 2.0, 2.5, 4.0, 3.0, 6.0, 5.5, 6.3, 7.1, 5.4 }; std::vector<double> const array2{ 3.4, 3.3, 3.0, 5.5, 1.2, 2.4, 3.2, 3.1, 2.9, 3.2 }; { double const covarianceValue = covariance<double>( array1, array2 ); assert(feq(covarianceValue, -0.108889)); } { double const covarianceValue = gsl_stats_covariance( &array1.front(), 1, &array2.front(), 1, array2.size() ); assert(feq(covarianceValue, -0.108889)); } }
CAMLprim value ml_gsl_stats_covariance(value data1, value data2) { size_t len = Double_array_length(data1); double result; check_array_size(data1, data2); result = gsl_stats_covariance(Double_array_val(data1), 1, Double_array_val(data2), 1, len); return copy_double(result); }
double correlation(double *X, double *Y, int count) /* Compute the correlation between X and Y correlation(X,Y) = cov(X,Y)/ squareRt(var(X)var(Y)) page 332 Sheldon Ross "A First Course in Probability" 1998 */ { double varX = gsl_stats_variance(X, 1, count); double varY = gsl_stats_variance(Y, 1, count); double covXY = gsl_stats_covariance(X, 1, Y, 1, count); double correlation = covXY / sqrt(varX *varY); return correlation; }
/* Example from R (GPL): http://www.r-project.org/ * (samples <- matrix(c(4.348817, 2.995049, -3.793431, 4.711934, 1.190864, -1.357363), nrow=3, ncol=2)) * cov(samples) # 19.03539 11.91384 \n 11.91384 9.28796 */ static int multivar_vcov (const double data[], size_t d, size_t tda, size_t n, double vcov[], size_t tda2) { size_t j1 = 0, j2 = 0; for (j1 = 0; j1 < d; ++j1) { vcov[j1 * tda2 + j1] = gsl_stats_variance(&(data[j1]), tda, n); for (j2 = j1 + 1; j2 < d; ++j2) { vcov[j1 * tda2 + j2] = gsl_stats_covariance(&(data[j1]), tda, &(data[j2]), tda, n); vcov[j2 * tda2 + j1] = vcov[j1 * tda2 + j2]; } } return GSL_SUCCESS; }