xarray_einstats.stats.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. Here scale can also take DataArray values in which case, broadcasting is handled by xarray, as shown in the example.

Examples

Use a DataArray as scale.

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)
Input In [2], in <cell 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.3.0/lib/python3.9/site-packages/scipy/stats/_stats_py.py:3048, in median_abs_deviation(x, axis, center, scale, nan_policy)
   3045         med = np.expand_dims(center(x, axis=axis), axis)
   3046         mad = np.median(np.abs(x - med), axis=axis)
-> 3048 return mad / scale

File ~/checkouts/readthedocs.org/user_builds/xarray-einstats/envs/v0.3.0/lib/python3.9/site-packages/xarray/core/arithmetic.py:79, in SupportsArithmetic.__array_ufunc__(self, ufunc, method, *inputs, **kwargs)
     70     raise NotImplementedError(
     71         "xarray objects are not yet supported in the `out` argument "
     72         "for ufuncs. As an alternative, consider explicitly "
     73         "converting xarray objects to NumPy arrays (e.g., with "
     74         "`.values`)."
     75     )
     77 join = dataset_join = OPTIONS["arithmetic_join"]
---> 79 return apply_ufunc(
     80     ufunc,
     81     *inputs,
     82     input_core_dims=((),) * ufunc.nin,
     83     output_core_dims=((),) * ufunc.nout,
     84     join=join,
     85     dataset_join=dataset_join,
     86     dataset_fill_value=np.nan,
     87     kwargs=kwargs,
     88     dask="allowed",
     89     keep_attrs=_get_keep_attrs(default=True),
     90 )

File ~/checkouts/readthedocs.org/user_builds/xarray-einstats/envs/v0.3.0/lib/python3.9/site-packages/xarray/core/computation.py:1159, 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)
   1157 # feed DataArray apply_variable_ufunc through apply_dataarray_vfunc
   1158 elif any(isinstance(a, DataArray) for a in args):
-> 1159     return apply_dataarray_vfunc(
   1160         variables_vfunc,
   1161         *args,
   1162         signature=signature,
   1163         join=join,
   1164         exclude_dims=exclude_dims,
   1165         keep_attrs=keep_attrs,
   1166     )
   1167 # feed Variables directly through apply_variable_ufunc
   1168 elif any(isinstance(a, Variable) for a in args):

File ~/checkouts/readthedocs.org/user_builds/xarray-einstats/envs/v0.3.0/lib/python3.9/site-packages/xarray/core/computation.py:286, in apply_dataarray_vfunc(func, signature, join, exclude_dims, keep_attrs, *args)
    281 result_coords = build_output_coords(
    282     args, signature, exclude_dims, combine_attrs=keep_attrs
    283 )
    285 data_vars = [getattr(a, "variable", a) for a in args]
--> 286 result_var = func(*data_vars)
    288 if signature.num_outputs > 1:
    289     out = tuple(
    290         DataArray(variable, coords, name=name, fastpath=True)
    291         for variable, coords in zip(result_var, result_coords)
    292     )

File ~/checkouts/readthedocs.org/user_builds/xarray-einstats/envs/v0.3.0/lib/python3.9/site-packages/xarray/core/computation.py:727, in apply_variable_ufunc(func, signature, exclude_dims, dask, output_dtypes, vectorize, keep_attrs, dask_gufunc_kwargs, *args)
    722     if vectorize:
    723         func = _vectorize(
    724             func, signature, output_dtypes=output_dtypes, exclude_dims=exclude_dims
    725         )
--> 727 result_data = func(*input_data)
    729 if signature.num_outputs == 1:
    730     result_data = (result_data,)

ValueError: operands could not be broadcast together with shapes (4,6) (4,)