From 65ffe273b0e2b3f28cb2574434e420644446cff6 Mon Sep 17 00:00:00 2001 From: Francesco Serafini Date: Tue, 15 Oct 2024 11:15:32 +0100 Subject: [PATCH 1/7] Correction to M-test with resampling, and addition of new MLL test --- csep/core/catalog_evaluations.py | 350 ++++++++++++++++++++++++++++++- csep/utils/stats.py | 37 ++++ tests/test_magnitude_tests.py | 38 ++++ 3 files changed, 423 insertions(+), 2 deletions(-) create mode 100644 tests/test_magnitude_tests.py diff --git a/csep/core/catalog_evaluations.py b/csep/core/catalog_evaluations.py index 214ceca0..296cb3d6 100644 --- a/csep/core/catalog_evaluations.py +++ b/csep/core/catalog_evaluations.py @@ -1,11 +1,14 @@ -# Third-Party Imports +# Python imports import time +from typing import Optional, TYPE_CHECKING +# Third-Party Imports import numpy import scipy.stats # PyCSEP imports from csep.core.exceptions import CSEPEvaluationException +from csep.core.catalogs import CSEPCatalog from csep.models import ( CatalogNumberTestResult, CatalogSpatialTestResult, @@ -14,7 +17,10 @@ CalibrationTestResult ) from csep.utils.calc import _compute_likelihood -from csep.utils.stats import get_quantiles, cumulative_square_diff +from csep.utils.stats import get_quantiles, cumulative_square_diff, MLL_score + +if TYPE_CHECKING: + from csep.core.forecasts import CatalogForecast def number_test(forecast, observed_catalog, verbose=True): @@ -55,6 +61,7 @@ def number_test(forecast, observed_catalog, verbose=True): obs_name=observed_catalog.name) return result + def spatial_test(forecast, observed_catalog, verbose=True): """ Performs spatial test for catalog-based forecasts. @@ -140,6 +147,7 @@ def spatial_test(forecast, observed_catalog, verbose=True): return result + def magnitude_test(forecast, observed_catalog, verbose=True): """ Performs magnitude test for catalog-based forecasts """ test_distribution = [] @@ -215,6 +223,7 @@ def magnitude_test(forecast, observed_catalog, verbose=True): return result + def pseudolikelihood_test(forecast, observed_catalog, verbose=True): """ Performs the spatial pseudolikelihood test for catalog forecasts. @@ -310,6 +319,7 @@ def pseudolikelihood_test(forecast, observed_catalog, verbose=True): return result + def calibration_test(evaluation_results, delta_1=False): """ Perform the calibration test by computing a Kilmogorov-Smirnov test of the observed quantiles against a uniform distribution. @@ -345,3 +355,339 @@ def calibration_test(evaluation_results, delta_1=False): return result +def resampled_magnitude_test(forecast: "CatalogForecast", + observed_catalog: CSEPCatalog, + mag_half_bin: float = 0.05, + verbose: bool = False, + seed: Optional[int] = None) -> CatalogMagnitudeTestResult: + """ + Performs the resampled magnitude test for catalog-based forecasts (Serafini et al., 2024), + which corrects the bias from the original M-test implementation to the total N of events. + Calculates the pseudo log-likelihood distribution from the synthetic catalog Λ_j as: + + D_j = Σ_k [log(Λ_U(k) / N_U + 1) - log(Λ_j(k) / N_j + 1)]^2 + + where k are the magnitude bins, Λ_U the union of all synthetic catalogs, N_U the total + number of events in Λ_U, and N_j the number of events in Λ_j + + The pseudo log-likelihood score from the observations is calculated as: + + D_o = Σ_k [log(Λ_U(k) / N_U + 1) - log(Ω(k) / N_o + 1)]^2 + + where Ω is the observed catalog and N_o the total number of observed events. + + Args: + forecast (CatalogForecast): The forecast to be evaluated + observed_catalog (CSEPCatalog): The observation/testing catalog. + mag_half_bin (float): half of the magnitude bin size + verbose (bool): Flag to display debug messages + seed (int): random number seed generator + + Returns: + A CatalogMagnitudeTestResult object containing the statistic distribution and the + observed statistic. + """ + + # set seed + if seed: + numpy.random.seed(seed) + """ """ + test_distribution = [] + + if forecast.region.magnitudes is None: + raise CSEPEvaluationException( + "Forecast must have region.magnitudes member to perform magnitude test.") + + # short-circuit if zero events + if observed_catalog.event_count == 0: + print("Cannot perform magnitude test when observed event count is zero.") + # prepare result + result = CatalogMagnitudeTestResult(test_distribution=test_distribution, + name='M-Test', + observed_statistic=None, + quantile=(None, None), + status='not-valid', + min_mw=forecast.min_magnitude, + obs_catalog_repr=str(observed_catalog), + obs_name=observed_catalog.name, + sim_name=forecast.name) + + return result + + # compute expected rates for forecast if needed + if forecast.expected_rates is None: + forecast.get_expected_rates(verbose=verbose) + + # THIS IS NEW - returns the average events in the magnitude bins + union_histogram = numpy.zeros(len(forecast.magnitudes)) + for j, cat in enumerate(forecast): + union_histogram += cat.magnitude_counts() + # end new + n_union_events = numpy.sum(union_histogram) + obs_histogram = observed_catalog.magnitude_counts() + n_obs = numpy.sum(obs_histogram) + union_scale = n_obs / n_union_events + scaled_union_histogram = union_histogram * union_scale + + # this is new - prob to be used for resampling + probs = union_histogram / n_union_events + # end new + + # compute the test statistic for each catalog + t0 = time.time() + for i, catalog in enumerate(forecast): + # THIS IS NEW - sampled from the union forecast histogram + mag_values = numpy.random.choice(forecast.magnitudes + mag_half_bin, p=probs, + size=int(n_obs)) + extended_mag_max = max(forecast.magnitudes) + 10 + mag_counts, tmp = numpy.histogram(mag_values, bins=numpy.append(forecast.magnitudes, + extended_mag_max)) + # end new + n_events = numpy.sum(mag_counts) + if n_events == 0: + # print("Skipping to next because catalog contained zero events.") + continue + scale = n_obs / n_events + catalog_histogram = mag_counts * scale + # compute magnitude test statistic for the catalog + test_distribution.append( + cumulative_square_diff(numpy.log10(catalog_histogram + 1), + numpy.log10(scaled_union_histogram + 1)) + ) + # output status + if verbose: + tens_exp = numpy.floor(numpy.log10(i + 1)) + if (i + 1) % 10 ** tens_exp == 0: + t1 = time.time() + print(f'Processed {i + 1} catalogs in {t1 - t0} seconds', flush=True) + + # compute observed statistic + obs_d_statistic = cumulative_square_diff(numpy.log10(obs_histogram + 1), + numpy.log10(scaled_union_histogram + 1)) + + # score evaluation + delta_1, delta_2 = get_quantiles(test_distribution, obs_d_statistic) + + # prepare result + result = CatalogMagnitudeTestResult(test_distribution=test_distribution, + name='M-Test', + observed_statistic=obs_d_statistic, + quantile=(delta_1, delta_2), + status='normal', + min_mw=forecast.min_magnitude, + obs_catalog_repr=str(observed_catalog), + obs_name=observed_catalog.name, + sim_name=forecast.name) + + return result + + +def MLL_magnitude_test(forecast: "CatalogForecast", + observed_catalog: CSEPCatalog, + verbose: bool = False, + seed: Optional[int] = None) -> CatalogMagnitudeTestResult: + """ + + Args: + forecast: + observed_catalog: + verbose: + seed: + + Returns: + + """ + + if seed: + numpy.random.seed(seed) + + test_distribution = [] + + if forecast.region.magnitudes is None: + raise CSEPEvaluationException( + "Forecast must have region.magnitudes member to perform magnitude test.") + + # short-circuit if zero events + if observed_catalog.event_count == 0: + print("Cannot perform magnitude test when observed event count is zero.") + # prepare result + result = CatalogMagnitudeTestResult(test_distribution=test_distribution, + name='M-Test', + observed_statistic=None, + quantile=(None, None), + status='not-valid', + min_mw=forecast.min_magnitude, + obs_catalog_repr=str(observed_catalog), + obs_name=observed_catalog.name, + sim_name=forecast.name) + + return result + + # compute expected rates for forecast if needed + if forecast.expected_rates is None: + forecast.get_expected_rates(verbose=verbose) + + # calculate histograms of union forecast and total number of events + Lambda_u_histogram = numpy.zeros(len(forecast.magnitudes)) + Lambda_u = [] + for j, cat in enumerate(forecast): + Lambda_u = numpy.append(Lambda_u, cat.get_magnitudes()) + Lambda_u_histogram += cat.magnitude_counts() + # # calculate histograms of observations and observed number of events + Omega_histogram = observed_catalog.magnitude_counts() + n_obs = numpy.sum(Omega_histogram) + + # compute observed statistic + obs_d_statistic = MLL_score(Lambda_U_counts=Lambda_u_histogram, + Lambda_j_counts=Omega_histogram) + + # compute the test statistic for each catalog + t0 = time.time() + for i, catalog in enumerate(forecast): + # this is new - sampled from the union forecast histogram + mag_values = numpy.random.choice(Lambda_u, size=int(n_obs)) + extended_mag_max = max(forecast.magnitudes) + 10 + Lambda_j_histogram, tmp = numpy.histogram(mag_values, + bins=numpy.append(forecast.magnitudes, + extended_mag_max)) + # end new + n_events = numpy.sum(Lambda_j_histogram) + # if n_events == 0: + # print("Skipping to next because catalog contained zero events.") + # continue + + # compute magnitude test statistic for the catalog + test_distribution.append( + MLL_score(Lambda_U_counts=Lambda_u_histogram, + Lambda_j_counts=Lambda_j_histogram) + ) + # output status + if verbose: + tens_exp = numpy.floor(numpy.log10(i + 1)) + if (i + 1) % 10 ** tens_exp == 0: + t1 = time.time() + print(f'Processed {i + 1} catalogs in {t1 - t0} seconds', flush=True) + + # score evaluation + delta_1, delta_2 = get_quantiles(test_distribution, obs_d_statistic) + + # prepare result + result = CatalogMagnitudeTestResult(test_distribution=test_distribution, + name='M-Test', + observed_statistic=obs_d_statistic, + quantile=(delta_1, delta_2), + status='normal', + min_mw=forecast.min_magnitude, + obs_catalog_repr=str(observed_catalog), + obs_name=observed_catalog.name, + sim_name=forecast.name) + + return result + + +def MLL_magnitude_test_light(forecast: "CatalogForecast", + observed_catalog: CSEPCatalog, + mag_half_bin: float = 0.05, + verbose: bool = False, + seed: Optional[int] = None) -> CatalogMagnitudeTestResult: + """ + + Args: + forecast: + observed_catalog: + mag_half_bin: + verbose: + seed: + + Returns: + + """ + + # set seed + if seed: + numpy.random.seed(seed) + """ Performs magnitude test for catalog-based forecasts """ + test_distribution = [] + + if forecast.region.magnitudes is None: + raise CSEPEvaluationException( + "Forecast must have region.magnitudes member to perform magnitude test.") + + # short-circuit if zero events + if observed_catalog.event_count == 0: + print("Cannot perform magnitude test when observed event count is zero.") + # prepare result + result = CatalogMagnitudeTestResult(test_distribution=test_distribution, + name='M-Test', + observed_statistic=None, + quantile=(None, None), + status='not-valid', + min_mw=forecast.min_magnitude, + obs_catalog_repr=str(observed_catalog), + obs_name=observed_catalog.name, + sim_name=forecast.name) + + return result + + # compute expected rates for forecast if needed + if forecast.expected_rates is None: + forecast.get_expected_rates(verbose=verbose) + + # calculate histograms of union forecast and total number of events + Lambda_u_histogram = numpy.zeros(len(forecast.magnitudes)) + for j, cat in enumerate(forecast): + Lambda_u_histogram += cat.magnitude_counts() + + # # calculate histograms of observations and observed number of events + Omega_histogram = observed_catalog.magnitude_counts() + n_obs = numpy.sum(Omega_histogram) + + # compute observed statistic + obs_d_statistic = MLL_score(Lambda_U_counts=Lambda_u_histogram, + Lambda_j_counts=Omega_histogram) + + probs = Lambda_u_histogram / numpy.sum(Lambda_u_histogram) + + # compute the test statistic for each catalog + t0 = time.time() + for i, catalog in enumerate(forecast): + # this is new - sampled from the union forecast histogram + mag_values = numpy.random.choice(forecast.magnitudes + mag_half_bin, p=probs, + size=int(n_obs)) + extended_mag_max = max(forecast.magnitudes) + 10 + Lambda_j_histogram, tmp = numpy.histogram(mag_values, + bins=numpy.append(forecast.magnitudes, + extended_mag_max)) + # end new + n_events = numpy.sum(Lambda_j_histogram) + # if n_events == 0: + # print("Skipping to next because catalog contained zero events.") + # continue + + # compute magnitude test statistic for the catalog + test_distribution.append( + MLL_score(Lambda_U_counts=Lambda_u_histogram, + Lambda_j_counts=Lambda_j_histogram) + ) + # output status + if verbose: + tens_exp = numpy.floor(numpy.log10(i + 1)) + if (i + 1) % 10 ** tens_exp == 0: + t1 = time.time() + print(f'Processed {i + 1} catalogs in {t1 - t0} seconds', flush=True) + + # score evaluation + delta_1, delta_2 = get_quantiles(test_distribution, obs_d_statistic) + + # prepare result + result = CatalogMagnitudeTestResult(test_distribution=test_distribution, + name='M-Test', + observed_statistic=obs_d_statistic, + quantile=(delta_1, delta_2), + status='normal', + min_mw=forecast.min_magnitude, + obs_catalog_repr=str(observed_catalog), + obs_name=observed_catalog.name, + sim_name=forecast.name) + + return result \ No newline at end of file diff --git a/csep/utils/stats.py b/csep/utils/stats.py index 3550b0de..ab3d5170 100644 --- a/csep/utils/stats.py +++ b/csep/utils/stats.py @@ -1,3 +1,5 @@ +from typing import Sequence + import numpy import scipy.stats import scipy.special @@ -269,3 +271,38 @@ def get_Kagan_I1_score(forecasts, catalog): I_1[j] = numpy.dot(counts[non_zero_idx], numpy.log2(rate_den[non_zero_idx] / uniform_forecast)) / n_event return I_1 + + +def log_d_multinomial(x: numpy.ndarray, size: int, prob: numpy.ndarray): + + return scipy.special.loggamma(size + 1) + numpy.sum( + x * numpy.log(prob) - scipy.special.loggamma(x + 1)) + + +def MLL_score(Lambda_U_counts: numpy.ndarray, Lambda_j_counts: numpy.ndarray): + """ + + Args: + Lambda_U_counts: + Lambda_j_counts: + + Returns: + + """ + N_u = numpy.sum(Lambda_U_counts) + N_j = numpy.sum(Lambda_j_counts) + coef_ = N_u / N_j + Lambda_U_mod = Lambda_U_counts + coef_ + Lambda_j_mod = Lambda_j_counts + 1 + Lambda_merged = Lambda_U_mod + Lambda_j_mod + + pr_merged = Lambda_merged / numpy.sum(Lambda_merged) + pr_U = Lambda_U_mod / numpy.sum(Lambda_U_mod) + pr_j = Lambda_j_mod / numpy.sum(Lambda_j_mod) + + loglik_merged = log_d_multinomial(x=Lambda_merged, size=numpy.sum(Lambda_merged), + prob=pr_merged) + loglik_U = log_d_multinomial(x=Lambda_U_mod, size=numpy.sum(Lambda_U_mod), prob=pr_U) + loglik_j = log_d_multinomial(x=Lambda_j_mod, size=numpy.sum(Lambda_j_mod), prob=pr_j) + + return 2 * (loglik_merged - loglik_U - loglik_j) diff --git a/tests/test_magnitude_tests.py b/tests/test_magnitude_tests.py new file mode 100644 index 00000000..d072e245 --- /dev/null +++ b/tests/test_magnitude_tests.py @@ -0,0 +1,38 @@ +from unittest import TestCase +from csep.core.catalog_evaluations import (resampled_magnitude_test, MLL_magnitude_test, + MLL_magnitude_test_light) + + +class TestResampledMagnitudeTest(TestCase): + def setUp(self): + pass + + def unit_test1(self): + pass + + def tearDown(self): + pass + + +class TestMLLTest(TestCase): + def setUp(self): + pass + + def unit_test1(self): + pass + + def tearDown(self): + pass + + +class TestMLLTestLight(TestCase): + def setUp(self): + pass + + def unit_test1(self): + pass + + def tearDown(self): + pass + + From c8a2964e0538274469bce5d4198d17ff65999283 Mon Sep 17 00:00:00 2001 From: pciturri Date: Tue, 15 Oct 2024 18:17:13 +0200 Subject: [PATCH 2/7] ft: collapsed the MLL test full and light versions into one. A full sampling from the entire stochastic set is possible now with the full_calculation flag. Removed mag_half_bin, which is now calculated directly from the region magnitude bins. --- csep/core/catalog_evaluations.py | 147 +++++++------------------------ 1 file changed, 31 insertions(+), 116 deletions(-) diff --git a/csep/core/catalog_evaluations.py b/csep/core/catalog_evaluations.py index 296cb3d6..2c31760d 100644 --- a/csep/core/catalog_evaluations.py +++ b/csep/core/catalog_evaluations.py @@ -357,7 +357,6 @@ def calibration_test(evaluation_results, delta_1=False): def resampled_magnitude_test(forecast: "CatalogForecast", observed_catalog: CSEPCatalog, - mag_half_bin: float = 0.05, verbose: bool = False, seed: Optional[int] = None) -> CatalogMagnitudeTestResult: """ @@ -365,6 +364,7 @@ def resampled_magnitude_test(forecast: "CatalogForecast", which corrects the bias from the original M-test implementation to the total N of events. Calculates the pseudo log-likelihood distribution from the synthetic catalog Λ_j as: + # todo: check correct formula D_j = Σ_k [log(Λ_U(k) / N_U + 1) - log(Λ_j(k) / N_j + 1)]^2 where k are the magnitude bins, Λ_U the union of all synthetic catalogs, N_U the total @@ -372,6 +372,7 @@ def resampled_magnitude_test(forecast: "CatalogForecast", The pseudo log-likelihood score from the observations is calculated as: + # todo: check correct formula D_o = Σ_k [log(Λ_U(k) / N_U + 1) - log(Ω(k) / N_o + 1)]^2 where Ω is the observed catalog and N_o the total number of observed events. @@ -379,9 +380,8 @@ def resampled_magnitude_test(forecast: "CatalogForecast", Args: forecast (CatalogForecast): The forecast to be evaluated observed_catalog (CSEPCatalog): The observation/testing catalog. - mag_half_bin (float): half of the magnitude bin size verbose (bool): Flag to display debug messages - seed (int): random number seed generator + seed (int): Random number generator seed Returns: A CatalogMagnitudeTestResult object containing the statistic distribution and the @@ -422,6 +422,8 @@ def resampled_magnitude_test(forecast: "CatalogForecast", union_histogram = numpy.zeros(len(forecast.magnitudes)) for j, cat in enumerate(forecast): union_histogram += cat.magnitude_counts() + + mag_half_bin = numpy.diff(observed_catalog.region.magnitudes)[0] / 2. # end new n_union_events = numpy.sum(union_histogram) obs_histogram = observed_catalog.magnitude_counts() @@ -484,20 +486,28 @@ def resampled_magnitude_test(forecast: "CatalogForecast", def MLL_magnitude_test(forecast: "CatalogForecast", observed_catalog: CSEPCatalog, + full_calculation: bool = False, verbose: bool = False, seed: Optional[int] = None) -> CatalogMagnitudeTestResult: """ + Implements the modified Multinomial likelihood log-ratio (MLL) magnitude test (Serafini et + al., 2024). + Args: - forecast: - observed_catalog: - verbose: - seed: + forecast (CatalogForecast): The forecast to be evaluated + observed_catalog (CSEPCatalog): The observation/testing catalog. + full_calculation (bool): Whether to sample from the entire stochastic catalogs or from + its already processed magnitude histogram. + verbose (bool): Flag to display debug messages + seed (int): Random number generator seed Returns: - + A CatalogMagnitudeTestResult object containing the statistic distribution and the + observed statistic. """ + # set seed if seed: numpy.random.seed(seed) @@ -529,113 +539,15 @@ def MLL_magnitude_test(forecast: "CatalogForecast", # calculate histograms of union forecast and total number of events Lambda_u_histogram = numpy.zeros(len(forecast.magnitudes)) - Lambda_u = [] - for j, cat in enumerate(forecast): - Lambda_u = numpy.append(Lambda_u, cat.get_magnitudes()) - Lambda_u_histogram += cat.magnitude_counts() - # # calculate histograms of observations and observed number of events - Omega_histogram = observed_catalog.magnitude_counts() - n_obs = numpy.sum(Omega_histogram) - # compute observed statistic - obs_d_statistic = MLL_score(Lambda_U_counts=Lambda_u_histogram, - Lambda_j_counts=Omega_histogram) - - # compute the test statistic for each catalog - t0 = time.time() - for i, catalog in enumerate(forecast): - # this is new - sampled from the union forecast histogram - mag_values = numpy.random.choice(Lambda_u, size=int(n_obs)) - extended_mag_max = max(forecast.magnitudes) + 10 - Lambda_j_histogram, tmp = numpy.histogram(mag_values, - bins=numpy.append(forecast.magnitudes, - extended_mag_max)) - # end new - n_events = numpy.sum(Lambda_j_histogram) - # if n_events == 0: - # print("Skipping to next because catalog contained zero events.") - # continue - - # compute magnitude test statistic for the catalog - test_distribution.append( - MLL_score(Lambda_U_counts=Lambda_u_histogram, - Lambda_j_counts=Lambda_j_histogram) - ) - # output status - if verbose: - tens_exp = numpy.floor(numpy.log10(i + 1)) - if (i + 1) % 10 ** tens_exp == 0: - t1 = time.time() - print(f'Processed {i + 1} catalogs in {t1 - t0} seconds', flush=True) - - # score evaluation - delta_1, delta_2 = get_quantiles(test_distribution, obs_d_statistic) - - # prepare result - result = CatalogMagnitudeTestResult(test_distribution=test_distribution, - name='M-Test', - observed_statistic=obs_d_statistic, - quantile=(delta_1, delta_2), - status='normal', - min_mw=forecast.min_magnitude, - obs_catalog_repr=str(observed_catalog), - obs_name=observed_catalog.name, - sim_name=forecast.name) - - return result - - -def MLL_magnitude_test_light(forecast: "CatalogForecast", - observed_catalog: CSEPCatalog, - mag_half_bin: float = 0.05, - verbose: bool = False, - seed: Optional[int] = None) -> CatalogMagnitudeTestResult: - """ - - Args: - forecast: - observed_catalog: - mag_half_bin: - verbose: - seed: - - Returns: - - """ - - # set seed - if seed: - numpy.random.seed(seed) - """ Performs magnitude test for catalog-based forecasts """ - test_distribution = [] - - if forecast.region.magnitudes is None: - raise CSEPEvaluationException( - "Forecast must have region.magnitudes member to perform magnitude test.") - - # short-circuit if zero events - if observed_catalog.event_count == 0: - print("Cannot perform magnitude test when observed event count is zero.") - # prepare result - result = CatalogMagnitudeTestResult(test_distribution=test_distribution, - name='M-Test', - observed_statistic=None, - quantile=(None, None), - status='not-valid', - min_mw=forecast.min_magnitude, - obs_catalog_repr=str(observed_catalog), - obs_name=observed_catalog.name, - sim_name=forecast.name) - - return result - - # compute expected rates for forecast if needed - if forecast.expected_rates is None: - forecast.get_expected_rates(verbose=verbose) + if full_calculation: + Lambda_u = [] + else: + mag_half_bin = numpy.diff(observed_catalog.region.magnitudes)[0] / 2. - # calculate histograms of union forecast and total number of events - Lambda_u_histogram = numpy.zeros(len(forecast.magnitudes)) for j, cat in enumerate(forecast): + if full_calculation: + Lambda_u = numpy.append(Lambda_u, cat.get_magnitudes()) Lambda_u_histogram += cat.magnitude_counts() # # calculate histograms of observations and observed number of events @@ -644,7 +556,7 @@ def MLL_magnitude_test_light(forecast: "CatalogForecast", # compute observed statistic obs_d_statistic = MLL_score(Lambda_U_counts=Lambda_u_histogram, - Lambda_j_counts=Omega_histogram) + Lambda_j_counts=Omega_histogram) probs = Lambda_u_histogram / numpy.sum(Lambda_u_histogram) @@ -652,8 +564,11 @@ def MLL_magnitude_test_light(forecast: "CatalogForecast", t0 = time.time() for i, catalog in enumerate(forecast): # this is new - sampled from the union forecast histogram - mag_values = numpy.random.choice(forecast.magnitudes + mag_half_bin, p=probs, - size=int(n_obs)) + if full_calculation: + mag_values = numpy.random.choice(Lambda_u, size=int(n_obs)) + else: + mag_values = numpy.random.choice(forecast.magnitudes + mag_half_bin, p=probs, + size=int(n_obs)) extended_mag_max = max(forecast.magnitudes) + 10 Lambda_j_histogram, tmp = numpy.histogram(mag_values, bins=numpy.append(forecast.magnitudes, @@ -667,7 +582,7 @@ def MLL_magnitude_test_light(forecast: "CatalogForecast", # compute magnitude test statistic for the catalog test_distribution.append( MLL_score(Lambda_U_counts=Lambda_u_histogram, - Lambda_j_counts=Lambda_j_histogram) + Lambda_j_counts=Lambda_j_histogram) ) # output status if verbose: From eeba9278a4926feb3c4e47d519331a0c2b889859 Mon Sep 17 00:00:00 2001 From: pciturri Date: Mon, 21 Oct 2024 16:53:56 +0200 Subject: [PATCH 3/7] tests: Added unit test for the resampled M-test. --- csep/core/catalog_evaluations.py | 12 +- tests/test_magnitude_tests.py | 207 +++++++++++++++++++++++++++++-- 2 files changed, 205 insertions(+), 14 deletions(-) diff --git a/csep/core/catalog_evaluations.py b/csep/core/catalog_evaluations.py index 2c31760d..b23d135a 100644 --- a/csep/core/catalog_evaluations.py +++ b/csep/core/catalog_evaluations.py @@ -364,18 +364,16 @@ def resampled_magnitude_test(forecast: "CatalogForecast", which corrects the bias from the original M-test implementation to the total N of events. Calculates the pseudo log-likelihood distribution from the synthetic catalog Λ_j as: - # todo: check correct formula - D_j = Σ_k [log(Λ_U(k) / N_U + 1) - log(Λ_j(k) / N_j + 1)]^2 + D_j = Σ_k [log(Λ_U(k) / N_U + 1) - log(Λ̃_j(k) + 1)] ^ 2 - where k are the magnitude bins, Λ_U the union of all synthetic catalogs, N_U the total - number of events in Λ_U, and N_j the number of events in Λ_j + where k are the magnitude bins, Λ_U the union of all synthetic catalogs, N_U the total + number of events in Λ_U, and Λ̃_j the resampled catalog containing exactly N events. The pseudo log-likelihood score from the observations is calculated as: - # todo: check correct formula - D_o = Σ_k [log(Λ_U(k) / N_U + 1) - log(Ω(k) / N_o + 1)]^2 + D_o = Σ_k [log(Λ_U(k) / N_U + 1) - log(Ω(k) + 1)]^2 - where Ω is the observed catalog and N_o the total number of observed events. + where Ω is the observed catalog. Args: forecast (CatalogForecast): The forecast to be evaluated diff --git a/tests/test_magnitude_tests.py b/tests/test_magnitude_tests.py index d072e245..cca4d5e7 100644 --- a/tests/test_magnitude_tests.py +++ b/tests/test_magnitude_tests.py @@ -1,14 +1,209 @@ from unittest import TestCase -from csep.core.catalog_evaluations import (resampled_magnitude_test, MLL_magnitude_test, - MLL_magnitude_test_light) + +import numpy + +from csep.core.catalog_evaluations import resampled_magnitude_test +from csep.core.catalogs import CSEPCatalog +from csep.core.forecasts import CatalogForecast +from csep.core.regions import CartesianGrid2D class TestResampledMagnitudeTest(TestCase): def setUp(self): - pass + self.mag_bins = [1.0, 2.0] + self.region = CartesianGrid2D.from_origins( + numpy.array([[0.0, 0.0]]), dh=1.0, magnitudes=self.mag_bins + ) - def unit_test1(self): - pass + @staticmethod + def D_o(forecast, obs): + """ + Independent implementation of D_o for the resampled M-test, just following the equations + from Serafini et al., (2024) + + Args: + forecast: A CatalogForecast object + obs: A CSEPCatalog + + Returns: + The observed statistic + """ + d_o = 0 + N_u = numpy.sum([i.get_number_of_events() for i in forecast.catalogs]) + N_o = obs.get_number_of_events() + for i in range(len(obs.region.magnitudes)): + union_mag_counts = forecast.magnitude_counts()[i] * forecast.n_cat + first_term = numpy.log10(union_mag_counts * N_o / N_u + 1) + second_term = numpy.log10(obs.magnitude_counts()[i] + 1) + d_o += (first_term - second_term) ** 2 + + return d_o + + @staticmethod + def D_j(forecast, obs, seed=None): + """ + Independent implementation of D_j for the resampled M-test, just following the equations + from Serafini et al., (2024) + + Args: + forecast: A CatalogForecast object + obs: A CSEPCatalog + seed: random number seed value for the sampling of magnitudes + Returns: + The test statistic distribution + """ + if seed: + numpy.random.seed(seed) + + D = [] + N_u = numpy.sum([i.get_number_of_events() for i in forecast.catalogs]) + N_o = obs.get_number_of_events() + mag_histogram = forecast.magnitude_counts() + + for n in range(forecast.n_cat): + d_j = 0 + lambda_j = numpy.random.choice( + obs.region.magnitudes, size=N_o, p=mag_histogram / numpy.sum(mag_histogram) + ) + for i in range(len(obs.region.magnitudes)): + union_mag_counts = forecast.magnitude_counts()[i] * forecast.n_cat + first_term = numpy.log10(union_mag_counts * N_o / N_u + 1) + counts = numpy.sum(lambda_j == obs.region.magnitudes[i]) + second_term = numpy.log10(counts + 1) + d_j += (first_term - second_term) ** 2 + D.append(d_j) + + return D + + def test_no_region(self): + synthetic_cats = [CSEPCatalog(data=[("0", 1, 0.0, 0.0, 0.0, 1.0)])] + forecast = CatalogForecast(catalogs=synthetic_cats) + observation_cat = CSEPCatalog(data=[("0", 1, 0.0, 0.0, 0.0, 1.0)]) + + with self.assertRaises(AttributeError): + resampled_magnitude_test(forecast, observation_cat) + + def test_single_cat_single_event(self): + + # Same magnitude as observation + synthetic_cats = [CSEPCatalog(data=[("0", 1, 0.0, 0.0, 0.0, 1.0)])] + forecast = CatalogForecast(catalogs=synthetic_cats, region=self.region, n_cat=1) + observation_cat = CSEPCatalog(data=[("0", 1, 0.0, 0.0, 0.0, 1.0)], region=self.region) + result = resampled_magnitude_test(forecast, observation_cat) + self.assertEqual(result.test_distribution, [0]) + self.assertEqual(result.observed_statistic, self.D_o(forecast, observation_cat)) # 0 + + # Different magnitude as observation + + observation_cat = CSEPCatalog(data=[("0", 1, 0.0, 0.0, 0.0, 2.0)], region=self.region) + result = resampled_magnitude_test(forecast, observation_cat) + self.assertEqual(result.test_distribution, [0]) + self.assertEqual( + result.observed_statistic, self.D_o(forecast, observation_cat) + ) # 0.18123811 + + def test_single_cat_multiple_events(self): + + # Same MFD + forecast = CatalogForecast( + catalogs=[ + CSEPCatalog( + data=[ + *(4 * [("0", 1, 0.0, 0.0, 0.0, 1.0)]), # 4 events of this type + *(2 * [("0", 1, 0.0, 0.0, 0.0, 2.0)]), # 2 events of this type + ] + ) + ], + region=self.region, + n_cat=1, + ) + + observation_cat = CSEPCatalog( + data=[ + *(2 * [("0", 1, 0.0, 0.0, 0.0, 1.0)]), # 2 events of this type + *(1 * [("0", 1, 0.0, 0.0, 0.0, 2.0)]), # 1 event of this type + ], + region=self.region, + ) + + seed = 2 # Set seed so both methods sample the same events from the Union catalog. + result = resampled_magnitude_test(forecast, observation_cat, seed=seed) + self.assertEqual(result.observed_statistic, self.D_o(forecast, observation_cat)) # 0. + self.assertEqual( + result.test_distribution, self.D_j(forecast, observation_cat, seed=seed) + ) # [0.10622874] + + # Different MFD + observation_cat = CSEPCatalog( + data=[*(2 * [("0", 1, 0.0, 0.0, 0.0, 1.0)])], + region=self.region, + ) + seed = 3 + result = resampled_magnitude_test(forecast, observation_cat, seed=seed) + self.assertEqual( + result.observed_statistic, self.D_o(forecast, observation_cat) + ) # 0.0611293829124204 + self.assertEqual( + result.test_distribution, self.D_j(forecast, observation_cat, seed=seed) + ) # 0.010751542367500075 + + def test_multiple_cat_multiple_events(self): + + # Same MFD + forecast = CatalogForecast( + catalogs=[ + CSEPCatalog( + data=[ + *(2 * [("0", 1, 0.0, 0.0, 0.0, 1.0)]), + *(1 * [("0", 1, 0.0, 0.0, 0.0, 2.0)]), + ] + ), + CSEPCatalog( + data=[ + *(8 * [("0", 1, 0.0, 0.0, 0.0, 1.0)]), + *(4 * [("0", 1, 0.0, 0.0, 0.0, 2.0)]), + ] + ), + CSEPCatalog( + data=[ + *(12 * [("0", 1, 0.0, 0.0, 0.0, 1.0)]), + *(6 * [("0", 1, 0.0, 0.0, 0.0, 2.0)]), + ] + ), + ], + region=self.region, + n_cat=3, + ) + + observation_cat = CSEPCatalog( + data=[ + *(4 * [("0", 1, 0.0, 0.0, 0.0, 1.0)]), + *(2 * [("0", 1, 0.0, 0.0, 0.0, 2.0)]), + ], + region=self.region, + ) + + seed = 3 # Set seed so both methods sample the same events from the Union catalog. + result = resampled_magnitude_test(forecast, observation_cat, seed=seed) + + self.assertEqual(result.observed_statistic, self.D_o(forecast, observation_cat)) # 0. + self.assertEqual( + result.test_distribution, self.D_j(forecast, observation_cat, seed=seed) + ) # [0.025001238526499825, 0.2489980945164454, 0.03727780124146953] + + # Different MFD + observation_cat = CSEPCatalog( + data=[*(3 * [("0", 1, 0.0, 0.0, 0.0, 1.0)]), *(1 * [("0", 1, 0.0, 0.0, 0.0, 1.0)])], + region=self.region, + ) + seed = 3 + result = resampled_magnitude_test(forecast, observation_cat, seed=seed) + self.assertAlmostEqual( + result.observed_statistic, self.D_o(forecast, observation_cat) + ) # 0.1535506203257525 + numpy.testing.assert_almost_equal( + result.test_distribution, self.D_j(forecast, observation_cat, seed=seed) + ) # [0.005909847975937456, 0.019507668333914787, 0.1535506203257525] def tearDown(self): pass @@ -34,5 +229,3 @@ def unit_test1(self): def tearDown(self): pass - - From d71efcf188e2c7db878bf8b644fb74d6c3e334d3 Mon Sep 17 00:00:00 2001 From: pciturri Date: Mon, 21 Oct 2024 18:29:47 +0200 Subject: [PATCH 4/7] tests: Added unit tests for the MLL-test --- tests/test_magnitude_tests.py | 257 +++++++++++++++++++++++++++++++--- 1 file changed, 240 insertions(+), 17 deletions(-) diff --git a/tests/test_magnitude_tests.py b/tests/test_magnitude_tests.py index cca4d5e7..493c78b7 100644 --- a/tests/test_magnitude_tests.py +++ b/tests/test_magnitude_tests.py @@ -1,8 +1,9 @@ from unittest import TestCase import numpy +import scipy.special -from csep.core.catalog_evaluations import resampled_magnitude_test +from csep.core.catalog_evaluations import resampled_magnitude_test, MLL_magnitude_test from csep.core.catalogs import CSEPCatalog from csep.core.forecasts import CatalogForecast from csep.core.regions import CartesianGrid2D @@ -90,7 +91,7 @@ def test_single_cat_single_event(self): forecast = CatalogForecast(catalogs=synthetic_cats, region=self.region, n_cat=1) observation_cat = CSEPCatalog(data=[("0", 1, 0.0, 0.0, 0.0, 1.0)], region=self.region) result = resampled_magnitude_test(forecast, observation_cat) - self.assertEqual(result.test_distribution, [0]) + self.assertEqual(result.test_distribution, [0]) # [0] self.assertEqual(result.observed_statistic, self.D_o(forecast, observation_cat)) # 0 # Different magnitude as observation @@ -205,27 +206,249 @@ def test_multiple_cat_multiple_events(self): result.test_distribution, self.D_j(forecast, observation_cat, seed=seed) ) # [0.005909847975937456, 0.019507668333914787, 0.1535506203257525] - def tearDown(self): - pass - class TestMLLTest(TestCase): def setUp(self): - pass + self.mag_bins = [1.0, 2.0] + self.region = CartesianGrid2D.from_origins( + numpy.array([[0.0, 0.0]]), dh=1.0, magnitudes=self.mag_bins + ) - def unit_test1(self): - pass + @staticmethod + def D_o(forecast, catalog): - def tearDown(self): - pass + def multinomial_likelihood(array): + """ + Calculates the likelihood value. Only valid for small arrays and values. + """ + total = numpy.sum(array) + C = scipy.special.factorial(total) + for i in array: + C /= scipy.special.factorial(i) -class TestMLLTestLight(TestCase): - def setUp(self): - pass + product = numpy.prod([(i / total) ** i for i in array]) + + return C * product + + lambda_u = forecast.magnitude_counts() * forecast.n_cat + omega = catalog.magnitude_counts() + N_u = numpy.sum([i.get_number_of_events() for i in forecast.catalogs]) + N_o = catalog.get_number_of_events() + + likelihood_merged = multinomial_likelihood(lambda_u + N_u / N_o + omega + 1) + likelihood_union = multinomial_likelihood(lambda_u + N_u / N_o) + likelihood_cat = multinomial_likelihood(omega + 1) + + return 2 * numpy.log(likelihood_merged / likelihood_union / likelihood_cat) + + @staticmethod + def D_j(forecast, catalog, seed=None): + if seed: + numpy.random.seed(seed) + + def multinomial_likelihood(array): + """ + Calculates the likelihood value. Only valid for small arrays and values. + """ + total = numpy.sum(array) + + C = scipy.special.factorial(total) + for i in array: + C /= scipy.special.factorial(i) + + product = numpy.prod([(i / total) ** i for i in array]) + + return C * product + + D = [] + + lambda_u = forecast.magnitude_counts() * forecast.n_cat + N_u = numpy.sum([i.get_number_of_events() for i in forecast.catalogs]) + N_o = catalog.get_number_of_events() + + for n in range(forecast.n_cat): + lambda_j = numpy.random.choice( + catalog.region.magnitudes, size=N_o, p=lambda_u / numpy.sum(lambda_u) + ) + counts = numpy.array([numpy.sum(lambda_j == i) for i in catalog.region.magnitudes]) + likelihood_merged = multinomial_likelihood(lambda_u + N_u / N_o + counts + 1) + likelihood_union = multinomial_likelihood(lambda_u + N_u / N_o) + likelihood_cat = multinomial_likelihood(counts + 1) + D.append(2 * numpy.log(likelihood_merged / likelihood_union / likelihood_cat)) + + return D + + def test_no_region(self): + synthetic_cats = [CSEPCatalog(data=[("0", 1, 0.0, 0.0, 0.0, 1.0)])] + forecast = CatalogForecast(catalogs=synthetic_cats) + observation_cat = CSEPCatalog(data=[("0", 1, 0.0, 0.0, 0.0, 1.0)]) + + with self.assertRaises(AttributeError): + MLL_magnitude_test(forecast, observation_cat) + + def test_single_cat_single_event(self): + + # Same magnitudes as observation + synthetic_cats = [CSEPCatalog(data=[("0", 1, 0.0, 0.0, 0.0, 1.0)])] + forecast = CatalogForecast(catalogs=synthetic_cats, region=self.region, n_cat=1) + observation_cat = CSEPCatalog(data=[("0", 1, 0.0, 0.0, 0.0, 1.0)], region=self.region) + result = MLL_magnitude_test(forecast, observation_cat) + + # D_j = - 2 * log( L(Lambda_U + N_u / N_j + Lambda_j + 1) / + # [L(Lambda_U + N_u / N_j) * L(Lambda_j + 1)] + # ) + + # First term: L(Lambda_U + N_u / N_j + Lambda_j + 1) + # Array: ( [1, 0] + 1/1 + [1, 0] + 1) = ( [4, 2] ) + # L ( [4, 2] ) = 6! / ( 4! * 2!) * (4 / 6) ** 4 * (2 / 6) ** 2 + # = 5 * 6 / 2 * 2 ** 10 / 6 ** 6 + # = 0.3292181069958848 + + # Second term: L(Lambda_U + N_u / N_j) + # Array: ([1, 0] + 1/1) = ( [2, 1] ) + # L ( [2, 1] ) = 3! / ( 2! * 1!) * (2 / 3) ** 2 * (1 / 3) ** 1 + # = 3 * 4 / 9 * 1 / 3 + # = 0.4444444444444444 + + # Third term: L(Lambda_j + 1) + # Array: ([1, 0] + 1) = ( [2, 1] ) + # L ( [2, 1] ) = 0.4444444444444444 + + # D_j = -2 log( 0.3292181069958848 / 0.4444444444444444 / 0.4444444444444444) + # = -1.0216512475319817 + self.assertAlmostEqual(result.test_distribution[0], 1.0216512475319817) + + # Different magnitude as observation + observation_cat = CSEPCatalog(data=[("0", 1, 0.0, 0.0, 0.0, 3.0)], region=self.region) + result = MLL_magnitude_test(forecast, observation_cat) + # D_o = - 2 * log( L(Lambda_U + N_u / N_o + Omega + 1) / + # [L(Lambda_U + N_u / N_o) * L(Omega + 1)] + # ) + + # First term: L(Lambda_U + N_u / N_o + Omega + 1) + # Array: ( [1, 0] + 1/1 + [0, 1] + 1) = ( [3, 3] ) + # L ( [3, 3] ) = 6! / ( 3! * 3!) * (3 / 6) ** 3 * (3 / 6) ** 3 + # = 4 * 5 * 6 / (1 * 2 * 3) * 0.5 ** 6 * 0.5 ** 6 + # = 0.3125 + + # Second term: L(Lambda_U + N_u / N_o) + # Array: ([1, 0] + 1/1) = ( [2, 1] ) + # = 0.4444444444444444 + + # Third term: L(Omega + 1) + # Array: ([0, 1] + 1) = ( [1, 2] ) + # L ( [2, 1] ) = 0.4444444444444444 + + # D_j = - 2 * log( 0.3125 / 0.4444444444444444 / 0.4444444444444444) + # = - 0.9174192452539534 + + self.assertAlmostEqual(result.observed_statistic, 0.9174192452539534) + # test own implementation + self.assertAlmostEqual(result.observed_statistic, self.D_o(forecast, observation_cat)) + + def test_single_cat_multiple_events(self): + + # Same MFD + forecast = CatalogForecast( + catalogs=[ + CSEPCatalog( + data=[ + *(4 * [("0", 1, 0.0, 0.0, 0.0, 1.0)]), # 4 events of this type + *(2 * [("0", 1, 0.0, 0.0, 0.0, 2.0)]), # 2 events of this type + ] + ) + ], + region=self.region, + n_cat=1, + ) + + observation_cat = CSEPCatalog( + data=[ + *(2 * [("0", 1, 0.0, 0.0, 0.0, 1.0)]), # 2 events of this type + *(1 * [("0", 1, 0.0, 0.0, 0.0, 2.0)]), # 1 event of this type + ], + region=self.region, + ) + + seed = 2 # Set seed so both methods sample the same events from the Union catalog. + result = MLL_magnitude_test(forecast, observation_cat, seed=seed) + self.assertAlmostEqual( + result.observed_statistic, self.D_o(forecast, observation_cat) + ) # 1.7370001360756202 + numpy.testing.assert_almost_equal( + result.test_distribution, self.D_j(forecast, observation_cat, seed=seed) + ) # [1.4704757763861487] + + # Different MFD + observation_cat = CSEPCatalog( + data=[*(2 * [("0", 1, 0.0, 0.0, 0.0, 1.0)])], + region=self.region, + ) + seed = 3 + result = MLL_magnitude_test(forecast, observation_cat, seed=seed) + self.assertAlmostEqual( + result.observed_statistic, self.D_o(forecast, observation_cat) + ) # 1.483977055813141 + numpy.testing.assert_almost_equal( + result.test_distribution, self.D_j(forecast, observation_cat, seed=seed) + ) # [1.6728620032121357] + + def test_multiple_cat_multiple_events(self): + + # Same MFD + forecast = CatalogForecast( + catalogs=[ + CSEPCatalog( + data=[ + *(2 * [("0", 1, 0.0, 0.0, 0.0, 1.0)]), + *(1 * [("0", 1, 0.0, 0.0, 0.0, 2.0)]), + ] + ), + CSEPCatalog( + data=[ + *(8 * [("0", 1, 0.0, 0.0, 0.0, 1.0)]), + *(4 * [("0", 1, 0.0, 0.0, 0.0, 2.0)]), + ] + ), + CSEPCatalog( + data=[ + *(12 * [("0", 1, 0.0, 0.0, 0.0, 1.0)]), + *(6 * [("0", 1, 0.0, 0.0, 0.0, 2.0)]), + ] + ), + ], + region=self.region, + n_cat=3, + ) - def unit_test1(self): - pass + observation_cat = CSEPCatalog( + data=[ + *(4 * [("0", 1, 0.0, 0.0, 0.0, 1.0)]), + *(2 * [("0", 1, 0.0, 0.0, 0.0, 2.0)]), + ], + region=self.region, + ) - def tearDown(self): - pass + seed = 2 # Set seed so both methods sample the same events from the Union catalog. + result = MLL_magnitude_test(forecast, observation_cat, seed=seed) + self.assertAlmostEqual( + result.observed_statistic, self.D_o(forecast, observation_cat) + ) # 2.3691574300045595 + numpy.testing.assert_almost_equal( + result.test_distribution, self.D_j(forecast, observation_cat, seed=seed) + ) # [1.752103594329519, 1.752103594329519, 2.3691574300045595] + + # Different MFD + observation_cat = CSEPCatalog( + data=[*(3 * [("0", 1, 0.0, 0.0, 0.0, 1.0)]), *(1 * [("0", 1, 0.0, 0.0, 0.0, 1.0)])], + region=self.region, + ) + seed = 3 + result = MLL_magnitude_test(forecast, observation_cat, seed=seed) + self.assertAlmostEqual( + result.observed_statistic, self.D_o(forecast, observation_cat) + ) # 1.7348577364545044 + numpy.testing.assert_almost_equal( + result.test_distribution, self.D_j(forecast, observation_cat, seed=seed) + ) # [2.114537837794348, 2.202622612026193, 1.7348577364545044] From 43d57d27c4a5184bfffb707141326e314158597e Mon Sep 17 00:00:00 2001 From: pciturri Date: Tue, 22 Oct 2024 00:30:57 +0200 Subject: [PATCH 5/7] refac: renamed variables from MLL_score. Added docstrings for MLL_magnitude_test and MLL_score. docs: updated URLs for intersphinx. Added new M-tests to the API reference. --- csep/core/catalog_evaluations.py | 43 +++++++++++-------- csep/utils/stats.py | 72 ++++++++++++++++++++------------ docs/conf.py | 6 +-- docs/reference/api_reference.rst | 2 + 4 files changed, 77 insertions(+), 46 deletions(-) diff --git a/csep/core/catalog_evaluations.py b/csep/core/catalog_evaluations.py index b23d135a..885898f3 100644 --- a/csep/core/catalog_evaluations.py +++ b/csep/core/catalog_evaluations.py @@ -362,16 +362,17 @@ def resampled_magnitude_test(forecast: "CatalogForecast", """ Performs the resampled magnitude test for catalog-based forecasts (Serafini et al., 2024), which corrects the bias from the original M-test implementation to the total N of events. - Calculates the pseudo log-likelihood distribution from the synthetic catalog Λ_j as: + Calculates the (pseudo log-likelihood) test statistic distribution from the forecast's + synthetic catalogs Λ_j as: - D_j = Σ_k [log(Λ_U(k) / N_U + 1) - log(Λ̃_j(k) + 1)] ^ 2 + D_j = Σ_k [log(Λ_u(k) * N / N_u + 1) - log(Λ̃_j(k) + 1)] ^ 2 - where k are the magnitude bins, Λ_U the union of all synthetic catalogs, N_U the total - number of events in Λ_U, and Λ̃_j the resampled catalog containing exactly N events. + where k are the magnitude bins, Λ_u the union of all synthetic catalogs, N_u the total + number of events in Λ_u, and Λ̃_j the resampled catalog containing exactly N events. - The pseudo log-likelihood score from the observations is calculated as: + The pseudo log-likelihood statistic from the observations is calculated as: - D_o = Σ_k [log(Λ_U(k) / N_U + 1) - log(Ω(k) + 1)]^2 + D_o = Σ_k [log(Λ_U(k) * N / N_u + 1) - log(Ω(k) + 1)]^2 where Ω is the observed catalog. @@ -488,9 +489,22 @@ def MLL_magnitude_test(forecast: "CatalogForecast", verbose: bool = False, seed: Optional[int] = None) -> CatalogMagnitudeTestResult: """ - Implements the modified Multinomial likelihood log-ratio (MLL) magnitude test (Serafini et - al., 2024). + Implements the modified Multinomial log-likelihood ratio (MLL) magnitude test (Serafini et + al., 2024). Calculates the test statistic distribution as: + D̃_j = -2 * log( L(Λ_u + N_u / N_j + Λ̃_j + 1) / + [L(Λ_u + N_u / N_j) * L(Λ̃_j + 1)] + ) + + where L is the multinomial likelihood function, Λ_u the union of all the forecasts' + synthetic catalogs, N_u the total number of events in Λ_u, Λ̃_j the resampled catalog + containing exactly N observed events. The observed statistic is defined as: + + D_o = -2 * log( L(Λ_u + N_u / N + Ω + 1) / + [L(Λ_u + N_u / N) * L(Ω + 1)] + ) + + where Ω is the observed catalog. Args: forecast (CatalogForecast): The forecast to be evaluated @@ -553,8 +567,8 @@ def MLL_magnitude_test(forecast: "CatalogForecast", n_obs = numpy.sum(Omega_histogram) # compute observed statistic - obs_d_statistic = MLL_score(Lambda_U_counts=Lambda_u_histogram, - Lambda_j_counts=Omega_histogram) + obs_d_statistic = MLL_score(union_catalog_counts=Lambda_u_histogram, + catalog_counts=Omega_histogram) probs = Lambda_u_histogram / numpy.sum(Lambda_u_histogram) @@ -571,16 +585,11 @@ def MLL_magnitude_test(forecast: "CatalogForecast", Lambda_j_histogram, tmp = numpy.histogram(mag_values, bins=numpy.append(forecast.magnitudes, extended_mag_max)) - # end new - n_events = numpy.sum(Lambda_j_histogram) - # if n_events == 0: - # print("Skipping to next because catalog contained zero events.") - # continue # compute magnitude test statistic for the catalog test_distribution.append( - MLL_score(Lambda_U_counts=Lambda_u_histogram, - Lambda_j_counts=Lambda_j_histogram) + MLL_score(union_catalog_counts=Lambda_u_histogram, + catalog_counts=Lambda_j_histogram) ) # output status if verbose: diff --git a/csep/utils/stats.py b/csep/utils/stats.py index ab3d5170..f735206a 100644 --- a/csep/utils/stats.py +++ b/csep/utils/stats.py @@ -1,10 +1,7 @@ -from typing import Sequence - import numpy -import scipy.stats import scipy.special -# PyCSEP imports -from csep.core import regions +import scipy.stats + def sup_dist(cdf1, cdf2): """ @@ -274,35 +271,58 @@ def get_Kagan_I1_score(forecasts, catalog): def log_d_multinomial(x: numpy.ndarray, size: int, prob: numpy.ndarray): + """ + + Args: + x: + size: + prob: + Returns: + + """ return scipy.special.loggamma(size + 1) + numpy.sum( x * numpy.log(prob) - scipy.special.loggamma(x + 1)) -def MLL_score(Lambda_U_counts: numpy.ndarray, Lambda_j_counts: numpy.ndarray): +def MLL_score(union_catalog_counts: numpy.ndarray, catalog_counts: numpy.ndarray): """ + Calculates the modified Multinomial log-likelihood (MLL) score, defined by Serafini et al., + (2024). It is built from a collection catalogs Λ_u and a single catalog Ω + + MLL_score = 2 * log( L(Λ_u + N_u / N_o + Ω + 1) / + [L(Λ_u + N_u / N_o) * L(Ω + 1)] + ) + where N_u and N_j are the total number of events in Λ_u and Ω, respectively. Args: - Lambda_U_counts: - Lambda_j_counts: + union_catalog_counts (numpy.ndarray): + catalog_counts (numpy.ndarray): Returns: - + The MLL score for the collection of catalogs and """ - N_u = numpy.sum(Lambda_U_counts) - N_j = numpy.sum(Lambda_j_counts) - coef_ = N_u / N_j - Lambda_U_mod = Lambda_U_counts + coef_ - Lambda_j_mod = Lambda_j_counts + 1 - Lambda_merged = Lambda_U_mod + Lambda_j_mod - - pr_merged = Lambda_merged / numpy.sum(Lambda_merged) - pr_U = Lambda_U_mod / numpy.sum(Lambda_U_mod) - pr_j = Lambda_j_mod / numpy.sum(Lambda_j_mod) - - loglik_merged = log_d_multinomial(x=Lambda_merged, size=numpy.sum(Lambda_merged), - prob=pr_merged) - loglik_U = log_d_multinomial(x=Lambda_U_mod, size=numpy.sum(Lambda_U_mod), prob=pr_U) - loglik_j = log_d_multinomial(x=Lambda_j_mod, size=numpy.sum(Lambda_j_mod), prob=pr_j) - - return 2 * (loglik_merged - loglik_U - loglik_j) + + N_u = numpy.sum(union_catalog_counts) + N_j = numpy.sum(catalog_counts) + events_ratio = N_u / N_j + + union_catalog_counts_mod = union_catalog_counts + events_ratio + catalog_counts_mod = catalog_counts + 1 + merged_catalog_j = union_catalog_counts_mod + catalog_counts_mod + + pr_merged_cat = merged_catalog_j / numpy.sum(merged_catalog_j) + pr_union_cat = union_catalog_counts_mod / numpy.sum(union_catalog_counts_mod) + pr_cat_j = catalog_counts_mod / numpy.sum(catalog_counts_mod) + + log_lik_merged = log_d_multinomial(x=merged_catalog_j, + size=numpy.sum(merged_catalog_j), + prob=pr_merged_cat) + log_lik_union = log_d_multinomial(x=union_catalog_counts_mod, + size=numpy.sum(union_catalog_counts_mod), + prob=pr_union_cat) + log_like_cat_j = log_d_multinomial(x=catalog_counts_mod, + size=numpy.sum(catalog_counts_mod), + prob=pr_cat_j) + + return 2 * (log_lik_merged - log_lik_union - log_like_cat_j) diff --git a/docs/conf.py b/docs/conf.py index 208045ef..2d3f07d0 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -99,10 +99,10 @@ # intersphinx configuration intersphinx_mapping = { "python": ("https://docs.python.org/3/", None), - "numpy": ("https://docs.scipy.org/doc/numpy/", None), + "numpy": (" https://numpy.org/doc/stable/", None), "pandas": ("http://pandas.pydata.org/pandas-docs/stable/", None), - "scipy": ('http://docs.scipy.org/doc/scipy/reference', None), - "matplotlib": ('http://matplotlib.sourceforge.net/', None) + "scipy": ('https://docs.scipy.org/doc/scipy/', None), + "matplotlib": ('https://matplotlib.org/stable', None) } html_theme_options = {} diff --git a/docs/reference/api_reference.rst b/docs/reference/api_reference.rst index 6e3ce176..e85c5723 100644 --- a/docs/reference/api_reference.rst +++ b/docs/reference/api_reference.rst @@ -159,6 +159,8 @@ Catalog-based forecast evaluations: number_test spatial_test magnitude_test + resampled_magnitude_test + MLL_magnitude_test pseudolikelihood_test calibration_test From 5f32fbd0944e0cf5b56f8e6594a21da379926712 Mon Sep 17 00:00:00 2001 From: pciturri Date: Tue, 26 Nov 2024 16:09:32 +0100 Subject: [PATCH 6/7] docs: Added resampled M-test and MLL test to the Theory section. --- docs/getting_started/static/output_37_0.png | Bin 0 -> 89722 bytes docs/getting_started/static/output_38_0.png | Bin 0 -> 94700 bytes docs/getting_started/theory.rst | 86 +++++++++++++++++++- 3 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 docs/getting_started/static/output_37_0.png create mode 100644 docs/getting_started/static/output_38_0.png diff --git a/docs/getting_started/static/output_37_0.png b/docs/getting_started/static/output_37_0.png new file mode 100644 index 0000000000000000000000000000000000000000..f1399388a167e506caa98dedbb19463086537d5f GIT binary patch literal 89722 zcmeFa2UL}3w>7%e#3Z%^6j5o4A|e72l_D*PAPOo9NRehJBGROz)D#s&K&6Qy7?38t zNG~Q*1XM(%HwEcUK$^5W*EZjOzH`SN_nh(H@0@?!G0q-CMclmmeV?+{TyxI#=za2p z;@VYPRxuciwMUQ0t1=j0c`_JZKKObizEgZlzX^Xx+AC<;t6873clz1ZgmL_5`->LV z_7-M_TOCbo?aZvL_6bW0@7=TYyuJNJyMrPkmjCMw!q&E?BDI@Gw&5b*Ts)#}$6yF= zr(esQqvaeK%NUHK@;|COhYhtkxz^P!$bE3~OjZ2hhc7mKm$Y@=#RtnHB~sUD3XWVU zZE9}LOWK(F$*!jPOw#%v%?H~b)O&yJrNb$)ZCR6x{};9%9y61{_m+uo`z}X1!e5cw zKWsvBa3}kp1-36MlyzW@By4_E)^n;41z z84y|y|FamFo8o^K!~fyMpmU`@Nk>sbL&Mm_L}9Q#Nzg@7=l6_iS*h6r6_u6O3knJ< z^;vO`LB|+tm@~$>x$TQ5SifaDPQ873Jk#wi*16@JvaZhFM$MtCI5e6gBCaoPI&eYV zq*$H7@O*KCe$FC;+kNJp?X+9pAJ=wYm-H-8bq*w84=th>AW^b~8{Rz)rc^@6EpbF;^V!&xnzb(#jpgR3RFZb(c#-&Z@3 zk2?=Bcf;j$_ECgRebHYNrC2al#=*iemg2D>xN_|l^_VV=2APAOQlGB#X)y38{Hx*X zP>X9^j$T}jjoXs4{H4c_C|&Bk@8q}LPr^`b&uRu^>voCdTNsSSp2U2Y@5RN%+wsqt zbADV>Vns`fbFAgd@p*9;%g^E=?$st}rksEM@MwC$h+q5KOBkBl5#pB3`!7!poc_a{ z(nsSaKTjmfEXk&(CYyoy*s_kL#c3}uXMEZDQfl*y*&UBgCvf+(zYo zzMJ=*E2#_;j5->yvnI``ywRz{t;+rjM{SI8+1zL`&-$Imyk;kQ74IK(Fr?=nY0Fp4 zIQK%VA}sXm)KJsj%OCsh$hv*nxunm>>OC`*QQeu4QgmI?uBT+YyDG}2tE?v7q)KAu z?QeoZ3z|(uvpx6jeE;)L&+ki#Zxqqzq&w?*aZfSZsx9(V)M1VTQ-K0%odGJc-e$Ei zrMLN%c?AUpXZ1TUmQjbUt>c&<#Yq2f$SDD`CiuKISiJp_*VL+g-5-%X|#0pix)x;Lq9*g8lA}{W}(G< z>&TA!WW9Si6ECIK3+ZI-v3Z%8m{@X3kt=9sexkb8oompYNBPsi-kzT1Y4hA7|HzcI z%!Z(3hdFNBXWPuC?@8DgcJ|6GU5dO=_lPe!<8*?C_uNRn$SEzYJ4bd@P8IIH@G?x& zn zqZ2&MhP_~E^TmGralF|y!p+cMX6i_AgG_Vo{=uv!yK0#zwb&Egck^|!t!)1KhQGvP zaU$Z*0rUFHEy?&4eYeTFK5V4<9`Rytd^gZ6`JQ!=TsDZ@#5Lz$L@(Gm56!E^DfSHER`+$iu1drg;5Xj%P)_8 zZ{PQ-?@hc~!FZ)$n&WUYYs;}vQ9kU10*QCOuNNC|Ie<5uZ^^Q3b)OsFYuEE!wWYha zw|uoo!FO1>*9TLIi&`g6UuD^TSRQXOdiCJPTleniT*!ZH-cS~IDk{=tdc`J+V~A$pG5$0B44kELL5K1k$Tww40hOX-Q{Ii1%9d3ie@ zH|YClXPgVVyl3or=)NxeRk>eB9}91{Mnl1+iSuvbPQ6Le5f2tI2$x=WSL6gRw z+x5ernLW7_qXrUEgf$`p0@f#;d3;@-mqjh+*wL30?*mj0pEz-%$>7z&RjXD-T6YwU z;hA>~-W9Xlf+cqY!(8(4Xn^7Dcz1=VphlwC`V$h{ie@@}&euJvJN%;Xz}$545?61y zi&fgqBKL()w4{&hV7(O*!mb=5?Ca%a8h&Y~a9&@e?F)xChlbL%;;knW>5XY!eo}{N z&tnPV-65_TT3VY{e6{WdVgbMZiH_TC2oyFo3hZpFUz;~1bJ1NRdX@hA-O$QBf9guH zEHcL=3qk0X#99?OndG8R16uixmWfzli&zZh(INV03|kbrFYVa8^K{ag11F@0Gkx#6 z#NKzjj{8;^Z7(z`UYPRvG&vY6t+Io4Y_>O|TxPm;{dAj?f$a!(Z)uGp4;P}t{N?hc zx4(UR{YtURP@3YJ&7wQ}Bs#s~&OE*#Kc6!|^yV15E}kUb?z~;N;KN^mXDMv@DT@^D&vP8UYim7? zIqXEL@Zzw_*|s@ZZfSnP2H~+RNK;?CbB01_rHBN!B0tjP2Ks0VjCX1C(ub$tj@9c} zmrhj6@rV?B_$jRyi|d^IV7(A8uW;eV*MVH6gNv_^o?6Qxwr6rPVvKJ>L2WF`H8KC& zBaFq0YJ?Nx1$~#{(*v8h4%#2d8mvpuOfQmlV)%2*985d+;%;UG4c^WRZ{lu+McMVf znD2dS;s7#i8*oqu2!DCS$wt6;^r?Hj9uS4 zG1q>kgTL(}WmD_{q57UEf7$CI#q;SUvfVZx{``vH>1|Bcv+e#jszi#VwcYW2Mx7Eb^408H}>Ubiy3$iJU@>&lf4<`{7F)G56y| zlqfq9gHPly<@SbiV49ByN4S6L&z!RoM%455nD64L7{|}558N8z>u<|?qobq-Sddh+Z#4OsbCTTfkBeD6kgqEWaP`FZ=0yx+_pzvJ?Ms zjOs`Ic1+vDH(3aXM+G7-55${QtL;B8oB*83o7G~KpV{m<)VMc#{^_@J7H?X0qJWyB z1FO>W=doCXYo!NQhR~L5cH8d0=3qlx|3RzPoIokZ>@Nt%0qgCk;*W5(4PDXfFzUVd zX)wj8z2H)5^M31g>Dk#5@AVCHrYy*CqF*y_w>|HVmZ7GMuHvNy>vU<`_s;^qJ8$Ig zAv~}!-QjPZoVybtiVH!@ZvTZhyAa8@1FUsN_1P5jeW~_2{G}8x9@K8PDd#dO=W;sc zB7;#@%RFBb=_<05cdEs@II|@=KWaa(;aF#Bces;zU_?ZO?fV&8ycCn07l719pH);G zO&G?<1gHvEP51K;jvUiZH$F=F__>jV65GO-?Yu}535J$_(&NwG_tL~fEY0_hJz4SX zL(UYW>XV_5PEQg3-VNl^W=OETB7k49#9vVsU{7jxR;4-1k^@0C;ie=(&6yY0?(2a7 zv~xd+oXLzU`GnLSJ@nk7qsT3^+zP+vJ}r#=W8@PB!RUgKb#<11-q^g47m-?9Sb1hH z0O=+}>x1^~$RE%3zPw*0t$Awo#yz`gMc6GaC>V6*NzGN6|M}~er31n_Z+}HtmNG=5 zWEtza|BMp#{D@Pr56w1^HH%)pqc2K`gS@CL;x;%kLqh>jX5e-k1Lt>FC{8`UCoXc> zk25q;WH2o^Iu|3>b@R|V0jC)bmNaB!)uh6xtrjU6^;nwgYt3a& zHBI}s(jR_^FHS}HP8DcehC=TD%8dtk3xhm^>fpo?rVCzVeM6vNcueoHr@|8 zZq$@+BG8T86>{lDWPY4-hQRV?Lc{CczL?!IjWqi5T?Yr#2c&Up9Oc$G*w zVk0MI&CYK3@D#9;@0JYIFVV8*2%xPP2AijA#Y+G@JCm~8 zuV;6-OVLfd7x9}nCN$*y;jJ@^kp=s?rwcTQy~1ZSwkpq}6D)M5WyYowxO z^*!;F=XTL9L#WMs)hYpRU9PmQDBu(Lw527}Y`r3MAWa1iMIsVs{Ri zMf|i{<%*SSj?8)WAdQJ8IWqB|MdSC{iXq9wBu$A&9U&?OC9VGx&8!uhDG*&LRxVL*2 zh1=N>87$AE6nhzqDoAx*NasQt9<4Uz3izA&<#{|_Y@kz%Wp?Hqm8NEotH699A&F?~ z=h~VOC16%PL4XYp^xCR8`jIN%q=!?3jH48nLUD&evD4rLvgpIQWQ>tW}z z-n}-RB}%$AOZLOf2cmVGZ93R&L{R;CGO$t3auJKNM=x)GcUNq_jJO7>e$`5a(apjy z92)dAW4Pid?N*+u7b%)ClwSB)%P};K;Vs3s3!9SGNsn~ehRQcMe#t6-cq7WJ6Tt>9 z!;do^TigL)s4R$)QCV7CP^+Y32#fz)jv;YSKRGCYYr{?FhO_XoAcg$R;H&u(rrxyz3i6PxDMo{$p4E=p6KW1@KC!FVJ8(ziAl z0E$zZy~3`)OYJ)?EH#ONxTxFRL4ulPY?``h?Xm$ok6%Zu+e=iyl=N^*wo0fef~E~% zSo!N{W#!=v@Dmb?GhIfg-p#7lv)BwjZixB4*A-9`=UO*Yg;^m8j<}gF8h=7DBS!}dzYXN4(yoIJ0~=_)RnAdW z6Mm^Dlt=+r+z$&2)wY?vO~~IqSME}^H-uZX0X7cFsglNmL7m)*yVsoWWH0s#7Sbuh zGR`jL=4pHI<8RK0qT8{$w5O5lJ;&qRX%qA;Nuc^x%m%=q$l5~*?j7cRh;N~ z(dAS;r{^t|wtDsIF1e*y6)Hl~5Rb}*vRheER@!)P`vg|Qu zRp5*OIsb6b?$d_NnPvh%>!L*O1ViLRHvyy=b=cRrJ4mw=2;ivXVMn4<0RUO& z5Re7K0Vb)CRU2q1lyWq;?T-#A3pEW7-Q)4GMlt&8x!l~`(!bv57hYBX!Z9lGVyVcZ zY8hd~s6o%kH!LhnEA{M;RH&|6y?T3R`Dh)bcx+ee=D}8z5WP;IeecDEIsQ@aaFk1& zcF*_LU}&jW1^4sp#f#%jo2Ab_@!Yj*mlvitv-jZa`vAb)%{Him`5Wf3-pep~?3i%< zA;6-V9Gk8mQOYUn#4 zbWn;HN;*q@j8KRWH7Hs=fp}PUjmLeHrk=xT^%Q-XGg%g!siHwpFPop8*e)WH(rEQz z=kdEGa*JdBs^vpiQ=E>CKaT-bfN1_@0%M?DFglA-^#dD=rj$+7;?1r4Z)HB794cN~6mS43R)oaljP=|FURGsgJaMNX z`j_L6{kWj=^59@%4x(BV<)KL*b`igC*6%Cv1@fjK#I*-!jBjEc8#%BgOx)XT+h8K_j{>7u%9~Aq$!;90~Y^#LE`eP%?utGOt zDf-~qVmPx4w$boqw_g@aE}UvsEnZjm=(G>D{B1TJq9^QQVQQ&;> zAQdmI2x(&&mW``@sygGM{H~*rKxxy;g51`y^3XV9&|$2~&XN34ztDZAhe1bG$xQd8 zj~309p}y+EQuG5d`TmhcQeOKMjWs4>&($@XSt-nfp(HMCe*gYGb5ed=x%N6jF0kAI zu^d0#rXZ0x#IY-_dFXQikAH(lPBt6}Py*qJ`0-l-0U328C0~J4DNZa==~c#1r#3+q zDQ!$MGU|CAN)-X>DepGN7NI=*epck=^4WiT9L1SL9?f5{IK->F|K706-XKwXh`8n(#iHijda*&qmWpQAkfsVP{J>s53vR0 z%l)_lx``B}VXD;m4w3cbPNuZ7wIB4s5dkMK54Sb&Q;fiCTu<=F=H0iB1or2=)zrVl zM}>~uf;FW!BgESpq>$r}3ISV~I62%DRIImG?ENM|Vrj^m^Z_r9km=A$KQ z8A@(6uel+pWEmE}UkED1pA4}==w9Db)sWeob-sod9O1V4FY(w(H@82)w2P_(uaUA~ zmYo90jA*|xlqIG3Rrrl2`7kVYGsofCSukn7^t1%(4P3_*h@}7P%4#EQiBlkVh`b)k z8%(AhSvFSA!-Ek^7~&(9isQ$BlLncjINjN2m5{z-Z2sxr{+)@+{yV-&wZ3P%4%lQ8 z5G%$p%@8Hu#FemNSP;0ob%?43;H((mc8!x&Qc^M~du!Ym%g;8hD#Q=i0AQV-5~a5? z&iYIt43q*n>oiq)zNln*#r*cae=t0_&L6~DMbFclh4Y70k0#JZ9Xa6k=_A2KCD$qB zXmOM>X`z~5Jjv>$0G|6(T3>bT&pKNfSCdX+i>p@V52Y&u*!^)^gU0seqZ9WJM$67M zRl9G*5^s0)S$6iG#>d|NRH2I`(a`I^(Mk}f(FExYFHvQH;7Al6(XuNTXKTk&gy_2u zetK-tBsxAmzS{-VZp#kEALtqIGX7c$wawPwpbqZZv*(69@2Mu`WuCslpsi0oQuhXz zQK=7x%p#4}$ITyEz2y_nJl-8Ftha?=Dl{Szq1AH$K@|%xPeuZsoXR+N{1;TiiHB%$ zZ8ikhCiwucB5o*}@nmNZsKtriYJXBKLBJ8Wb)g|yuc>M|!&B&2=H09y@decD?)fjz z-cv)!fv)AtCa9r41*_6opRK55J(F5h-le#>FKg7`WBq0uK5w3f9_oq49$-mCE9eH$ zW+|q{fmJd#HO=Q>@w{>K$PPlLgaed=_Z*d+?Tjs64? zrZ|WEHuFxLu~`7%6L-mV{O*2cNCl_}sD|W2p$8BALP>WUFd>r#uqdrx_`|8hUv2~Y z;__6XXQ)^yOCmO@x^KQvahq@XTcIb=hY2C_$(kdCs3-K4-)1oGUH33sh6hMI&(JM) zcY7zoXt{y$k3)_AJObQRwtfHW^YlZ>*S)-;zbf1lvs7{ozITs<)?dNu<&4Iw>hVJe zGK}tkBRh!iicUtF4a(fYh~rdP8mX$T_QwR%>i4YVXAYwJ&p-d1mWOPur1cF$J^Z#G zt8oA55e$L`mAq#KPrn}7SuVFCH7Q;-dd5F{2tRaIXD5DVzMg$Y14b{;HQW9L-}F2V zUF@_CfQ}-PbR=NcDNs}xK_&M!TlUALhiIK+dJ@dH$~?XHt;%fPS{~Vg^bqj!#t;6E zyU)~#gWz=gShLrpGSGI?08}K=Ui7y+l6L3z7!*nK^4i+kMuIeC3NoYu+E(BhEV`L7 zF!dW6ZNGy9arFLXH;qIs7JQmNq|VFUw;j!#P=hJ=2T~Qu@}#jmWgmv)(EDY$q@U6Fj_@*Hkf9Dnk3+NZxKY53^;s^ zRtoJ-0)i+>j+#Nw24>Q(IeGArEV$&-)n6M;?1O zN-PyN@pS_62c1SZLEgD}+pU2fL;y%oGx>&>*I$4AB>@Q5MPLqsi{<=kJonjz?KJzI ztENyS!~{y&_ubSeCMO2U)BHvtJF&(rKz|#|L%E3in2*Fz>Qh7LxGXHU5DZARL|QEv zS`A?IZ)UyFb2X6)0^KAO)}8#GDQ$BG^W9Y;<)|0L`@`@?i%@17e6lm!b#~kt>&)oW$Ns%eBdt{Q z;FA=wr3_OFr>-MF1iK88O#>*FG zLCU$HbPqf2-9$3cT4dhX>oPTD+y71V8K~!m7VE258a6^I3f_UVO+DINX zq9Fur@0a(b6p?p!ySCG9P+@`!knk6Q5dc3KQtly#4jlF^M35z84{7dDM!o}|>@_vq zqKL3c(2(upszuX*H}PXsXhASA!q78IKRg#vO9)09f7p=|q0FC$2kV;zdJ=V!?Y4cI z8rHcG@#X4`B?Nuoz;Gkm3Vw1uz^PxEF9(fTB*1M=>d#MC>G3ldALM8kcv?O|b!qtF z?VlCnI@X13v~kb4O^lDL{`w~4 zNblMN5ta$n%uv0Bp~4<)>uxFbSPHc95WV>J2|O9ERyG9rMdth2+1l^G<1>(3+v25{98n3FICMn+Pu6p;TSUL18&c$fR)DXfV{4i*g-N$ zgRb3iU9d*C?%&soX?To!HwRKk*DXbEZ!Ao97kvOYqTIVwJU*#mnZ_P7Vy6U&GRBE& z8DaogTi^gI#a7}#ov%lAyP2;}vj+#ww0N7n8dR0-dqETh$|5{Dc`y6GVO_wI-D;~$ z{3xG$QiEPEaeU?6E*8Yp`4JXMdJIV2&(!fxzN2_SveOOdxJgq6Zj+}GZFkw)*@H`qdW}Rl4to1m7OGdr0asZ7rHQQ zP5Wtae%9=<9zY$jG-DrYRhUF8jZAK@8yTja@2kE6!Y;V^9Nua}yayHDq+~ZsIil`* zD)Ff=%I8Yd;29{f#Lka_ZZ5-QoavcddXL-jQ9B_S-6+DdA?V1CPSngd$jjg-`>D?v zb$%6_vYOl+fH>UplH*VnqL?AC70>}}UA(Z$c*f1QZxs~Hnur%=Yo!HbH z$ZLR7GAu?Bh_=J|Yi{^+;w>@YzUZ;CsK?N=K*=4+B+D z*up$kHEXbVdqmy}fMGwFc|s!u!4SlmTJLe_Iz*3<5I<8Jv8di7sp!YaoLBN@@bW?c zB##7YmGzVyM!wU}UI0bP;sijwvYdE+X2Fb|{_qX79T^~v^>Cy4^0?1zLutC6MQ)Mz zC)CSbpy2jQ3_6dMvUfcUII(-9;nIFh)WU{=|-V}bRe5JaGc#Sb)sle`aQteAtk1gU>1?_332!dqHQkuyJZCVPs zehbYTs(xWAxMrY7QBWM4>GD?u8Vs=HKYn)u=o!aQ$A=5WOVdlY-;EySzrTU#6=)Jv z1%`$7!l(j^4lXD(OB`A34LkZ>da1t)EBcs=5TEwr3#WB$EBGjU!4$OLj1^wRg~Pu2 z0-5Fw!pR_gHi=v5?twQAV0Q~$99v$T{6XY7C_wVG0r468F&|QJ7qarMT3xEgiFgN{ z%|Q+$(jRC5I$S4?7hw6pHpM}@)5rc={^$-U5^M(Uv)z}=g^}REKp)_nPr~Ff313Pp zxS#t45l-_nV>N{?(_S-U?Axhi7A^E6JA>AY3&enOFP8130FO;J7%&kKMTk9Gsavsv ziyGnQ3a}(&-V8`&gBVHt-1wb+rYF?l{UQI#4BkahmzjLv&RGww)eGF|juw>&SsAO` z?%=?^FJWT21G^moFIh+xl$pE0nEH_Wkt|Cf>1_V|l3gCltTIy!5KBhqWy%VaFsXI< zBv|^zCjt9NLq7mY^Ji^oNYvg3gvKP45DoVN`(&t=k03)-CYOLX5g7sWVjZy?L3m(+ll3%GC27>Tt@ z3fgV+_Lr~9$oxs*i*h3`FHJ8TfZkYW(!;Z;A2zVC;2BhikLDZs)DCXE3kr*Wk=tCE zU`hcii(I?V0x($#*1!HhBNR&)A|@(qiQ@d&SA!DSWrMlPlVx8qRn5eVm)8kNmO65! zRAav~O%&gFz_80nImUbXcte7w$V&+2eQo(p`1$RGq(~AfDuwd~mXpL^>9C?jZ593(TA!ISqBEIjt{n ztn%HOKg#dmqo2waA;AQz zQo0b|w7B>X3wSR`d*e$(jcFD43;SoF_=Y*QRG!3IViI3~l1&>oF9tV&WDTEp#W9QEc4rp)!j73ax1 zO|{D6g<)$!<5mi2x_^%|hvt5%xiKFvjxG5hKx5e~$Q zYmWdrQu-Xu&o< zQ_QN(bA$#;ec1V{x;HyP;!_gvz+;(B4z}jnh4wx=4-b+VG?n+|l!@>YzGR2Iv~;n= zzkL0-sKqEW;f_*D*g}$VzwNFQFLFTocX@61W4bM1DW&iUiBwhg`qg(i;(9 zYOM@DzI^Y{VLf<8JkWPnOHDmdKsAk3*`4_zn`85zzkI_qHDrd?2ARhER-H} z=8!1j>6>Lm_7kK(jmAcW-xA0uJO8- z#p+y&5L;~^(v_K~6mDdZ<8E;4@)a*TF5b35FVEf^z)yOe?95xT!QkFgo)4lXtz>pN zJUJ}5MVPJaRPJ7}Qmgvcj?NoT2S;5LtimvDrb-f9PXSDby!;JLNl{oF9~5`i>n$z-d^SM-)*rW|-w;bnShaW;!NDd^9cZ*zc)WeQeR;P z5Li-bT2=bQK0UcFqd9J)j(BHhy^2)ZFa#C>2T&6!VWk_!ULE?DZMBDa-6J*`m#G^V zATdhM6vuA=F{#3%)2WwEtKD568(wr;B(FASzfOxw5eNhlcxGUY)gHLtgfhaL=zh3s zImm5CP~%*6xL!|g<7M#9Y*Nh&vHr}~6K=*2hnW(ar?1Ax^9>HarTd=Ve_pCPP>q0D zQ{3Kr;?_l{7P95RVTg2+`jWCJ~5Eodb&-Ta!2pNJ0ZeIBYdGJE|3Bv~a%@G0aq zUd17&mTB1{2JNptk+lV6lWWHCI&Ku&mBR1^yOhCtP&;sM)7V;$u?0SKY9faT_Lo#aW+Y~V8%`>nQR=rsQtWr+U+gaF~pdQak-g_!)nV<_r zQWV)`dkIX>W8Wr~uq}s>%B&JCRzS;%fWxot9vQJ#wvaoVRHDz0Qp|5m@sml~dX=|w zF#bLuXHGwB3^j%)TA&-Kr0BNBxST?VsfpykH0C<7uiGLM)q-5~JYs5Wn-db#URWnH zo2P&_q6_%kg(?TZe<|n!j0re^ABcZg2S)uID+6v6^NOciP-|LY%z_i%95o*;? znx%Z{;x`!&BAO)PigC2L7-9FqVzToRaZO5V=~8eN?{3b}!`3wg9*{~jXZ1_H-1 z!W>vIO=pYAy+3@vfZf2=rcx%HxfD_To9LVuAQNoh_>*5&7=f3edn1MP`jt*9()p5l zJb=l9RZlp@_5w|CB9^spP;TBuh99^yd9@ee>+M87Z$DcM`yMe0Rr@t-rsw%WbXid# z2-j}Xc@+5z$=iZve4y<^nZ#y`CxVqi?1}rgyQw0h=r%bui%S_k@mywBP0od~_}K8f zd-z$si8Z_d@+oPtDnvxY(R4^9&uNsKZXjJ6bQ$^1LPyRDVJQO<3e&RAoU=GV^(Zl% zNX;5C?zD_J9p0Q0$T!ykNdh7)p^qnf#-oFC3c9VijQixZO=ECTe6h$~Z1JFa{K+JA-ws1ZrDN#s&?R4w6;J zFuzba18*~oT``1Mc+b!b1;dNa3urrm+rV*(bD9Qj4tsQSzK?c?*% zvzPjZj9_{=5gYLhA~AnZ%alo)5xYt<&SttEQy7*X>R(+L6yaNUiI z*L_Wt0n$JpJOh=5okR+tnz2fsga(oo_qm_Y^FEl%n(39b7wZT#YPj?hqSPI45?Q-H^2dyog7)44%(k5Cp1wIL^RM7gK+TauRt zt7#7$;&_Aa;&>#dAoE#8DVTn(tD+dBcLp0Z+s*#yee)g-K%M6|tzIaNDO48MMGgkzpC`0G%`uiQ~lW zk%??9q9D77g0jn#Z&Z8{7_tN-#nC?z1MUYnq#)(vg`E)Rg#;in}JrRq$b?2@pP?n30Bk62yilLYLY?A;=jl1K93j;oP}>5t;K77u z*e=Qz)K-LxIEC3(3fR1q?6tT!gc^m3DL|Z`Xa)C7?x-?kKV?g5=;D%cynzC8_X%{O zHeyJt<}Zs~Lx)fa$`dY{hJwj@9Wvs?v<~XrMy)}XpO2t>PoRMh8@BA+8OtVJyB7z@ zEJYc|2tAH`S@9^F!dymjZGZ$6h@F`%Y6&BKgg7Eyhq}{aFs4gELOYds9LtyKV5EM= zS$2W?I)qoIUkW+y233T6A%jd7iNkxdg=#{i@KUqb`@yz*Tohc0ZG_3wiv$B25>jTZ z=irJd$6Gd%7O>x{)j1#uB6yaGw)bt}^~a_)BLK4Xg83qtMT`FZB>G+_CD2H#x2>nMS zy1W;Di#d@8m?VOb%nflE1-_I_3(A1b2nN*fM-*=(3XDiN)rdQ?a!BdsN1pa4zf{bz zP*y6?=sI&#!%@(zNT6O7VNF83`}_>$4dUd}Y`ZI&ik4NY1eQzod93y;OPfzng8;=P zVtklg%18!eo|P_hC1osPVaW6px~Ep%Z|JzD6GKK^&O$OTpQ{9=s2D-jXDF`YUs ziLispgE1Db(nWx4HC8Ny%bF=lfjziqJYT5_t&0qz=*o#t4^jPtlu=}+lpz!KIQm)K zk$8(M=}d58S!BEjNroQY2p>85juPM|K!`~)^ysEGc)UE7m@*`N`7czaPbK|*c!+T@ zRKdemR#x%V5XkMBm{Ej?rz`f_dm)7}rS&x&<@%H-+of+p<+_vX|q3m%FH z3MOdj@!pF2JqT79fjxWnXlTCfxCP*nluEUGmg?z882q8fR!cCjrLxNm0LV5 z4`bHx^}{!83;Ad<$~r*p0-i})xC||p3R`?2T6$!VJb#{E&)6&kmj(DdA3cwgpv#ob zuu#wI8FUjSm6(#4hoQ3SfuqMlipD9GEddz@CXCqm4=&U}0sA2_F4T03%+Vt(&k+3y z1vvc4JOB1(2y9%W)j|rWnM0yEl?RaURU_mer%!1&l^3y|*u7X~!JBw$A#dnLg zz(h}5YpiNd(k{6xPk=9XIdbk~7^i|jdhNwJXMHFgeir^G@e5rqc7?iVLzFvM%xr2 z-cGW^!wp_N2DBYAQ-Hird`>wkF!E4v93T_mldMQYR`StlkijhLsGsLKA5jnogpj)+ z*X%wp@9RYpbSI3SKE%{x!mFgK$$(D`ZI{1X(VGwAyoS)|nC-owV7LJrgeRowX)vjh z-*`3|!kxry&10&B)v$XaHP8tkQ5ZFWYO+sDfJVXj1rKFZuqndqUmsk?umVOzj~UH9UT)Tdc7xe-(r^%95Z z+8%`y{{Sy9Ic2E52&ET$>2gEn%`h5SzxEUezyLZ0w077c&y?cvZ+C;aD4{l~FQ1W$ z1q8v5?HN1M#j|uLu^4cAs#7m!9=?MGTA ziA-e*@J5UU^kq9ljVLg;3d8ewDa$MMJdh@3B#Z{;VYzt}=3h%eE+ur6UVx^JO`^un zR`%ur{7|2Jg)OjlSEXRep2u#;{nTcCBt9Qtzz8vrBkZ%ojv*$#?E9b*;0hnaSH3DJ zB>rHZTnpWR1q|Ol`9;9tThNe~N0$quKBgYlH`L&FsleWB9qKYVY$Ko>`ezyZ`Djr2 zJWMAyfAK^;FLHWpaX_dOG)#`?q>jsizX zCl;`ZCEU zDg=`GR4Zn3gQXmD3l%cx$KDt1PUaDZfj6t}C-gOc9+?N}xhw97hC-wCE{@Jclwe{p z)S1Kpkleljkf!aeGb!r=*%nRd#|E3A8$lggTHro}O$=$XSSuepQ33lpm=r|Bev`Wi zD5wOwBhBG_!ppPr+*jYTS>fZyz-CF(M3c-;eI?OZdeCN+auF&_?xN%nL?~bb-y-Dj z{PqBO0gxwfxxQwlyRp(F*TXd|q!uw+yj1j4&*%NHHREf~rUyV!)HWRnU8DwEgHRt8 z#k8YHBq2*Z74g*BP&x7z4j7s)PEzzBNjxq|^SK(Q;BR$8@zV0Q<1aIc_Ers|nb(ve z@=s+*rFflf>G}G6eS&FqI8!l3tm?XJp6pFMv;Qc)$>&5X2NjkL$o>+@-t3_NkN3-= zi}^DbJ)__skc_ku+MorL7&s0SyPzekaP*2hw)|{;0-k;>BVu7sQWk{}DA_XW4)#3= z{6tZVDh|VlNGY2M1n7b?!0Z&K=PxADs!1>Por*uG{Xy*vM6ZzFo%~GDP;KTw!{q;{Ok|b}8(1>K8Q2?%o-Fahx!04EBA36#&N_^kD`>pu9~VKk36MYmuU1K{ zk@xWRl@auYT4`+M6C?Zmyy9RKN0pPKl@Hrh?C*tWucKOD^aUB21JhsOq$a#Pg?t%z zjvG=#w?OrMsq7L*NUl0cmw>TN?#7;<16&Pq7PqDf9;(BmSGg!~G-DP&-$iOX64VY@ zMbs*Bb-paYEs-a}B+`yexI*9>y-m0KC-0?0k6l#5Kxmo-Rjcv@iy1K>uE zxrF1aA{YVD=?3<+8n+uVC5?Z$fpWoE60|)XG>|z5CKsk@Vy>v>seYal8 z#UrKJkG9LSJ9qgSw~^R`eAKhD7e}LvfyIt}!v%k5bk-=eyjJv&RE(o)<_6``ZT0qb z0SYC7ZuFbVgS8Szb8gl-f^|*G%+IQPwhmJT8iVN56Y)|QZe>f4=X=W^27*|;TQ6;0 zIH>`-YG)O~i5us|C(H0LAX+f&658R?mu#7&D5kIK_iwLo1eI(C+BsXd>dtYogRfjR&`mBswLN zkU_iOI2Sv>hE5;I{>Rc?x$OJsJj5>IM3nLufFwK74lR_WGew#%^B^KR@4~kO)>Hup zq7-1F2yE_+xo349ya<04nFG-T>iU~GSX)6gKP$wkY&E|t!WYO32`xD=uVZ1vNkGc` z@1&r-jS-`sQZTMG1Y1E30y2{tBX$?LDMl+FLTEWTYAC(VPo{Vrzf_N6n1W*FpSj66 zfrm0kdKk)SQt88-X#3Nd{167FbxCDVIBpZ7wFE0yc`m#nJeDOk`K2kFe4= zVbsb;01hcf9*kW&AsX_DSzY``Kv+|^+hv)>EEXC&aim^e6k(uu5qU@O`Hq~2JM=3O z`O@5pY9t$s9gw&L_xlU4!OeoQcoQfx76WA1|5X>}!(X^bl*Dm4bY9QxNn#=B)QJ*Va+XR1KLD}?O-YkM9|E}O zr|D5190jG7?oLc6C^^JoTQ}y3utZl=j;O9g0T09Mx1G;!Gfm-6b=gmxDJSS zBi3Ut0J=@kFO3@N&mfWElxNx)E;g3mlmZ{AiTWDvvw>@VlP?}$mx}alu5!E zjW{X+>T6AdvJk_z!TK5WAs%YV?4q7ea_A5jLZ=Zidj&z}e#Lq52Wp??kWrB@A-lp1 zxU$U@qRA1p7s2rvobPmLBs*fo5&5;Z+5L^1VsJi>J2S8ysNG&{+dnmcFddG#jsM1OmH+&4tDpN?cKO$9`X&xR%fidT zhT0IAum6zd`6u!Q^S=p)vHg4UrV`Z`#)R2WMD^Z(_PYQ1Zij!m17N+<4*1AeBlKVj zq^2?L2JkULO!bh#V7maBfpPj%8chW{PW21=v<9QVRO|uU;t=1jylvm1$Z30y_Qgg=8V=7Fk^gS+QiWi5&<9^$Tw)5RdmIMu z?E3#a7x@3flZgLqpp=nMnP=Mk&C!4y14KVbSr+BPf6vyU0uY@V%C3&!!--lGpSTVN zhwC5l8Q&3v&E-^Q2K>@6?@#vVeTP6@@?WvN{y*-{f7y>SsW_U8XM3mwCfv{5P36T| z^j*(Yby(rgs;Ux(Ob}E9{-XxbR&>-_1pZST{^0Sy6^H3eM4&$<*Lr+>oW=`(KI9{| zrPs^prgp!&X3 zIU(5{=nOQfIzY|?P+%t9<|D1SltG9V-D6NxP$C8q$C~&$8@w^tH1{Z~ZQc3VY7ajY z`Z*=NWblVyMQY_b&Q0hmYL8>muJ{ByG_i7YLz&yN5#CXtJwsqye+aAzL~wSJAPa+o zFc|;=u0$rJQS|sxgT9~K;*9Fk4lgeP9niEllh%dKlF!yQO!1SRos5`PI$ai}z|U81 z9DwRaE@KkYqGe&dg7UM0n#RGb#7NVba?Ha`s!lMYmq558#%c^j9+}iTaaf1< zeaB{jrgL<@42rfg9CJ}MyPGm<78gAcxPVSY=26a1AW4KAtU zt?uWKB5pIV36^zsI*iB5iw4Om=iOCX|4BNL2oH6;n>y_wOcu4vg2*a$v)0$ow=3Zy7}TfIX1S1kvnfaA6MYe<@h>fNt_%tdsfpDzj&IUJSXK zlH5OEI5qbh&!ak^L+3%wUPq+>uLm?QI_bucgwmXN?^ zcUVdUx>5Dm{+932V40sxd>X{y+JV2Rzn!&XVFUzwujem= z-{;Pr4zMI9tIU`Dd)Of((DHpu01BpQCOt%2VoWaB!dt4sd5)j2 z+{mila&di@3F>Ma9OkjJihNs;jFNvU)Bj)8=m2>g$lOEyMF-Cvbs+xO&Qs6clJA9@ zK6PY(^9+u!#=@OR6;A9Mf*L({dLHxlfm&5HvK>hMb+ zdIQoW_|lE>FP?PYH+3_zxq5_rzZZ{FOFIUgG}%=g z#eHst-J9vy5CJ--N~8I2ZRlhZcFB3v!sL`1=tqdo;CVh~k13EEsYT{f9PMsUM?Cf5u=@a$+aj+rf zm>YF3NZ_oJ-4-ri`tj#S5Qc0;}pD)zth+8rwbL0D7l-=G?IBWu*tL^_7h6xS*1k^(fDEPRe&mxQ<*-tJW6Mog zqiB~@x_m&#TJn&|GDZuIFc9d8jf&XLi-Q)mWA3NRh2nVnGS34)!w;@9>3CvGtNd8@;@$dG}=tbmwDMh&7f4nMx2 zGwS~`JFr0$YBectWW=PFKskR(A+P7 z9~(XN6SW+Gk?qTHSn-xNIu7e9K1%egr)4P`bGq<%5xZh=Oo|vTITol;$G~sv74lR`Q>;nTthi7)es;D>m%`Zed0yP{IMxw#2PMp(y zR~G-gAse4D0|%%f`d64OVsH;~Q%~mm-rm@{Vk|DEYmvft(t!E8)M!?Qn%P17zVGO8 z2Mi($%isOV=zr&WJs=0KVc>XPzK;*Jij#@?IN8qGP47EsoSArzRt^wOx4WsA0+P_@ zFdS-u1}8EwS$>oNS?hgho#YO(l@lnzfy9eCRfLX6tPRe9+Y-5V&$KfIpR^}d0M=vh z;0alQ+qLzd3qVgDxmM5{M92e+3W7>?Ynpwlz zFb^=76~ZzI%6BVUM9^W)ed+xzXGnF-v)FNvZq%{ZZ>+3>7Cw>ti7ftDE`csLP|oDQ z!PJSxNKIKx#D&x#Fzw7}IY_%2s%^zdF+FN7q~o%++W}>$|M;j`2LApq5T`h^lY&W< zv-UK#cmT)b{yB>+Pri8p2eQP)55r2tK|RIk^B~}15jryHJcuzk5ZwxW8) zL(ClJa<_39HF4s|YNo-DwjezXyl#g=%b8pANhahc4u|(6IE|kTCiLA?XYdds{#qW@!b&Yo^rXI~yyvAbhRzRz(Nn z9})o&LE4|WS0O2=$^yNKHxdP#^(7rYcg24e+Cv$pft~5=1G6cj*74_WU$IMBeSDOV z+}w9S4-HrZAY7eYC7^P(E_<&E`U zd&a9HcKyGqFh>S?mf>6{lS;WPbnFfX8vWrz>5u&G(KuvyPLCXozY$ISL(Dz=LuFc) z+-zNnJDazBlcAfPogJB!hkLXZS6Z5-i173GE@e1% z)SNoq(NQiJaCqwvtam@QC#bXZ^Pb*N^!1VKKfKmP`>4W{t)L(fY5&DCg&z*C^0I$8 z9sIlg@-JAA9LcZdkq+f~+IsZ9@lWIKNkQGMZli6c243HttCmy*N~=Rf#Ky^)h}~+2 zc!0^tCYd5=*QuX!ZM$z@yLQdh)m0r`ZU?MdwQ%&v8{qa#$Kf-zcX#xoZmdNi5^$QG zVXU#=^PMfCj4BpOQu(rF%jkdRfH&>jzC+W%s{^&M{x5Dz-lkqc)R2OI+Tg>Y@Z7I< zirM#_oE&axhnMqv^L;tg`{MAgl5)QKILXikhJgYVd8Jla`SQfy*-416Qdp6Xhc4ZY?x{p7PTzm2u zX9Ro~nsB!~>d!@;5f5lwk<8NH0CCiceGYEm*F`svbz%=7%BBo;%F4>3)3p%)O~Izo z1th3CkgJyM88;x)at=49JvDp0Q}MD(5qzY501@zFgyZ1SJ8{z&c&6a!rqe$ko&4k1 zw%o=>EngfQQ6af(>%OREYeK4m1Vh{xCN(d)xab&RuUtkKAaJg5UEHZda2Tp%mmP2z zP`~Fw2lcGQVy`j6w$(x`OgwIZLEMcay%9>HfqQnr-S1cxYy9HwX;@l~N4c0NbFuin zm?w`0+!{$*X+I%KACM`=sU2U~;Xn?BckkYbr9u5|ENHl?3a#)HYQ>>WsN^+R7wdz% z@c0)xiVE9gOK-m^ba6sYmvpHEuiGQN{4B(nbL(4hjCGbpQ)lFL(JX}YeiXNkV;EB< zjL>m)KVF6F=RqSl+C2UKBeurFoU*_p*44dTT}F9{_NvHwWQYmK&(CkmMNHncfB*hc zBQ!1jxMEZPPiV(^Z1{ii^(JsR=WFYiwTWpmmEh?eSGTDkktD-C+DP<{9(*J$O9OwV~{a(Lb=ggc#&+~kr@Avb$m+QLj z>vN@DvdN~u{`_+Zy4ZH#eRrxsV;MDPEzc-pL9B{bFEY!}Ij65LFFbhQK=*?>u2Ya5 zTj=Zmota1_?8HhNasj&|P?VOKk}vEQZ#l%nDEjgV%h=%Z_67#z<_nKg3x>BR_GGFb zQX1tbrBsgpG9VJ8S0%o_|4DGnnR4mUC66*F$|F31LN(2w8}Z28YE$_ry`z32U0Bh} zHtJ&0Xv!t--gA;K4l(hU%{qd%?)s0OaZb}WZ~L?kNyTgk)|Zce_~C~ltl7UG^o`Hd z&K>53iVc4rvr{#!xIuHzICqRWX`7lvfE$fi(?p7$H`*m7B?03%oEH$N`naF>x^=l{ zSJ?H|Sv3g^%J_|T^JBKRcNpbkxM$$eUOKB(1|JT28qnwdq4b-wN@udxVai{G&wbXXnD+L#k(zd0?{_uwNc&}@_OjiJC3 z$BVk_A1JJQ&lZawv%2csk$`PZ02tsCr?%Er6qqbuZm?m@edlKv=67fD+s3^x4Cib6 zP49UzyD_z_g~I02M=!qd9YK)3>u{mui5Jz1D2qtlv*mv5P#zn>{iZq%pK=145AOeON)mi*z05>DP%zD3B2Qn&wjgBHhPxdt3 zzhS*^$RfkEv^4j+Dw|Dxe%#<$ZD&vqi@Sg6g~OCxGO9f|Ijoq1IWNiGDQ7JXCQiD$ zb(lGv6T9HARrpa4O1Ns3>XkrfA8%mFB4jBHmSDwz#p;Z>DE%NL5+}*(x-JiWG(F0) zdN=Z`FYbhF`hM^YOP;cGw;O({Td5!RM9KuZ*>B%`%TrMee2)^tIL)L~*=+N8(HeJa0gBR4l;PG&C-K7lvS2Av6KT|TFh zn}wD#H*S$(*P(MXjGPQQ%$zwhg6$|mtD@fyhMYQy5`>!|K?c_hh;igxxM6UL%FN!OO1 z5!kCo&4;?z> zaX~S=anZR=xIIM%-MMoI71D0Uw{;j{WHS!e>EKD!Lmsh=2OLl@-x?~>_n)-1myaDT zR2e*a{)td>Y~TvhMKxtx-@bBwqP@eRbxVcHJ74Hu^`|HN2NthL5y=nZiMCs=-c4B( z&oorG8xl_D$c{e+j zy5!aJPch=c(4}Wjr`5#>P-T+bJZgka$3EjCSrVdS&p=gmh~#DDKk|xOVs%X=gDJN$ zoN(-BcWT~mcqAPTwca@YIapgB;L*!0JgscUH`bW>&H9fhB`U}1{YP0jn(wRzgpVRFj&)GzAzY7;8nARw6O}lyKevcmG|E6d2|0TyL>{of91y! zBSwe;cjaS1wOm1_D^vXa3#+X--o*6upQl2?R?%+tDv4iSteb2(NAo+XxFMrQ-#eS% zKJ7LwgxjNkzD-zmFMs*rc?R-eWDHm%d_59#W#&!3J@zmr%2z-CpQutEiwCu>|G3 z{Ok|VUKzY#;X?Pvm)mk=kzrWDfuX4ZmH?8mfwh>dACqC8LY-0Z1oY?3)p)$#Go)#V z0dZ4fdqLFP0u5zl<>f^|`i{Lfvs`s}FeU2e*?b90?)(b0eR|C7v&(I`%E6g+L5yVk zqacmEcyU7SaqBFZB{~Ky`NHL}(J0hhdFTzJP^C>FfaJp+9A_P?_3eAHrk*-uu>6m~ zL*I45Yv&MP#k_8IiK~v4D@Qoc`!7p6y8>xiEtTIuJm1nIq6nNGvCO>;7~IX7lz&xy zAG*4(gUkm`UQ=9LEH^#*Tu60OuHT)*!}Rp5K@qd**q1&2aqDC$$piAgQP`=gIQz>H zxAS5x&BLbm$UHD&A`;Amxt~TXw<->8*Rf+hpXl68&eVE*&?>-^sFwQcufLiGU9+O{ z2}80K_M&@3UG-?2eC=ZmO<94XZ`D|XE%(mz?Q6z~VPgo;tMx zF5aVHAEhRtsn1T;pbTw1y z;>riNl$FEZdMtDJ5TD_k_~x5$+i5?Y*bQ*-bi*sd88dv_r|HKly4yb~8?)-k-yD5s zk)t>fz~$D{wP7tUhHPvt4v1L5&Tiel`@8~$ab7h`;#PUXH6^Wi8)g(q#x@Q#&|q51 zEn)mpJlafCTU0Jdui8`DG=}w_^UVC{uYXBfk+b&ZyMNqVUClV*ZMV%-Qxc=l;W_M% z($uVig4rB+HRJrc57{T;E~g(Fn+$}1oa){n=|V~+cm4FLr_+`dC*?)2d~u!N;{Ngd zN^kaA#=fC}xJ4~k_8lX~BfB2%yPg1?&+Mz?=zAL|x+E=w4leY1z+ywXzM}AoAr&*- zbH;-Q<0rfOd+Y!7^UuGMsHWX%n)*6@$c9BHM6zvoUfv8kABRYi-G&GR^z?d*EGTYO=i zMyFvTN1CDp^jI1Hpy`Rro-+Q{IQ_8i)Yl(8s!N7$y|SS0>C2ZN z-lgDxzkjB}yPBHmv;J_Ue~=cW+%H?YE}m-nE8F4g*XjLB)HaKBQ&Wn!Y$b@17}15A{2 z`ZuC7efi?`aWXTD$Hv?2c#@huEH>?GxXIsgkcVP=#PMGqm45RTAI)j4ioj!dVgM=q3=jKS4`t#2}S4O|Ct<7T^UTH3%c1?q9hu(S_nK{O$%ae8I5Ec*fA3aa<=P^vk!go5cD#!;&e&G_UVEu; ze~*~TJsHn$bsL=z%#lFA>d;%)TnatZ%97n3G;xCYrR7}%o~_ec#eJUG^_t5x;BXSQo7~|Ads{dI;H{(Nz`A3E8&IfE?sDMeGt*w@aHm2+-U z!OT$&qA>=#I}V0b0j-wL0c>tuM28+DCjlWCtSUitU3i5s>=!g395qCYnpxQ0E2*ie z0#oJqKSSdGSI$01qrtJUv4T~IQ4-U3yzROdMF}VIg^EHyqN2MqFffo+9|l5o5{y$y zDB7bB=8<~M9xy3=x^Teo=@Ot=^O&?q$Hni)Zohnkh+JO%l5}>^@4=mtr;eI~HABW9 zRv8OrfeA`f`QZ>aQCY0nkv}SU=H5~8_`OZj>+Z6=-SDFPt7eiFk8WbL+uAL2|eroFl?k{h;FURS|HYQue~SXL!d4_nx`dxEc~Sj7)Xcrft;mPMMLujVCt-uJsi z)1|RYS$X_=YwCD|yrQ5-M96@#YtL{{YlKt}1P3LZRiSW_yPmf`b7jFyfZ#lkE`z$B z=~B`FpSaV4@ssElRsjjyD{IL*Rym;ZDUI;7%C&jdt_?7{nstH&<{1B`xlCz#*y>1| zV-|mCNM;5BLhijXtn6`rlNJh{rnJ1<7Ajq(xXJJw0{hqNx45vl;w*>oA1~+<^HBXC zlAWY-s;HpoQ?1BJXkK4>FK)hT;gPGrX;#~?onGAeZCzb~oK7<+VbK(ft4C~y!5O=K zaN;n6sYh(?{fX{?LN7{ElO6lHL7u+2pBS$qRuEx^31Dtoc}oqWpFdwBSO#_*J2~pY zNH(1`F6_bGx#n-`>Sm+E(pY%4y-kYeOg`cc+>Tl7nNvd*gdin%2jUa}fdQ>zla{yY10m%|4nsD2lg>?~ylYUq%)jjOSKg&mE@@8Os z#a)KQ_U_(&iLUJ&$=lZm5vcxxFzJ~a=;`bnd1iTW1k7i0sJepZp4;pzmV%YtwYsz_ z{#3Qt?o;7{*b_`Ac8nQn8v1u_n{3Jx-Eh<9m7?6+!Ege{*xppnkFgscxFOK6F7SJl z9tH_Tj}iQoB#pH6x=ohRSf&67ei9r%e5CEKlwA(p#%%bMl5;K5y<(rVE=kqP5JqS~ z1SG%b(Q7Wsfbf}Ic$ouXD*Rf%q8qKD?3CjGblGlktKK&>oFoWR3+&~1sBl=zo9Px| zQYV(fSKq;ps&mRaQj;mm%G5o7p^M9@^7VNR4|1~ntUg6b!(elBc>9BTYnod$j}r2Y z|9a1h&MCQj?i{ZEWyd({JqMb0won+-;$;`bs#`0G`kM+UFVgFiP(5TYy_x2envxP3 zlezED=5^9HWK>{_bu?^&s&nAjP2eK_sY;TCQhZB)UG4!*A5uZJ%lN!p2dz;r>C=pR z_Zu{58YU#S0mmz|_71bNr7}o{`gxhvRn1h!)#A4{QBTsj>^F0oz76hls!Un=1ze!h zmy87!A4<>>$D}zRO$@Zw>T7O5z!8NT%5(J39%YaBy3zyHDxz}+OyAfQt;G}&`RhwOlopGNh?5M5NL}mL&>0SgU@nk z!W5l8)_$tTZme!z0j~xQ;&e?tJ?C!2zE@N{o3(&NeTYT9c(sfX2`GDd;E0^>+O-?$ zom0Fw^EZNR(G@g;6}eUyStxga2N!jdLoON7{0W`ern-*gqvgxrtw=p~E!C&=Nyc77 z4%m@N{A1ifC)Tr+T^2OqQ{S}gO3}ac-kB&zS2?LuZUP4f86>-sxh-5=Tq5!oo$>oE zv`gm0%id@M|8!hOO|6zu@%$6mbLeLzajkFRkTnJ#8hrC0A!x72=suzsbEbFa5#y)IHRsp@o1k-T&AWDddvNU9e23O9 zzcw9dzAb%2M&4`l{`s8{iB^n3jY@XqqGkj0X9sH-n9iGb1UzQ6os5R=Et|gc#vhoV z-F4eMW3h%0J?IhabFZr}kF^v(o=Kx8b86DWWJ@BIXj18&tp%his|IK#0`X*$cmewrEEj-DWSx7u5B6c~YOg5N7AdO324z#Je=8b(s?&^mZTO=O{ zQPj{j1UH)IH|Ol~W!=Vj*Pl)sf2|Y5YS$daPF%xHhn^Qs3)q&0ywa!?eV9S%G=+zE z_Ka8`;W|Q5QPI6Td-BHl*B8VJix)97WFs(%p#V2aZy)(h%lU5Ktyg}g;^!G$PM)1X zR9&_M9OyvN&gPpnA<6!X;wxwYfys(f*A`S2@f3$eO}k;ytk;*S&W^3t>cN$fH9Jh5^-k z6Thza8t89XKgph~YsQ4#D%yFk8Fqo1FjyQ z?(Y}5js|J>f&~jYjWu3+sZv<_RSEkZ{dMV1=}RIa8|&QZcP|uJfZ9U zanT}O5=*zCb8?>=t_;Y$fB&?jS=`%$2O% zJz|6oVwNyryQ#H$IP8n*ht%b$W4}mXAWY7VmVY|RRp-!t@L|+$FZ(YI%@w2#_9^*X zVWhE&2`gv%fLzW&GyLth-wZOO-uGrA*5fr5Tsb|4$@0x=EC!RLrujYNz006%2KDLF zr<-{zg`J1CHFmaB66Oyz-LHTgRy|V{w>0EFm(@v-9&@vEr%rMflhxwy-V^&&#jyYnxNJA zi5AN-Zm}3QTz5-kP%BWqjI?Sh2wn(~FZ$q#k`7FF<}9#F`ytd2qPLG=-rgwM9cLIlv)5{vJ*`iNhZKt^ z;n6%^;|Ma?V9n3{`sEQTkw5-ZWeuuVLw9>@iAQ2#!!HO0?tu62KG^vT-+4ezm?beT z0o3j(gnvncprdp__pY4fV*w1tL>b3d8_mu-ee(pesH4p}3eWfu*@rWYvdKTc0^`Kn zq(HZc@9C(F>1S$c)}a8JMHD6#52095tv|nsWa)%EhZMk$hq!eoQF^9lDJuAHZwwfq zzl-|E5j;GJ$o$PW-*kcXVNf7~1J*YuU7$b@7(V~^+5;xTns>&?c#`m70KKsIk)`d) ziM-G-En?*Unk2|NHnip02V3F+XH%K!*qrqmmy+iofw5c5G6Mx>_C0*qZp%{VoUrXk z|AYT%qgZqqQ|1$30b%uiVN@4}`H|1}{Jm|Po9A-4ym~5)gIf6zu+tZ}W;0p>^&8gM zQgnS3f3aiWOLs4WAV;vO#$7SIi8%d0l~WP&uP#sj8oPS+YNLa?7Kl1e1s>F;O_s`v z*3_J>{<137^K~$~kx){F|Fc7szBl&&WW3_mYI3EpHUiR!A(MbsB7_Y7RG9+Og|Xrh zI?(6Wcl8S^c>n&rXrVm@k5dpNC1~2JXE(!1jH(~bi}A>>n$1f`FNv66cB+LnssgTM z;P$~8*4b~{!)Eb7Fktfz?6HvQHJ>cH2XePnbsw-M$9|XZ-J1)HZU!l8Y8`TA!5tcL zGVScZ_bm7tV%iHrg~{vgui-n-37;3SP-QaxL(VFI(^&w9vq?@yVuUJwoxuYZ>DMjZ zbAiPpScLOqO3>^l>AQE=9Q|f$!p6V;D!j}SS)jYSvzpLL+k216ck5A2t$vdJTU15z zwKifJ|juQ!KLc&sF`!GTJ=H9i@S zps*g~q`3-uFO(Q#A%@6qjC&4_zYD93quYwn_q3^r1gafme!}-jkU;!!I&P&`I|RN5 z3>LaQy`W%pVeKdIeUDfUO;s!W;Co7<5%5JlI`7J?9vhDm6}3M$Je|+|FF<(C)%+ zCc|!wzqSV8xN-qN-Ojp0pguaz|JnID(XN`dY~}spVxz?;50Bqq3xVbS!qWc|`zbff zsHf!Z{)bcze-sKF4Amp)h8Wev<~JWQ#u6R zw-%TDLus*UOWpn{k5h1J?;x%2u=NOF7sYCe=~q1QT$K&e90|LWS}`pqqh zR*znEQs`^buGhV*d8!IMuF_Q>fquN#e-^X?yzJe{T^A_}egFVf`B+3`?2MP;UEcPUR+q$*x{qZ_r?IZz{d%s&p66&-X9Fr3h%PHo=`nde^g6cn) zHZGdAP);b4J%uDe2qC>SZ%#l}Ns&jWuhXv@Q}Loq%14i?`{AHBFUU1$x^5!_!{f-8r>Ez2_(D+LL6nM&8vI0+ zaeT*bQ@d^Wt%be`47iVu(nX)QDWD1UlqJg+5YiVGTHpP9^X8eP3ZcZEhH&JM?%H=l z;)mGyw0_l8h#Ufa-;&N1Ks7|u(%>x$eHWHCx=wiG;@+ai3Kn=y zS$=9B!}N8mEKV*^-&eA)@5YKm76)@o0{LnFsH7A@h4l+sHrM%!u2&*PcXF+S#$&lA zg+U4Vs-0@%GH7`Fw3@*>1y_4tyL?$l2`@%~ERa8moH?q1 z5G=SuH;X@SE(gWZy2d^%z{}U#oVl3mLoB~3GLT}v{L}bBRLa5h#yvLvgg{S}qtx7@ zy_6{h+>)DvFG){=FC6%DWFLN2O%soyau;0%awLg%y|rB?FtoRy-&&m0R~ZJ6fOrI6 zDzP&0GxBZZaAQ1Wp!KIupVUvZ-uXLv(-#<@W zk$(^kMYg6DOB1Ef6|I^%nVJ3gBajco!fc*PZv0}CgG8{6^G|^ENQyE)=kmz2di(b6 zdFZ7y5ePw&86%>=#cO~6=?CVy7Ss6TC9hsVsr4(^1Ng5vntV(iKE!-X%qGgvl|EVl|F$o zlG4&{i$ALww6C_GH$W6nAo}+3Ux2-Pkq=D%Afz%;h`OQqEFX^oaq+GPoL$s?BgNF7 zV5YZvOnm**U~3y0A2RbF+7!gy?g~5nEuQ;`O+$X`0f9k;si**X8*+sr_{Mkkb4P$HO7w|asUmuWPR|p+l+0;DXXfPE-n$;f}gXCrJ<8?5TXU?B@E!$D9NubLw zpqEfnZl=(EYM!BA+CRU$mL2e+hr5-$k8iX9G=yC)ec@=LHvEWM##vam3OQ;e(AE`2 zV}(2qK4GcT^-k^p*D!8DY{*s~~%o+5nMj(vo}b-g7DV}2q1%eItM z2sY2Vn=uV0S;`#^;7lDUaWO*|9Snaxvi(FVE(@mTUPiNN6AIs+Ad48U{p|Op(DxV* zoU!@-o66*#dEJGJ#mRnQX&V{YG@6C{0fM{*JUP_mm%DT~G{hmmPD@TP2O(T|hz>bdlQWBoM)sF;h5ZB+^dYlOpuK zE+L<(iiQ)8e?yuU{!t`$LYWGmQIxv&tl;(#zC>OVRxusOep0p=7M~zoWFQVaY54W6 zUVTURk^#YR66!1|Nlb*k{P-&vPWUWqlRucy`cnIOpa13@X-p!UNDg^c&!J>80yIy) zd6s#yUDrV(j(_vY)9pcqFc;LZAp(L^kTA7w#{ZQ(YY{caLMW2A0Vupq6Rrg|WAn7@ z(7}QM%%@~6_K(2xsO^^o6z~vy_N;N+u=KP4&BcDzR6Y`QMGPd;p-1j~QvqHX>gY}2 z8PH+y^z#5tj^Gi*(1Tfr$5+47B{$O7&1E{xoW;6V{(VyFs(NbV1ax15UTvIzd963( zZ|=F33xyfMi^+e;kA@L>^3i2SS_HK=M$-Z>Sb>aCsKj3Gcq5g!ZNu_vo?F$PLo`^<3undsIvBXc~C>fs3n%q)* zuQfLpXds_G=!P1mRm`v%M|^~pVy12)Tg&8+cAqcSTE-7V#Nkf4VPAX!&&HI7^q$(cmf?jHw4bDgfUSc*uU35< zNIf%}6Tjk*+g;(#!8xYWJ*+Zaq(*Sp<{Smh!psM4L|I6|Fw4!&ZOa?EV8Iqvk}P>? zHq2Mh3IBUsg8o`IV)V)f(?yn>(b z{z$WUq6L&|2&mV<8RcPPb#*A(07(*wub5|Cx+ z+UV9APfsDqI4?9DK2&fQB%sfE@`AWXI?ZVy0tYj6Hy}BTZYvyuuw%~zV71$zNVPEP zYTDYCD7i)GAxJISCJs=~est&pW{mj)^;Z^gxxQXQuBPRf?s7(lxl3?wgE%cW)o@Uw zrP-mIftA8YUe~W(n+jAg6G}=5JRk#X|Ho}F->VtX%vHhBp;u%YY|NK=6ikuUC z6J6J5+lmvB@rlQoag?SSp;ELB6%?HwWuOhw#3%{s9jkXz|3O~X!UwAj8kAA>5j|5b z2i~aU5&c2EVn`iD2Zg8?87%$2>Vd_e$b_;$-n267!~6Gw)yTX~aU#XBkdPXSCrt3! z(rwtGR};BA?Nc^%B#8!yj)f3#c71U6@b;qe6EUrjnwt*q+s3rh9BMKBHXVDN(%Lyz zPwzBR?oac6@BQhUmh(iYIU%@3`@W6x#U#wKLkll6F>>0yVisXe^HMKawL})T4{sI) zo+IN4cX+w8iFU%X%U&GFDbFrh&h3*V_MyJM|DanUC1h_8?%)4ve_OP&^pV;I4K28z zg{O~Jm6wOJ@=qY>-JHep(;3S!T$0NpMxAIrXJE_`yEO+n_PKV|hg(7yY6xPMsaQs| zlUXvkgRKHD`0;Pomxb|DftTa56n1Rhe231$G~T&+nfqwq>!FRJuz6f$^U_b#On3b} z`7=F)lo}b7srABDty;BOLLl>4Nhdgz^EU5f+8Hbb-=i5>&~5yhH=(q2yF-&$$qSUk z3lpL+yV0&r%o+?z`J9XHQfkmli6CZK4UDZYFnf}d*ZRFVmzd~Cks!US`{9Q`)M^wF zni-$tzkX-HvfO4F_y2PaC>k`1`l?91qu0E5NGr3z#gbM`UES=d-KA z#k~+J_Vq35K*rKDhnBA}@n&YxV?^3;@Z}Wyy#1Y|xw5%gTx>&#@QQl_AYaY_Kk-}n zICHx3>28OJ5QSGrqM-;q2AotkSjq_ zI$_0Lvl#;JO&MYq_eP@Qx9z%|+Byt-NUINi6{Kmh@P3;Vpe`D_8F6o6+KV(k5wQB} zUIT)xT;MRubN4@Y8l_a8Y0DGRX3k~6Ij`CXsZ>ws@A}y|{lh%v_&#@=^TqY&JQI}0 z(jEoIkjo&t^2q`RGaP@6U!tFBO#_i_Z~cWaQaaa zbrORBKVNDPk0|(3=uk1{F3auq5xO%g|wt|9u(2!o__0TTtEsR;3hieOJm> z1BO9A@r^FUHH^hcTSigr%NodU%f|JXOGNKdAm5Lh`Oon7sUT=ucI-H_xeUS^_-
    KG7o*K1F8=mbPsf|?M#JuG>o;Op& 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 Zft~E!%46*la4po*a&`1@s5o)q>c0q;vULCe literal 0 HcmV?d00001 diff --git a/docs/getting_started/static/output_38_0.png b/docs/getting_started/static/output_38_0.png new file mode 100644 index 0000000000000000000000000000000000000000..6397c60b5b81a963b691634564ca027748a6b057 GIT binary patch literal 94700 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�i+-f!!C|S$2{$^&!H16f_?^83kxqb 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 literal 0 HcmV?d00001 diff --git a/docs/getting_started/theory.rst b/docs/getting_started/theory.rst index 4c9c8ddd..0b9362a4 100644 --- a/docs/getting_started/theory.rst +++ b/docs/getting_started/theory.rst @@ -971,7 +971,7 @@ Spatial test Aim: The spatial test again aims to isolate the spatial component of the forecast and test the consistency of spatial rates with observed events. -Method We perform the spatial test in the catalog-based approach in a +Method: We perform the spatial test in the catalog-based approach in a similar way to the grid-based spatial test approach: by normalising the approximate rate density. In this case, we use the normalisation :math:`\hat{\lambda}_s = \hat{\lambda}_s \big/ \sum_{R} \hat{\lambda}_s`. @@ -1015,6 +1015,90 @@ dashed vertical line shows the observed test statistic distribution. The quantile score :math:`\gamma_s = 0.36` is also printed on the figure by default. + +Resampled Magnitude Test +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Aim: Perform the resampled magnitude test for catalog-based forecasts (Serafini et al., 2024), +which is a correction to the original M-test implementation that is biased to the total N of +events. + +Method: Calculates the (pseudo log-likelihood) test statistic distribution :math:`D_j` from the +resampled forecast's synthetic catalogs :math:`\hat{\Lambda}_j` as: + +.. math:: D_j = \sum_{k}\Bigg(\log\Bigg[\frac{N_{obs}}{N_U} \Lambda_U^{(m)}(k) + 1\Bigg]- \log\Bigg[\hat{\Lambda}_j^{(m)}(k) + 1\Bigg]\Bigg)^2; j= 1...J + +where :math:`\Lambda_U^{(m)}(k)` and :math:`\Lambda_U^{(m)}(k)` represent the count in the :math:`k`\ th bin of the magnitude-frequency +distribution in the union catalog and resampled catalog, respectively. The resampled catalogs :math:`\hat{\Lambda}_j^{(m)}` +are built from drawing exactly :math:`N_{obs}` events from the union catalog :math:`\Lambda_U^{(m)}`. + +The observed statistic is built identically as the original Magnitude test: + +.. math:: d_{obs}= \sum_{k}\Bigg(\log\Bigg[\frac{N_{obs}}{N_U} \Lambda_U^{(m)}(k) + 1\Bigg]- \log\Big[\Omega^{(m)}(k) + 1\Big]\Bigg)^2 + + +where :math:`\Omega^{(m)}(k)` represent the count in the :math:`k`\ th bin of the magnitude-frequency +distribution in the observed catalog. + + +* Implementation in pyCSEP + +.. code:: ipython3 + + from csep.core.catalog_evaluations import resampled_magnitude_test + + resampled_m_test = resampled_magnitude_test(forecast, comcat_catalog, seed=1) + resampled_m_test.plot(show = True) + + +.. image:: static/output_37_0.png + + +The histogram shows the resulting test distribution with :math:`D^*`, which has a smoother +statistic distribution than the original M-test. +The observed statistic :math:`\omega = d_{obs}` is shown with the dashed +horizontal line. The quantile score for this forecast is +:math:`\gamma = 0.98`. + + +Modified Multinomial Log-Likelihood (MLL) Magnitude Test +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +* Aim: Implements the modified Multinomial log-likelihood (MLL) magnitude test (Serafini et al., 2024). + +* Method: Calculates the test statistic distribution as: + + .. math:: D_j = -2 \log\Bigg[\cfrac{\mathcal{L}\big(\Lambda_u^{(m)} + \frac{N_u}{N_j}\boldsymbol{1} + \hat{\Lambda}_j^{(m)} + \boldsymbol{1}\big)} {\mathcal{L}\big(\Lambda_u^{(m)} + \frac{N_u}{N_j}\boldsymbol{1}\big) \mathcal{L}\big(\hat{\Lambda}_j^{(m)} + \boldsymbol{1}\big)}\Bigg] + + where :math:`\mathcal{L}` is the multinomial likelihood function. :math:`\Lambda_u` is the union of all the forecasts' + synthetic catalogs, :math:`\Lambda_u^{(m)}` its magnitude histogram, and :math:`N_u` the total number of events in :math:`\Lambda_u`. :math:`\hat{\Lambda}_j` are resampled catalogs, which are built from drawing exactly :math:`N_{obs}` events from the union catalog :math:`\Lambda_U`, whereas :math:`\hat{\Lambda}_j^{(m)}` is its histogram. The vector :math:`\boldsymbol{1}` has a value of 1 on each magnitude histogram bin. + + The observed statistic is defined as: + + .. math:: d_{obs} = -2 \log\Bigg[\cfrac{\mathcal{L}\big(\Lambda_u^{(m)} + \frac{N_u}{N_j}\boldsymbol{1} + \Omega^{(m)} + \boldsymbol{1}\big)} {\mathcal{L}\big(\Lambda_u^{(m)} + \frac{N_u}{N_j}\boldsymbol{1}\big) \mathcal{L}\big(\Omega^{(m)} + \boldsymbol{1}\big)}\Bigg] + + The multinomial likelihood function :math:`\mathcal{L}` for an arbitrary catalog's magnitude histogram :math:`\Lambda^{(m)}` is defined as: + + + .. math:: \mathcal{L}(\Lambda^{(m)}) = \cfrac{N_\Lambda!}{n_{\Lambda,1}!\, ... n_{\Lambda,K}!}\prod_{k=1}^{K} \left(\cfrac{n_{\Lambda,k}}{N}\right)^{n_{\Lambda,k}} + + where :math:`N_\Lambda` is the total number of events in :math:`\Lambda^{(m)}`, + :math:`n_{\Lambda,k}` the number of events in the :math:`k-th` bin, and :math:`K` the total + number of bins. + +* Implementation in pyCSEP + + + .. code:: ipython3 + + from csep.core.catalog_evaluations import MLL_magnitude_test + + MLL_t = MLL_magnitude_test(forecast, comcat_catalog, full_calculation=False, verbose=False, seed=22) + MLL_t.plot(show=True) + + .. image:: static/output_38_0.png + + References ---------- From 3b24128b3cf7f3e648065f7570d94df1e4b914df Mon Sep 17 00:00:00 2001 From: pciturri Date: Tue, 26 Nov 2024 19:27:29 +0100 Subject: [PATCH 7/7] docs: Added resampled M-test and MLL test to the concepts section. Left Serafini et al., 2024 as in-prep, until pre-print is submitted. --- docs/concepts/evaluations.rst | 7 ++++++- docs/getting_started/theory.rst | 4 ++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/docs/concepts/evaluations.rst b/docs/concepts/evaluations.rst index 05e94ad3..4e26ae81 100644 --- a/docs/concepts/evaluations.rst +++ b/docs/concepts/evaluations.rst @@ -30,7 +30,7 @@ consistency tests and they verify whether a forecast in consistent with an obser that can be used to compare the performance of two (or more) competing forecasts. PyCSEP implements the following evaluation routines for grid-based forecasts. These functions are intended to work with :class:`GriddedForecasts` and :class:`CSEPCatalogs``. -Visit the :ref:`catalogs reference` and the :ref:`forecasts reference` to learn +Visit the :ref:`catalogs reference` and the :ref:`forecasts reference` to learn more about to import your forecasts and catalogs into PyCSEP. .. note:: @@ -105,6 +105,8 @@ Consistency tests magnitude_test pseudolikelihood_test calibration_test + resampled_magnitude_test + MLL_magnitude_test Publication reference ===================== @@ -114,6 +116,8 @@ Publication reference 3. Magnitude test (:ref:`Savran et al., 2020`) 4. Pseudolikelihood test (:ref:`Savran et al., 2020`) 5. Calibration test (:ref:`Savran et al., 2020`) +6. Resampled Magnitude Test (Serafini et al., in-prep) +7. MLL Magnitude Test (Serafini et al., in-prep) **************************** Preparing evaluation catalog @@ -121,6 +125,7 @@ Preparing evaluation catalog The evaluations in PyCSEP do not implicitly filter the observed catalogs or modify the forecast data when called. For most cases, the observation catalog should be filtered according to: + 1. Magnitude range of the forecast 2. Spatial region of the forecast 3. Start and end-time of the forecast diff --git a/docs/getting_started/theory.rst b/docs/getting_started/theory.rst index 0b9362a4..24252a2c 100644 --- a/docs/getting_started/theory.rst +++ b/docs/getting_started/theory.rst @@ -1019,7 +1019,7 @@ on the figure by default. Resampled Magnitude Test ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Aim: Perform the resampled magnitude test for catalog-based forecasts (Serafini et al., 2024), +Aim: Perform the resampled magnitude test for catalog-based forecasts (Serafini et al., , in-prep), which is a correction to the original M-test implementation that is biased to the total N of events. @@ -1064,7 +1064,7 @@ horizontal line. The quantile score for this forecast is Modified Multinomial Log-Likelihood (MLL) Magnitude Test ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -* Aim: Implements the modified Multinomial log-likelihood (MLL) magnitude test (Serafini et al., 2024). +* Aim: Implements the modified Multinomial log-likelihood (MLL) magnitude test (Serafini et al., in-prep). * Method: Calculates the test statistic distribution as: