scipy.stats.mstats.

sen_seasonal_slopes#

scipy.stats.mstats.sen_seasonal_slopes(x)[原始碼]#

計算季節性 Theil-Sen 和 Kendall 斜率估計量。

Sen 斜率的季節性推廣計算二維陣列中每個「季節」(欄)內所有數值對之間的斜率。它會傳回一個陣列,其中包含每個季節的「季節內」斜率的中位數(每個季節的 Theil-Sen 斜率估計量),並傳回所有季節的季節內斜率的中位數(季節性 Kendall 斜率估計量)。

參數:
x二維 array_like

x 的每個欄包含一個季節內應變數的測量值。每個季節的自變數(通常是時間)假定為 np.arange(x.shape[0])

返回:
resultSenSeasonalSlopesResult 實例

傳回值是一個具有以下屬性的物件

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\) 是所有 \(j < k\)\(d_{ijk}\) 的中位數;這是季節 \(i\) 的 Theil-Sen 斜率估計量。傳回的 inter_slope 值,更廣為人知的名稱是季節性 Kendall 斜率估計量,是所有 \(i, j, k\)\(d_{ijk}\) 的中位數。

參考文獻

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

那麼 intra_slope 的元素 idijk[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