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
7 Source Code
NoteImplementation
File: inst/include/hdf5Algebra/matrixCorrelation.hpp • Lines 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(...);