scipy.stats.mstats.

sen_seasonal_slopes#

scipy.stats.mstats.sen_seasonal_slopes(x)[源代码][源代码]#

计算季节性 Theil-Sen 和 Kendall 斜率估计量。

Sen 斜率的季节性泛化计算了二维数组中一个“季节”(列)内所有值对之间的斜率。它返回一个数组,其中包含每个季节(每个季节的 Theil-Sen 斜率估计器)的这些“季节内”斜率的中位数,并返回所有季节内斜率的中位数(季节性 Kendall 斜率估计器)。

参数:
x2D array_like

x 的每一列包含一个季节内因变量的测量值。每个季节的自变量(通常是时间)假设为 np.arange(x.shape[0])

返回:
结果 : SenSeasonalSlopesResult 实例SenSeasonalSlopesResult 实例

返回值是一个具有以下属性的对象:

intra_slopendarray

对于每个季节,Theil-Sen 斜率估计器:季节内斜率的中位数。

inter_slope浮动

季节性肯德尔斜率估计器:所有季节内斜率的中位数。

参见

theilslopes

非季节性数据的类似函数

scipy.stats.theilslopes

非掩码数组的非季节性斜率

注释

在季节 \(i\) 内的斜率 \(d_{ijk}\) 是:

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

对于不同的整数索引对 \(j, k\)\(x\)

返回的 intra_slope 数组的元素 \(i\) 是所有 \(j < k\)\(d_{ijk}\) 的中位数;这是季节 \(i\) 的 Theil-Sen 斜率估计量。返回的 inter_slope 值,更广为人知的名称是季节 Kendall 斜率估计量,是所有 \(i, j, k\)\(d_{ijk}\) 的中位数。

参考文献

[1]

Hirsch, Robert M., James R. Slack, 和 Richard A. Smith. “月度水质数据趋势分析技术。” 水资源研究 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]

那么 intra_slope 的第 i 个元素是 dijk[x[:, i]] 的中位数:

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

inter_slopedijk 在所有季节返回值的中位数:

>>> 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