Source code for delaynet.connectivities.gravity

"""Gravity connectivity metric."""

from numpy import exp, array
from numpy import sum as npsum
from numpy.random import default_rng, Generator

from ..decorators import connectivity
from ..utils.lag_steps import find_optimal_lag


[docs] @connectivity def gravity( ts1, ts2, lag_steps: int | list = None, n_tests: int = 20, rng: Generator | None = None, ): """Gravity connectivity (GC) metric. :param ts1: First time series. :type ts1: numpy.ndarray :param ts2: Second time series. :type ts2: numpy.ndarray :param lag_steps: Time lags to consider. Can be a single integer or a list of integers. An integer will consider lags [1, ..., lag_steps]. A list will consider the specified values as lags. :type lag_steps: int | list :param n_tests: Number of iterations or resamples to perform within the hypothesis test. :type n_tests: int :param rng: Random number generator to resample from. If None, a default generator will be used. :type rng: Generator | None :return: Best *p*-value and corresponding lag. :rtype: tuple[float, int] """ if not isinstance(rng, Generator): rng = default_rng(rng) return find_optimal_lag( gravity_single, ts1, ts2, lag_steps, n_tests=n_tests, rng=rng )
[docs] def gravity_single( ts1, ts2, lag_step, n_tests: int = None, rng: Generator = None ) -> float: """Helper function for gravity connectivity metric. This uses a permutation test to determine the *p*-value. :param ts1: First time series. :type ts1: numpy.ndarray :param ts2: Second time series. :type ts2: numpy.ndarray :param lag_step: Time lag to consider. :type lag_step: int :param n_tests: Number of iterations or resamples to perform within the hypothesis test. :type n_tests: int :param rng: Random number generator to resample from. :type rng: Generator :return: *p*-value of gravity connectivity. :rtype: float """ gravity = grav(ts1[: -lag_step or None], ts2[lag_step:]) gravity_permuted = [ grav(ts1[: -lag_step or None], rng.permutation(ts2[lag_step:])) for _ in range(n_tests) ] # p_val = num(perm_val > gravity) / n_tests return npsum(array(gravity_permuted) > gravity) / n_tests
[docs] def grav(a, b): q1 = npsum(exp(a)) q2 = npsum(exp(b)) return q1 * q2