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)> Size: 192B 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 24B 'a' 'b' 'c' 'd' 'e' 'f' * chain (chain) int64 32B 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/78/lib/python3.12/site-packages/scipy/stats/_stats_py.py:3396, in median_abs_deviation(x, axis, center, scale, nan_policy) 3393 med = np.expand_dims(center(x, axis=axis), axis) 3394 mad = np.median(np.abs(x - med), axis=axis) -> 3396 return mad / scale File ~/checkouts/readthedocs.org/user_builds/xarray-einstats/envs/78/lib/python3.12/site-packages/xarray/computation/arithmetic.py:84, in SupportsArithmetic.__array_ufunc__(self, ufunc, method, *inputs, **kwargs) 75 raise NotImplementedError( 76 "xarray objects are not yet supported in the `out` argument " 77 "for ufuncs. As an alternative, consider explicitly " 78 "converting xarray objects to NumPy arrays (e.g., with " 79 "`.values`)." 80 ) 82 join = dataset_join = OPTIONS["arithmetic_join"] ---> 84 return apply_ufunc( 85 ufunc, 86 *inputs, 87 input_core_dims=((),) * ufunc.nin, 88 output_core_dims=((),) * ufunc.nout, 89 join=join, 90 dataset_join=dataset_join, 91 dataset_fill_value=np.nan, 92 kwargs=kwargs, 93 dask="allowed", 94 keep_attrs=_get_keep_attrs(default=True), 95 ) File ~/checkouts/readthedocs.org/user_builds/xarray-einstats/envs/78/lib/python3.12/site-packages/xarray/computation/apply_ufunc.py:1267, 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, on_missing_core_dim, *args) 1265 # feed DataArray apply_variable_ufunc through apply_dataarray_vfunc 1266 elif any(isinstance(a, DataArray) for a in args): -> 1267 return apply_dataarray_vfunc( 1268 variables_vfunc, 1269 *args, 1270 signature=signature, 1271 join=join, 1272 exclude_dims=exclude_dims, 1273 keep_attrs=keep_attrs, 1274 ) 1275 # feed Variables directly through apply_variable_ufunc 1276 elif any(isinstance(a, Variable) for a in args): File ~/checkouts/readthedocs.org/user_builds/xarray-einstats/envs/78/lib/python3.12/site-packages/xarray/computation/apply_ufunc.py:310, in apply_dataarray_vfunc(func, signature, join, exclude_dims, keep_attrs, *args) 305 result_coords, result_indexes = build_output_coords_and_indexes( 306 args, signature, exclude_dims, combine_attrs=keep_attrs 307 ) 309 data_vars = [getattr(a, "variable", a) for a in args] --> 310 result_var = func(*data_vars) 312 out: tuple[DataArray, ...] | DataArray 313 if signature.num_outputs > 1: File ~/checkouts/readthedocs.org/user_builds/xarray-einstats/envs/78/lib/python3.12/site-packages/xarray/computation/apply_ufunc.py:818, in apply_variable_ufunc(func, signature, exclude_dims, dask, output_dtypes, vectorize, keep_attrs, dask_gufunc_kwargs, *args) 813 elif vectorize: 814 func = _vectorize( 815 func, signature, output_dtypes=output_dtypes, exclude_dims=exclude_dims 816 ) --> 818 result_data = func(*input_data) 820 if signature.num_outputs == 1: 821 result_data = (result_data,) ValueError: operands could not be broadcast together with shapes (4,6) (4,)