From f3dcba201a14f71b6b761566c3273aae57b73b19 Mon Sep 17 00:00:00 2001 From: Donncha O'Toole Date: Wed, 30 Sep 2026 13:56:51 +0100 Subject: [PATCH 1/2] test(core): cover Q-statistic normalization --- tests/test_core.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/test_core.py b/tests/test_core.py index 20e6fc6..6c1a466 100755 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -375,6 +375,18 @@ def test_core_calculate_variogram_model(): assert_allclose(res, np.array([3.0, 2.0, 1.0]), 0.001, 0.001) +def test_q1_q2_use_number_of_epsilon_residuals(): + epsilon = np.array([1.0, 1.0]) + assert core.calcQ1(epsilon) == 1.0 + assert core.calcQ2(epsilon) == 1.0 + + +def test_q1_q2_single_residual_are_finite(): + epsilon = np.array([0.5]) + assert core.calcQ1(epsilon) == 0.5 + assert core.calcQ2(epsilon) == 0.25 + + def test_core_krige(): # Example 3.2 from Kitanidis data = np.array([[9.7, 47.6, 1.22], [43.8, 24.6, 2.822]]) From d67300d53fbf0e6b67776ed26f11f740398819a4 Mon Sep 17 00:00:00 2001 From: Donncha O'Toole Date: Wed, 30 Sep 2026 13:57:56 +0100 Subject: [PATCH 2/2] fix(core): normalize Q statistics by residual count --- src/pykrige/core.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pykrige/core.py b/src/pykrige/core.py index 30ae911..4d9fdb0 100755 --- a/src/pykrige/core.py +++ b/src/pykrige/core.py @@ -838,12 +838,12 @@ def _find_statistics( def calcQ1(epsilon): """Returns the Q1 statistic for the variogram fit (see [1]).""" - return abs(np.sum(epsilon) / (epsilon.shape[0] - 1)) + return abs(np.sum(epsilon) / epsilon.shape[0]) def calcQ2(epsilon): """Returns the Q2 statistic for the variogram fit (see [1]).""" - return np.sum(epsilon**2) / (epsilon.shape[0] - 1) + return np.sum(epsilon**2) / epsilon.shape[0] def calc_cR(Q2, sigma):