Source code for fooof.analysis.error
"""Functions to analyze and investigate FOOOF results - model fit error."""
import numpy as np
from fooof.sim.gen import gen_model
from fooof.plts.error import plot_spectral_error
from fooof.core.errors import NoModelError, NoDataError
###################################################################################################
###################################################################################################
[docs]def compute_pointwise_error_fm(fm, plot_errors=True, return_errors=False, **plt_kwargs):
"""Calculate the frequency by frequency error of a model fit from a FOOOF object.
Parameters
----------
fm : FOOOF
Object containing the data and model.
plot_errors : bool, optional, default: True
Whether to plot the errors across frequencies.
return_errors : bool, optional, default: False
Whether to return the calculated errors.
**plt_kwargs
Keyword arguments to be passed to the plot function.
Returns
-------
errors : 1d array
Calculated values of the difference between the data and the model.
Only returned if `return_errors` is True.
Raises
------
NoDataError
If there is no data available to calculate model error from.
NoModelError
If there are no model results available to calculate model error from.
"""
if not fm.has_data:
raise NoDataError("Data must be available in the object to calculate errors.")
if not fm.has_model:
raise NoModelError("No model is available to use, can not proceed.")
errors = compute_pointwise_error(fm.fooofed_spectrum_, fm.power_spectrum)
if plot_errors:
plot_spectral_error(fm.freqs, errors, **plt_kwargs)
if return_errors:
return errors
[docs]def compute_pointwise_error_fg(fg, plot_errors=True, return_errors=False, **plt_kwargs):
"""Calculate the frequency by frequency error of model fits from a FOOOFGroup object.
Parameters
----------
fg : FOOOFGroup
Object containing the data and models.
plot_errors : bool, optional, default: True
Whether to plot the errors across frequencies.
return_errors : bool, optional, default: False
Whether to return the calculated errors.
**plt_kwargs
Keyword arguments to be passed to the plot function.
Returns
-------
errors : 2d array
Calculated values of the difference between the data and the models.
Only returned if `return_errors` is True.
Raises
------
NoDataError
If there is no data available to calculate model errors from.
NoModelError
If there are no model results available to calculate model errors from.
"""
if not np.any(fg.power_spectra):
raise NoDataError("Data must be available in the object to calculate errors.")
if not fg.has_model:
raise NoModelError("No model is available to use, can not proceed.")
errors = np.zeros_like(fg.power_spectra)
for ind, (res, data) in enumerate(zip(fg, fg.power_spectra)):
model = gen_model(fg.freqs, res.aperiodic_params, res.gaussian_params)
errors[ind, :] = np.abs(model - data)
mean = np.mean(errors, 0)
standard_dev = np.std(errors, 0)
if plot_errors:
plot_spectral_error(fg.freqs, mean, standard_dev, **plt_kwargs)
if return_errors:
return errors
[docs]def compute_pointwise_error(model, data):
"""Calculate pointwise error between original data and a model fit of that data.
Parameters
----------
model : 1d array
The model.
data : 1d array
The original data that is being modeled.
Returns
-------
1d array
Calculated values of the difference between the data and the model.
"""
return np.abs(model - data)