Source code for spm1d.util



'''
Utility module

This module contains a variety of convenience functions, including:

- get_dataset
- interp
- p_corrected_bonf
- p_critical_bonf
- smooth
'''

# Copyright (C) 2022  Todd Pataky
# updated (2022/02/06) todd



from math import sqrt,log
import numpy as np
from . stats._spm import plist2string as p2s
# from scipy.ndimage.filters import gaussian_filter1d
from scipy.ndimage import gaussian_filter1d






def plist2stringlist(pList):
	s  = p2s(pList).split(', ')
	for i,ss in enumerate(s):
		if ss.startswith('<'):
			s[i]  = 'p' + ss
		else:
			s[i]  = 'p=' + ss
	return s



[docs]def get_dataset(*args): ''' .. warning:: Deprecated **get_dataset** is deprecated and will be removed from future versions of **spm1d**. Please access datasets using the "spm1d.data" interface. ''' raise( IOError('"get_dataset" is deprecated. Please access datasets using "spm1d.data".') )
[docs]def interp(y, Q=101): ''' Simple linear interpolation to *n* values. :Parameters: - *y* --- a 1D array or list of J separate 1D arrays - *Q* --- number of nodes in the interpolated continuum :Returns: - Q-component 1D array or a (J x Q) array :Example: >>> y0 = np.random.rand(51) >>> y1 = np.random.rand(87) >>> y2 = np.random.rand(68) >>> Y = [y0, y1, y2] >>> Y = spm1d.util.interp(Y, Q=101) ''' y = np.asarray(y) if (y.ndim==2) or (not np.isscalar(y[0])): return np.asarray( [interp(yy, Q) for yy in y] ) else: x0 = range(y.size) x1 = np.linspace(0, y.size, Q) return np.interp(x1, x0, y, left=None, right=None)
[docs]def p_corrected_bonf(p, n): ''' Bonferroni-corrected *p* value. .. warning:: This correction assumes independence amongst multiple tests. :Parameters: - *p* --- probability value computed from one of multiple tests - *n* --- number of tests :Returns: - Bonferroni-corrected *p* value. :Example: >>> p = spm1d.util.p_corrected_bonf(0.03, 8) # yields p = 0.216 ''' if p<=0: return 0 elif p>=1: return 1 else: pBonf = 1 - (1.0-p)**n pBonf = max(0, min(1, pBonf)) return pBonf
[docs]def p_critical_bonf(alpha, n): ''' Bonferroni-corrected critical Type I error rate. .. warning:: This crticial threshold assumes independence amongst multiple tests. :Parameters: - *alpha* --- original Type I error rate (usually 0.05) - *n* --- number of tests :Returns: - Bonferroni-corrected critical *p* value; retains *alpha* across all tests. :Example: >>> p = spm1d.util.p_critical_bonf(0.05, 20) # yields p = 0.00256 ''' if alpha<=0: return 0 elif alpha>=1: return 1 else: return 1 - (1.0-alpha)**(1.0/n)
[docs]def smooth(Y, fwhm=5.0): ''' Smooth a set of 1D continua. This method uses **scipy.ndimage.filters.gaussian_filter1d** but uses the *fwhm* instead of the standard deviation. :Parameters: - *Y* --- a (J x Q) numpy array - *fwhm* --- Full-width at half-maximum of a Gaussian kernel used for smoothing. :Returns: - (J x Q) numpy array :Example: >>> Y0 = np.random.rand(5, 101) >>> Y = spm1d.util.smooth(Y0, fwhm=10.0) .. note:: A Gaussian kernel's *fwhm* is related to its standard deviation (*sd*) as follows: >>> fwhm = sd * sqrt(8*log(2)) ''' sd = fwhm / sqrt(8*log(2)) return gaussian_filter1d(Y, sd, mode='wrap')