Source code for bioverse.metrics.spearmans_rho

import awkward as ak
import numpy as np

from ..metric import Metric


[docs] class SpearmansRhoMetric(Metric): """Spearman rank correlation between predictions and targets.""" better = "higher" def __init__(self, name="Spearman", **kwargs): super().__init__(name=name, **kwargs) def compute(self, y_true, y_pred): y_true = ak.to_numpy(ak.ravel(y_true)) y_pred = ak.to_numpy(ak.ravel(y_pred)) def rank(values): order = np.argsort(values, kind="mergesort") ranks = np.empty_like(order, dtype=np.float64) ranks[order] = np.arange(1, len(values) + 1, dtype=np.float64) return ranks y_true_rank = rank(y_true) y_pred_rank = rank(y_pred) d = y_true_rank - y_pred_rank n = len(y_true) if n < 2: return float("nan") return float(1 - 6 * np.sum(d * d) / (n * (n * n - 1)))