mk趋势分析和mk突变检验
时间: 2025-02-25 22:47:19 浏览: 54
### Mann-Kendall 趋势分析方法
Mann-Kendall (MK) 趋势检验是一种非参数统计检验方法,广泛应用于检测时间序列数据中的单调趋势。该方法的优点在于不依赖于特定的数据分布形式,并且对异常值具有较强的鲁棒性[^3]。
#### 计算过程
1. **构建序列**:给定一组观测数据 \( X_1, X_2, \ldots, X_n \),其中 n 是样本数量。
2. **计算S统计量**:对于每一对 i 和 j (i < j),如果 \( X_j > X_i \),则记为 +1;反之,则记为 -1 或 0(相等情况下)。最终 S 统计量等于所有这些差值的总和。
\[
S = \sum_{k=1}^{n-1}\sum_{j=k+1}^n sgn(X_j-X_k)
\]
3. **方差 Var(S)** 的计算:
\[
var(s)=\frac{1}{18}[n(n-1)(2n+5)-\sum_{p=1}^q t_p(t_p-1)(2t_p+5)]
\]
这里 q 表示相同数值组的数量,\( t_p \) 则表示第 p 组内重复次数。
4. **标准化 Z 值**:当 n 大于或等于 10 时,可以近似认为 MK 检验服从标准正态分布 N(0,1)。此时可利用下述公式求得 z 分数:
如果 \( S>0 \):
\[
Z=\frac{S-1}{\sqrt{\text {var }(s)}}
\]
否则:
\[
Z=\frac{S+1}{\sqrt{\text {var }(s)}}
\]
5. **显著水平判断**:通过查表获得对应置信度下的临界值来决定原假设是否成立。通常采用双侧检验方式,在 α 显著性水平上拒绝零假设意味着存在上升/下降的趋势。
```python
from pymannkendall import original_test
result = original_test([your_data_here])
print(f'Tau: {result.tau}, P-value: {result.p}')
```
### Mann-Kendall 突变检验方法
除了上述用于评估整体趋势外,还可以借助 Pettitt's test 来识别潜在的变化点位置——即所谓的“突变”。此技术同样基于秩次变换原理,旨在寻找最有可能发生结构性改变的时间节点。
具体实现如下所示:
1. 对原始序列按照升序排列并赋予相应排名;
2. 构造辅助函数 U(i), 它反映了前 i 项累积差异情况;
3. 寻找使得 |U(i)| 达到最大绝对值得那个时刻作为可能断点;
4. 结合 K-S 检验或其他手段进一步验证所得结论的有效性和可靠性。
```python
import numpy as np
from scipy.stats import norm
def pettit_test(x):
"""Pettit’s change point detection."""
n = len(x)
k = range(1, n)
r = stats.rankdata(x).astype(int)
u = [abs(sum(r[:kk])-(kk)*(n+1)/2.) for kk in k]
u_star = max(u)
du = abs(np.diff(x))
w = sum(du)+((min(du))**2)/(2*sum(du))
p_value = 2*(1-norm.cdf(u_star/w*np.sqrt(2/n)))
cp_loc = int(k[list(u).index(u_star)])
return {'change_point_location': cp_loc,
'u_statistic': u_star,
'w_statistic': w,
'p_value': p_value}
# Example usage with synthetic data containing a known changepoint at index 50.
np.random.seed(42)
synthetic_series = list(np.random.normal(loc=-1., scale=.5, size=(50))) \
+list(np.random.normal(loc=1., scale=.5, size=(50)))
pettit_result = pettit_test(synthetic_series)
print(pettil_result)
```
阅读全文
相关推荐


















