median_abs_deviation#
- xarray_einstats.stats.median_abs_deviation(da, dims=None, *, center=None, scale=1, nan_policy=None, **kwargs)[source]#
Wrap and extend
scipy.stats.median_abs_deviation
.Usage examples available at Intro to the stats module.
All parameters take the same values and types as the scipy counterpart with the exception of
scale
. Herescale
can also takeDataArray
values in which case, broadcasting is handled by xarray, as shown in the example.Examples
Use a
DataArray
asscale
.import xarray as xr from xarray_einstats import tutorial, stats ds = tutorial.generate_mcmc_like_dataset(3) s_da = xr.DataArray([1, 2, 1, 1], coords={"chain": ds.chain}) stats.median_abs_deviation(ds["mu"], dims="draw", scale=s_da)
<xarray.DataArray (chain: 4, team: 6)> 0.3468 0.4532 0.5054 0.876 0.6265 0.7342 ... 0.4382 0.5668 0.7103 0.2494 0.3485 Coordinates: * team (team) <U1 'a' 'b' 'c' 'd' 'e' 'f' * chain (chain) int64 0 1 2 3
Note that this doesn’t work with the scipy counterpart because s_da can’t be broadcasted with the output:
from scipy import stats stats.median_abs_deviation(ds["mu"], axis=1, scale=s_da)
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) Cell In[2], line 2 1 from scipy import stats ----> 2 stats.median_abs_deviation(ds["mu"], axis=1, scale=s_da) File ~/checkouts/readthedocs.org/user_builds/xarray-einstats/envs/latest/lib/python3.10/site-packages/scipy/stats/_stats_py.py:3365, in median_abs_deviation(x, axis, center, scale, nan_policy) 3362 med = np.expand_dims(center(x, axis=axis), axis) 3363 mad = np.median(np.abs(x - med), axis=axis) -> 3365 return mad / scale File ~/checkouts/readthedocs.org/user_builds/xarray-einstats/envs/latest/lib/python3.10/site-packages/xarray/core/arithmetic.py:86, in SupportsArithmetic.__array_ufunc__(self, ufunc, method, *inputs, **kwargs) 77 raise NotImplementedError( 78 "xarray objects are not yet supported in the `out` argument " 79 "for ufuncs. As an alternative, consider explicitly " 80 "converting xarray objects to NumPy arrays (e.g., with " 81 "`.values`)." 82 ) 84 join = dataset_join = OPTIONS["arithmetic_join"] ---> 86 return apply_ufunc( 87 ufunc, 88 *inputs, 89 input_core_dims=((),) * ufunc.nin, 90 output_core_dims=((),) * ufunc.nout, 91 join=join, 92 dataset_join=dataset_join, 93 dataset_fill_value=np.nan, 94 kwargs=kwargs, 95 dask="allowed", 96 keep_attrs=_get_keep_attrs(default=True), 97 ) File ~/checkouts/readthedocs.org/user_builds/xarray-einstats/envs/latest/lib/python3.10/site-packages/xarray/core/computation.py:1196, in apply_ufunc(func, input_core_dims, output_core_dims, exclude_dims, vectorize, join, dataset_join, dataset_fill_value, keep_attrs, kwargs, dask, output_dtypes, output_sizes, meta, dask_gufunc_kwargs, *args) 1194 # feed DataArray apply_variable_ufunc through apply_dataarray_vfunc 1195 elif any(isinstance(a, DataArray) for a in args): -> 1196 return apply_dataarray_vfunc( 1197 variables_vfunc, 1198 *args, 1199 signature=signature, 1200 join=join, 1201 exclude_dims=exclude_dims, 1202 keep_attrs=keep_attrs, 1203 ) 1204 # feed Variables directly through apply_variable_ufunc 1205 elif any(isinstance(a, Variable) for a in args): File ~/checkouts/readthedocs.org/user_builds/xarray-einstats/envs/latest/lib/python3.10/site-packages/xarray/core/computation.py:303, in apply_dataarray_vfunc(func, signature, join, exclude_dims, keep_attrs, *args) 298 result_coords, result_indexes = build_output_coords_and_indexes( 299 args, signature, exclude_dims, combine_attrs=keep_attrs 300 ) 302 data_vars = [getattr(a, "variable", a) for a in args] --> 303 result_var = func(*data_vars) 305 out: tuple[DataArray, ...] | DataArray 306 if signature.num_outputs > 1: File ~/checkouts/readthedocs.org/user_builds/xarray-einstats/envs/latest/lib/python3.10/site-packages/xarray/core/computation.py:760, in apply_variable_ufunc(func, signature, exclude_dims, dask, output_dtypes, vectorize, keep_attrs, dask_gufunc_kwargs, *args) 755 if vectorize: 756 func = _vectorize( 757 func, signature, output_dtypes=output_dtypes, exclude_dims=exclude_dims 758 ) --> 760 result_data = func(*input_data) 762 if signature.num_outputs == 1: 763 result_data = (result_data,) ValueError: operands could not be broadcast together with shapes (4,6) (4,)