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:3637, in median_abs_deviation(x, axis, center, scale, nan_policy) 3634 med = np.expand_dims(center(x, axis=axis), axis) 3635 mad = np.median(np.abs(x - med), axis=axis) -> 3637 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:1197, 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) 1195 # feed DataArray apply_variable_ufunc through apply_dataarray_vfunc 1196 elif any(isinstance(a, DataArray) for a in args): -> 1197 return apply_dataarray_vfunc( 1198 variables_vfunc, 1199 *args, 1200 signature=signature, 1201 join=join, 1202 exclude_dims=exclude_dims, 1203 keep_attrs=keep_attrs, 1204 ) 1205 # feed Variables directly through apply_variable_ufunc 1206 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:304, in apply_dataarray_vfunc(func, signature, join, exclude_dims, keep_attrs, *args) 299 result_coords, result_indexes = build_output_coords_and_indexes( 300 args, signature, exclude_dims, combine_attrs=keep_attrs 301 ) 303 data_vars = [getattr(a, "variable", a) for a in args] --> 304 result_var = func(*data_vars) 306 out: tuple[DataArray, ...] | DataArray 307 if signature.num_outputs > 1: File ~/checkouts/readthedocs.org/user_builds/xarray-einstats/envs/latest/lib/python3.10/site-packages/xarray/core/computation.py:761, in apply_variable_ufunc(func, signature, exclude_dims, dask, output_dtypes, vectorize, keep_attrs, dask_gufunc_kwargs, *args) 756 if vectorize: 757 func = _vectorize( 758 func, signature, output_dtypes=output_dtypes, exclude_dims=exclude_dims 759 ) --> 761 result_data = func(*input_data) 763 if signature.num_outputs == 1: 764 result_data = (result_data,) ValueError: operands could not be broadcast together with shapes (4,6) (4,)