compute_pvalues_optimized

C++ Function Reference

1 Signature

Eigen::MatrixXd BigDataStatMeth::compute_pvalues_optimized(const Eigen::MatrixXd &correlation_matrix, int n_obs, bool symmetric=true)

2 Description

Optimized p-value computation for correlation matrices using Eigen.

3 Parameters

  • correlation_matrix (const Eigen::MatrixXd &)
  • n_obs (int)
  • symmetric (bool)

4 Returns

Type: Eigen::MatrixXd

5 Details

Uses vectorized Eigen operations for maximum performance:cwiseAbs2() for r² computationcwiseSqrt() for square root operations cwiseQuotient() for element-wise divisionunaryExpr() for applying t-distribution CDF

6 Call Graph

Function dependencies

7 Source Code

File: inst/include/hdf5Algebra/matrixCorrelation.hppLines 384-433

inline Eigen::MatrixXd compute_pvalues_optimized(const Eigen::MatrixXd& correlation_matrix, 
                                                     int n_obs, 
                                                     bool symmetric = true) {
        
        if (n_obs < 3) {
            return Eigen::MatrixXd::Constant(correlation_matrix.rows(), correlation_matrix.cols(), 
                                             std::numeric_limits<double>::quiet_NaN());
        }
        
        double df = n_obs - 2;
        double sqrt_df = std::sqrt(df);
        
        // Vectorized computation using Eigen operations
        // Step 1: Compute r² for entire matrix
        Eigen::MatrixXd r_squared = correlation_matrix.cwiseAbs2();
        
        // Step 2: Compute 1 - r² and take square root
        Eigen::MatrixXd one_minus_r_squared = 
            (Eigen::MatrixXd::Ones(r_squared.rows(), r_squared.cols()) - r_squared);
        Eigen::MatrixXd denominator = one_minus_r_squared.cwiseSqrt();
        
        // Step 3: Compute t-statistics vectorized: t = |r| * sqrt(df) / sqrt(1 - r²)
        Eigen::MatrixXd abs_correlations = correlation_matrix.cwiseAbs();
        Eigen::MatrixXd t_stats = (abs_correlations * sqrt_df).cwiseQuotient(denominator);
        
        // Step 4: Handle diagonal for symmetric matrices
        if (symmetric) {
            t_stats.diagonal().setConstant(std::numeric_limits<double>::quiet_NaN());
        }
        
        // Step 5: Apply t-distribution CDF and compute p-values using unaryExpr
        Eigen::MatrixXd pvalues = t_stats.unaryExpr([df](double t_val) -> double {
            if (std::isnan(t_val) || std::isinf(t_val)) {
                return std::numeric_limits<double>::quiet_NaN();
            }
            
            double cdf_value = t_distribution_cdf(t_val, df);
            double p_value = 2.0 * (1.0 - cdf_value);
            return std::max(0.0, std::min(1.0, p_value));
        });
        
        // Step 6: Ensure symmetry and set diagonal to 1.0 for symmetric case
        if (symmetric) {
            // Use Eigen operations for symmetry
            pvalues = (pvalues + pvalues.transpose()) * 0.5;
            pvalues.diagonal().setOnes();
        }
        
        return pvalues;
    }

8 Usage Example

#include "BigDataStatMeth.hpp"

// Example usage
auto result = compute_pvalues_optimized(...);