scipy.stats.mstats.

sen_seasonal_slopes#

scipy.stats.mstats.sen_seasonal_slopes(x)[источник]#

Вычисляет сезонные оценки наклона Тейла-Сена и Кендалла.

Сезонное обобщение наклона Сена вычисляет наклоны между всеми парами значений внутри «сезона» (столбца) двумерного массива. Оно возвращает массив, содержащий медиану этих «внутрисезонных» наклонов для каждого сезона (оценщик наклона Тейла-Сена для каждого сезона), и возвращает медиану внутрисезонных наклонов по всем сезонам (оценщик сезонного наклона Кендалла).

Параметры:
x2D array_like

Каждый столбец x содержит измерения зависимой переменной в пределах сезона. Независимая переменная (обычно время) каждого сезона предполагается np.arange(x.shape[0]).

Возвращает:
результатSenSeasonalSlopesResult экземпляр

Возвращаемое значение — объект со следующими атрибутами:

intra_slopendarray

Для каждого сезона оценка наклона Тейла-Сена: медиана внутрисезонных наклонов.

inter_slopefloat

Оценка наклона сезонного Кендалла: медиана наклонов внутри сезона по всем сезоны.

Смотрите также

theilslopes

аналогичная функция для несезонных данных

scipy.stats.theilslopes

несезонные наклоны для немасштабированных массивов

Примечания

Наклоны \(d_{ijk}\) внутри сезона \(i\) являются:

\[d_{ijk} = \frac{x_{ij} - x_{ik}} {j - k}\]

для пар различных целочисленных индексов \(j, k\) of \(x\).

Элемент \(i\) возвращаемого intra_slope массив является медианой \(d_{ijk}\) по всем \(j < k\); это оценка наклона Тейла-Сена сезона \(i\). Возвращаемый inter_slope значение, более известное как сезонный оценщик наклона Кендалла, является медианой \(d_{ijk}\) по всем \(i, j, k\).

Ссылки

[1]

Hirsch, Robert M., James R. Slack, and Richard A. Smith. “Techniques of trend analysis for monthly water quality data.” Water Resources Research 18.1 (1982): 107-121.

Примеры

Предположим, у нас есть 100 наблюдений зависимой переменной для каждого из четырёх сезонов:

>>> import numpy as np
>>> rng = np.random.default_rng()
>>> x = rng.random(size=(100, 4))

Мы вычисляем сезонные наклоны как:

>>> from scipy import stats
>>> intra_slope, inter_slope = stats.mstats.sen_seasonal_slopes(x)

Если мы определим функцию для вычисления всех наклонов между наблюдениями внутри сезона:

>>> def dijk(yi):
...     n = len(yi)
...     x = np.arange(n)
...     dy = yi - yi[:, np.newaxis]
...     dx = x - x[:, np.newaxis]
...     # we only want unique pairs of distinct indices
...     mask = np.triu(np.ones((n, n), dtype=bool), k=1)
...     return dy[mask]/dx[mask]

затем элемент i of intra_slope является медианой dijk[x[:, i]]:

>>> i = 2
>>> np.allclose(np.median(dijk(x[:, i])), intra_slope[i])
True

и inter_slope является медианой значений, возвращаемых dijk для всех сезонов:

>>> all_slopes = np.concatenate([dijk(x[:, i]) for i in range(x.shape[1])])
>>> np.allclose(np.median(all_slopes), inter_slope)
True

Поскольку данные сгенерированы случайно, мы ожидаем, что медианные наклоны будут близки к нулю как внутри, так и между всеми сезонами, и действительно они таковы:

>>> intra_slope.data
array([ 0.00124504, -0.00277761, -0.00221245, -0.00036338])
>>> inter_slope
-0.0010511779872922058