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

Function dependencies

5 Source Code

File: inst/include/hdf5Algebra/matrixCorrelation.hppLines 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(...);