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. Herescalecan also takeDataArrayvalues in which case, broadcasting is handled by xarray, as shown in the example.Examples
Use a
DataArrayasscale.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/v0.6.0/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/v0.6.0/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/v0.6.0/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/v0.6.0/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/v0.6.0/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,)