def getSurrogate(paramRanges,paramKDE,srcParam,srcEpoch,nSamples=100): import sys sys.path.append('/home/ehab/MyFiles/Softex/spacePy/spacepy-0.1.5') import spacepy.toolbox as tb epoch=[] pbase=[] ppstd=[] pmstd=[] for j in range(len(srcParam)): for i in range(len(paramRanges)): if paramKDE[i] != []: if srcParam[j] >= paramRanges[i][0] and srcParam[j] <= paramRanges[i][1]: mad = tb.medAbsDev(paramKDE[i].resample(nSamples)[0]) ppstd.extend([srcParam[j] - mad]) pmstd.extend([srcParam[j] + mad]) epoch.extend([srcEpoch[j]]) pbase.extend([srcParam[j]]) return ppstd, pbase, pmstd, epoch
def test_medAbsDev(self): """medAbsDev should return a known range for given random input""" data = numpy.random.normal(0, 1, 100000) real_ans = 0.7 ans = tb.medAbsDev(data) self.assertAlmostEqual(ans, real_ans, places=1)
def sea(self, **kwargs): """Method called to perform superposed epoch analysis on data in object. Uses object attributes obj.data, obj.times, obj.epochs, obj.delta, obj.window, all of which must be available on instantiation. Other Parameters ================ storedata : boolean saves matrix of epoch windows as obj.datacube (default = False) quartiles : list calculates the quartiles as the upper and lower bounds (and is default); ci : float will find the bootstrapped confidence intervals of ci_quan at the ci percent level (default=95) mad : float will use +/- the median absolute deviation for the bounds; ci_quan : string can be set to 'median' (default) or 'mean' Notes ===== A basic plot can be raised with :meth:`plot` """ #check this hasn't already been done #TODO: find out why doing two .sea() calls back-to-back fails 2nd time if hasattr(self, 'semedian') or hasattr(self, 'semean'): return None #check defaults defaults = { 'storedata': True, 'quartiles': True, 'ci': False, 'mad': False, 'ci_quan': 'median' } for default in defaults: if default not in kwargs: kwargs[default] = defaults[default] #ensure all input is np array delt = float(self.delta) if isinstance(self.data, np.ndarray): y = self.data else: y = np.asarray(self.data, dtype=float) if kwargs['ci']: kwargs['quartiles'], kwargs['mad'] = False, False if kwargs['mad']: kwargs['quartiles'], kwargs['ci'] = False, False time, t_epoch = self._timeepoch(delt) #build SEA matrix and perform analysis wind = int(self.window) m = int(2 * wind + 1) n = len(t_epoch) y_sea = np.zeros((n, m), dtype=float) blankslice = np.zeros([m], dtype=float) for i in range(n): dif = np.abs(time - t_epoch[i]) j = np.where(dif == np.min(dif)) stpt = j[0][0] - wind enpt = j[0][0] + wind + 1 sea_slice = blankslice.copy() if stpt < 0: #fix for bad epochs not correctly moved to badepochs attr #TODO: make badepochs robust or do all checking here sea_slice[0:abs(stpt)] = np.NaN sea_slice[abs(stpt):] = y[0:enpt] elif enpt >= len(y): tmpslice = y[stpt:] sea_slice[:len(tmpslice)] = tmpslice sea_slice[len(tmpslice):] = np.NaN else: sea_slice = y[stpt:enpt] y_sea[i, 0:] = sea_slice #find SEA mean, median and percentiles - exclude NaNs (or badval) try: badval = kwargs['badval'] except KeyError: badval = np.nan y_sea_m = ma.masked_where(np.isnan(y_sea), y_sea) else: y_sea_m = ma.masked_values(y_sea, badval) self.semean = [np.mean(y_sea_m[:, i].compressed()) for i in range(m)] self.semedian = [ np.median(y_sea_m[:, i].compressed()) for i in range(m) ] self.semean, self.semedian = np.array(self.semean), np.array( self.semedian) self.bound_low = np.zeros((m, 1)) self.bound_high = np.zeros((m, 1)) if kwargs['quartiles']: from matplotlib.mlab import prctile for i in range(m): dum = np.sort(y_sea_m[:, i].compressed()) qul = prctile(dum, p=(25, 75)) self.bound_low[i], self.bound_high[i] = qul[0], qul[1] self.bound_type = 'quartiles' elif kwargs['ci']: #bootstrapped confidence intervals (95%) funcdict = {'mean': np.mean, 'median': np.median} try: if isinstance(kwargs['ci'], bool): raise ValueError #fall through to default case else: ci_level = float(kwargs['ci']) except ValueError: ci_level = 95 from spacepy.poppy import boots_ci if hasattr(kwargs['ci_quan'], "__call__"): #ci_quan is a function ci_func = kwargs['ci_quan'] else: ci_func = funcdict[kwargs['ci_quan']] for i in range(m): dum = np.sort(y_sea_m[:, i].compressed()) self.bound_low[i], self.bound_high[i] = \ boots_ci(dum, 800, ci_level, ci_func) self.bound_type = 'ci' elif kwargs['mad']: #median absolute deviation for i in range(m): dum = np.sort(y_sea_m[:, i].compressed()) spread_mad = tb.medAbsDev(dum) self.bound_low[i] = self.semedian[i] - spread_mad self.bound_high[i] = self.semedian[i] + spread_mad self.bound_type = 'mad' self.x = np.linspace(-1.*self.window*self.delta, self.window*self.delta, \ len(self.semedian)) if kwargs['storedata']: self.datacube = y_sea_m if self.verbose: print('sea(): datacube added as new attribute') if self.verbose: print('Superposed epoch analysis complete')
def sea(self, **kwargs): """Method called to perform superposed epoch analysis on data in object. Uses object attributes obj.data, obj.times, obj.epochs, obj.delta, obj.window, all of which must be available on instantiation. Other Parameters ================ storedata : boolean saves matrix of epoch windows as obj.datacube (default = False) quartiles : list calculates the quartiles as the upper and lower bounds (and is default); ci : float will find the bootstrapped confidence intervals of ci_quan at the ci percent level (default=95) mad : float will use +/- the median absolute deviation for the bounds; ci_quan : string can be set to 'median' (default) or 'mean' Notes ===== A basic plot can be raised with :meth:`plot` """ #check this hasn't already been done #TODO: find out why doing two .sea() calls back-to-back fails 2nd time if hasattr(self, 'semedian') or hasattr(self, 'semean'): return None #check defaults defaults = {'storedata': True, 'quartiles': True, 'ci': False, 'mad': False, 'ci_quan': 'median'} for default in defaults: if default not in kwargs: kwargs[default] = defaults[default] #ensure all input is np array delt = float(self.delta) if isinstance(self.data, np.ndarray): y = self.data else: y = np.asarray(self.data, dtype=float) if kwargs['ci']: kwargs['quartiles'], kwargs['mad'] = False, False if kwargs['mad']: kwargs['quartiles'], kwargs['ci'] = False, False time, t_epoch = self._timeepoch(delt) #build SEA matrix and perform analysis wind = int(self.window) m = int(2*wind + 1) n = len(t_epoch) y_sea = np.zeros((n,m), dtype=float) blankslice = np.zeros([m], dtype=float) for i in range(n): dif = np.abs(time-t_epoch[i]) j = np.where(dif == np.min(dif)) stpt = j[0][0]-wind enpt = j[0][0]+wind+1 sea_slice = blankslice.copy() if stpt < 0: #fix for bad epochs not correctly moved to badepochs attr #TODO: make badepochs robust or do all checking here sea_slice[0:abs(stpt)] = np.NaN sea_slice[abs(stpt):] = y[0:enpt] elif enpt >= len(y): tmpslice = y[stpt:] sea_slice[:len(tmpslice)] = tmpslice sea_slice[len(tmpslice):] = np.NaN else: sea_slice = y[stpt:enpt] y_sea[i,0:] = sea_slice #find SEA mean, median and percentiles - exclude NaNs (or badval) try: badval = kwargs['badval'] except KeyError: badval = np.nan y_sea_m = ma.masked_where(np.isnan(y_sea), y_sea) else: y_sea_m = ma.masked_values(y_sea, badval) self.semean = [np.mean(y_sea_m[:,i].compressed()) for i in range(m)] self.semedian = [np.median(y_sea_m[:,i].compressed()) for i in range(m)] self.semean, self.semedian = np.array(self.semean), np.array(self.semedian) self.bound_low = np.zeros((m,1)) self.bound_high = np.zeros((m,1)) if kwargs['quartiles']: for i in range(m): dum = np.sort(y_sea_m[:,i].compressed()) qul = np.percentile(dum, (25,75)) self.bound_low[i], self.bound_high[i] = qul[0], qul[1] self.bound_type = 'quartiles' elif kwargs['ci']: #bootstrapped confidence intervals (95%) funcdict = {'mean': np.mean, 'median': np.median} try: if isinstance(kwargs['ci'], bool): raise ValueError #fall through to default case else: ci_level = float(kwargs['ci']) except ValueError: ci_level = 95 from spacepy.poppy import boots_ci if hasattr(kwargs['ci_quan'], "__call__"): #ci_quan is a function ci_func = kwargs['ci_quan'] else: ci_func = funcdict[kwargs['ci_quan']] for i in range(m): dum = np.sort(y_sea_m[:,i].compressed()) self.bound_low[i], self.bound_high[i] = \ boots_ci(dum, 800, ci_level, ci_func) self.bound_type = 'ci' elif kwargs['mad']: #median absolute deviation for i in range(m): dum = np.sort(y_sea_m[:,i].compressed()) spread_mad = tb.medAbsDev(dum) self.bound_low[i] = self.semedian[i]-spread_mad self.bound_high[i] = self.semedian[i]+spread_mad self.bound_type = 'mad' self.x = np.linspace(-1.*self.window*self.delta, self.window*self.delta, \ len(self.semedian)) if kwargs['storedata']: self.datacube = y_sea_m if self.verbose: print('sea(): datacube added as new attribute') if self.verbose: print('Superposed epoch analysis complete')