spearman_correlation
C++ Function Reference
1 Signature
double BigDataStatMeth::spearman_correlation(const Eigen::VectorXd &x, const Eigen::VectorXd &y, bool use_complete_obs=true)2 Parameters
x(const Eigen::VectorXd &)y(const Eigen::VectorXd &)use_complete_obs(bool)
3 Returns
Type: double
4 Call Graph
5 Source Code
NoteImplementation
File: inst/include/hdf5Algebra/matrixCorrelation.hpp • Lines 591-642
inline double spearman_correlation(const Eigen::VectorXd& x,
const Eigen::VectorXd& y,
bool use_complete_obs = true)
{
if (x.size() != y.size()) return (std::numeric_limits<double>::quiet_NaN());
std::vector<double> x_valid, y_valid;
int n = x.size();
if (use_complete_obs) {
x_valid.reserve(n);
y_valid.reserve(n);
for (int i = 0; i < n; ++i) {
if (std::isfinite(x(i)) && std::isfinite(y(i))) {
x_valid.push_back(x(i));
y_valid.push_back(y(i));
}
}
} else {
x_valid.assign(x.data(), x.data() + n);
y_valid.assign(y.data(), y.data() + n);
}
if (x_valid.size() < 3) return (std::numeric_limits<double>::quiet_NaN());
// Efficient ranking using indices
auto rank_vector = [](const std::vector<double>& data) -> Eigen::VectorXd {
int n = data.size();
std::vector<std::pair<double, int>> indexed_data(n);
for (int i = 0; i < n; ++i) {
indexed_data[i] = {data[i], i};
}
std::sort(indexed_data.begin(), indexed_data.end());
Eigen::VectorXd ranks(n);
for (int i = 0; i < n; ++i) {
ranks[indexed_data[i].second] = i + 1;
}
return ranks;
};
Eigen::VectorXd rank_x = rank_vector(x_valid);
Eigen::VectorXd rank_y = rank_vector(y_valid);
// Compute Pearson correlation of ranks
return pearson_correlation(rank_x, rank_y, false);
}6 Usage Example
#include "BigDataStatMeth.hpp"
// Example usage
auto result = spearman_correlation(...);