Skip to main content
`Ctrl`+`K`
scipy.stats.

# expectile

scipy.stats.expectile(a, alpha=0.5, *, weights=None)

  Compute the expectile at the specified level.

  Expectiles are a generalization of the expectation in the same way as quantiles are a generalization of the median. The expectile at level alpha = 0.5 is the mean (average). See Notes for more details.

  Parameters:
    a array_like

      Array containing numbers whose expectile is desired.

    alpha float, default: 0.5

      The level of the expectile; e.g., `alpha=0.5` gives the mean.

    weights array_like, optional

      An array of weights associated with the values in a. The weights must be broadcastable to the same shape as a. Default is None, which gives each value a weight of 1.0. An integer valued weight element acts like repeating the corresponding observation in a that many times. See Notes for more details.

  Returns:
    expectile ndarray

      The empirical expectile at level `alpha`.

  See also

  `numpy.mean`

    Arithmetic average

  `numpy.quantile`

    Quantile

  Notes

  In general, the expectile at level \(\alpha\) of a random variable \(X\) with cumulative distribution function (CDF) \(F\) is given by the unique solution \(t\) of:

  \[\alpha E((X - t)_+) = (1 - \alpha) E((t - X)_+) \,.\]

  Here, \((x)_+ = \max(0, x)\) is the positive part of \(x\). This equation can be equivalently written as:

  \[\alpha \int_t^\infty (x - t)\mathrm{d}F(x) = (1 - \alpha) \int_{-\infty}^t (t - x)\mathrm{d}F(x) \,.\]

  The empirical expectile at level \(\alpha\) (`alpha`) of a sample \(a_i\) (the array a) is defined by plugging in the empirical CDF of a. Given sample or case weights \(w\) (the array weights), it reads \(F_a(x) = \frac{1}{\sum_i w_i} \sum_i w_i 1_{a_i \leq x}\) with indicator function \(1_{A}\). This leads to the definition of the empirical expectile at level `alpha` as the unique solution \(t\) of:

  \[\alpha \sum_{i=1}^n w_i (a_i - t)_+ = (1 - \alpha) \sum_{i=1}^n w_i (t - a_i)_+ \,.\]

  For \(\alpha=0.5\), this simplifies to the weighted average. Furthermore, the larger \(\alpha\), the larger the value of the expectile.

  As a final remark, the expectile at level \(\alpha\) can also be written as a minimization problem. One often used choice is

  \[\operatorname{argmin}_t E(\lvert 1_{t\geq X} - \alpha\rvert(t - X)^2) \,.\]

  Array API Standard Support

  `expectile` has experimental support for Python Array API Standard compatible backends in addition to NumPy. Please consider testing these features by setting an environment variable `SCIPY_ARRAY_API=1` and providing CuPy, PyTorch, JAX, or Dask arrays as array arguments. The following combinations of backend and device (or other capability) are supported.

  Library | CPU | GPU
  --- | --- | ---
  NumPy | ✅ | n/a
  CuPy | n/a | ⛔
  PyTorch | ⛔ | ⛔
  JAX | ⛔ | ⛔
  Dask | ⛔ | n/a

  > See Support for the array API standard for more information.

  References

  [1]

  W. K. Newey and J. L. Powell (1987), “Asymmetric Least Squares Estimation and Testing,” Econometrica, 55, 819-847.

  [2]

  T. Gneiting (2009). “Making and Evaluating Point Forecasts,” Journal of the American Statistical Association, 106, 746 - 762. DOI:10.48550/arXiv.0912.0902

  Examples

      >>> import numpy as np
      >>> from scipy.stats import expectile
      >>> a = [1, 4, 2, -1]
      >>> expectile(a, alpha=0.5) == np.mean(a)
      True
      >>> expectile(a, alpha=0.2)
      0.42857142857142855
      >>> expectile(a, alpha=0.8)
      2.5714285714285716
      >>> weights = [1, 3, 1, 1]
      >>> expectile(a, alpha=0.8, weights=weights)
      3.3333333333333335