sen_seasonal_slopes#
- scipy.stats.mstats.sen_seasonal_slopes(x)[源代码]#
计算季节性的 Theil-Sen 和 Kendall 斜率估计量。
Sen 斜率的季节性推广计算二维数组的“季节”(列)中所有值对之间的斜率。它返回一个数组,其中包含每个季节的这些“季节内”斜率的中位数(每个季节的 Theil-Sen 斜率估计量),并且返回跨所有季节的季节内斜率的中位数(季节性 Kendall 斜率估计量)。
- 参数:
- x2D 类数组
x 的每一列都包含一个季节内因变量的测量值。每个季节的自变量(通常是时间)假定为
np.arange(x.shape[0])
。
- 返回:
- 结果
SenSeasonalSlopesResult
实例 返回值是一个具有以下属性的对象
- intra_slopendarray
对于每个季节,Theil-Sen 斜率估计量:季节内斜率的中位数。
- inter_slopefloat
季节性 Kendall 斜率估计量:跨所有季节的季节内斜率的中位数。
- 结果
另请参阅
theilslopes
用于非季节性数据的类似函数
scipy.stats.theilslopes
用于非掩码数组的非季节性斜率
注释
季节 \(i\) 内的斜率 \(d_{ijk}\) 为
\[d_{ijk} = \frac{x_{ij} - x_{ik}} {j - k}\]对于 \(x\) 的不同的整数索引对 \(j, k\)。
返回的 intra_slope 数组的元素 \(i\) 是 \(d_{ijk}\) 在所有 \(j < k\) 上的中位数;这是季节 \(i\) 的 Theil-Sen 斜率估计量。返回的 inter_slope 值,更广为人知的是季节性 Kendall 斜率估计量,是所有 \(i, j, k\) 上 \(d_{ijk}\) 的中位数。
参考文献
[1]Hirsch, Robert M., James R. Slack, and 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_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