Source code for neurokit2.complexity.information_fishershannon
import numpy as np
import scipy.integrate
from .entropy_power import entropy_power
[docs]
def fishershannon_information(signal, **kwargs):
    """**Fisher-Shannon Information (FSI)**
    The :func:`Shannon Entropy Power <entropy_power>` is closely related to another index, the
    Fisher Information Measure (FIM). Their combination results in the Fisher-Shannon Information
    index.
    .. warning::
        We are not sure at all about the correct implementation of this function. Please consider
        helping us by double-checking the code against the formulas in the references.
    Parameters
    ----------
    signal : Union[list, np.array, pd.Series]
        The signal (i.e., a time series) in the form of a vector of values.
    **kwargs
        Other arguments to be passed to :func:`density_bandwidth`.
    Returns
    -------
    fsi : float
        The computed FSI.
    info : dict
        A dictionary containing additional information regarding the parameters used.
    See Also
    --------
    entropy_power
    Examples
    --------
    .. ipython:: python
      import neurokit2 as nk
      signal = nk.signal_simulate(duration=10, frequency=[10, 12], noise=0.1)
      fsi, info = nk.fishershannon_information(signal, method=0.01)
      fsi
    References
    ----------
    * Guignard, F., Laib, M., Amato, F., & Kanevski, M. (2020). Advanced analysis of temporal data
      using Fisher-Shannon information: theoretical development and application in geosciences.
      Frontiers in Earth Science, 8, 255.
    * Vignat, C., & Bercher, J. F. (2003). Analysis of signals in the Fisher-Shannon information
      plane. Physics Letters A, 312(1-2), 27-33.
    """
    # Shannon Power Entropy
    powen, info = entropy_power(signal, **kwargs)
    x_range = info["Values"]
    fx = info["Density"]
    gx = np.gradient(fx)
    # Fisher
    fi = gx ** 2 / fx
    fi = scipy.integrate.simpson(fi, x=x_range)
    info.update({"FI": fi})
    # Fisher-Shannon Complexity
    fsc = powen * fi
    # if fsc < 1:
    #     warnings.warn(
    #         "Fisher-Shannon Complexity is lower than 1. The problem could be related to kernel"
    #         " density estimation, bandwidth selection, or too little data points."
    #     )
    return fsc, info