Source code for mhm_tools.common.metrics.mspaef

"""
Calculate the modified SPAtial EFficiency metric.

Based on:
Andreas Karpasitis, Panos Hadjinicolaou, and George Zittis
A new efficiency metric for the spatial evaluation and inter-comparison of climate and geoscientific model output
Geoscientific Model Development 19, https://doi.org/10.5194/gmd-19-345-2026, 2026

Implementation based on:
Karpasitis, A.: Code for the MSPAEF metric, Zenodo [code], https://doi.org/10.5281/zenodo.15094921, 2025. a

Authors
-------
- Simon Lüdke
"""

import numpy as np

from mhm_tools.common.metrics.spaef import filter_nan


[docs] def MSPAEF(s, o): """Calculate MSPAEF and its normalized error components.""" s, o = filter_nan(s, o) q75, q25 = np.percentile(o, [75, 25]) iqr = q75 - q25 nrmse = np.sqrt(np.mean((s - o) ** 2)) / iqr sigma = np.std(s) / np.std(o) sigma_error = np.sqrt((sigma**2 - 1) ** 2 + (1 / sigma**2 - 1) ** 2) mean_bias = np.abs(np.mean(s) - np.mean(o)) / iqr rho = np.corrcoef(s, o)[0, 1] mspaef_error = np.sqrt( nrmse**2 + sigma_error**2 + mean_bias**2 + (1 - rho) ** 2 ) / np.sqrt(4) mspaef = 1 - mspaef_error return mspaef, nrmse, sigma, sigma_error, mean_bias, rho