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])
。
- 返回:
- result
SenSeasonalSlopesResult
實例 傳回值是一個具有以下屬性的物件
- intra_slopendarray
對於每個季節,Theil-Sen 斜率估計量:季節內斜率的中位數。
- inter_slopefloat
季節性 Kendall 斜率估計量:所有 季節的季節內斜率的中位數。
- result
另請參閱
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
的元素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