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]
затем элемент
iofintra_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