Skip to content

Commit

Permalink
Mann-Kendall 趋势检验
Browse files Browse the repository at this point in the history
  • Loading branch information
Zhigang Song committed Sep 17, 2023
1 parent f7a917d commit df1938f
Showing 1 changed file with 85 additions and 5 deletions.
90 changes: 85 additions & 5 deletions _posts/quant/2023-09-15-time-sequence-treading-algorithm.md
Original file line number Diff line number Diff line change
Expand Up @@ -153,14 +153,94 @@ MK 检验的基础:
- 如果有缺失值或者值低于一个或多个检测限制, 是可以计算 MK 检测的, 但检测性能会受到不利影响.
- 独立性假设要求样本之间的时间足够大, 这样在不同时间收集的测量值之间不存在相关性

参考:
## 算法过程(没看懂)

- [CSDN 多项式拟合(最小二乘法)](https://blog.csdn.net/aaakirito/article/details/116941586)
- [CSDN Cox-stuart 趋势检验](https://blog.csdn.net/aaakirito/article/details/116646521)
1. 设零假设 $H_0$ 没有单调趋势, $H_a$ 有单调趋势
2. 数据按照采集时间一次取出, 记为 $X = [x_1, x_2, x_3, ..., x_n]$
3. 确定所有 $C_n^2$ 个 $x_j - x_i$ 的差值函数 $Sign(x_j - x_i)$, $1 \le j \lt i \le n$, 函数定义如下:

- [百度文库 Cox-Stuart 趋势检验](https://wenku.baidu.com/view/cec731b981c758f5f61f6760.html)
- [知乎 时序数据常用趋势检测方法](https://zhuanlan.zhihu.com/p/112703276)
$$
Sign(x_j - x_i) = \begin{cases}
-1 & x_j - x_i \lt 0 \\
0 & x_j - x_i = 0 \\
1 & x_j - x_i \gt 0 \\
\end{cases}
$$

4. 求检验统计量

$$
S = \sum_{i=1}^{n-1} \sum_{j=i+1}^{n} Sign(x_j - x_i)
$$

如果 $S$ 是一个正数, 那么后一部分的观测值相比之前的观测值会趋向于变大, 如果 $S$ 是一个负数, 那么后一部分的观测值相比之前的观测值会趋向于变小.

5. 如果 $n$ 比较小(比如小于 8), 则要去概率表(Gilbert 1987, Table A18, page 272)里面查找 $S$, 这个表目前找不到了, 这里给出一个 $S$ 和 $Z$ 的关系式:

$$
Z = \frac{S}{\frac{n(n-1)}{2}}
$$

6. 当 $n \ge 8$ 时, 统计量 $S$ 大致的服从正态分布, 方差通过以下方式计算

如果数据中, 每个数字都是唯一的, 则方差

$$
Var(S)= \frac{n(n-1)(2n+5)}{18}
$$

如果数据中数据存在不唯一, 则公式变为

$$
Var(S)= \frac{n(n-1)(2n+5) - \sum_{p=1}^{g} t_p(t_p-1)(2t_p+5)}{18}
$$

其中, $p$ 为重复数据数量, $g$ 为唯一数数量(结组数), $t_p$ 为每个重复数重复的次数.

当因为有或者未检测到而出现结时, $Var(S)$ 可以通过 Helsel(2005, p.191)中的结修正方法来修正.

7. 计算标准化后的检验统计量 Z 如下:

$$
Z = \begin{cases}
\frac{S-1}{\sqrt{V_{ar}(S)}} & S>0 \\
0 & S=0 \\
\frac{S+1}{\sqrt{V_{ar}(S)}} & S<0 \\
\end{cases}
$$

8. 回到 $H_0$ 和 $H_a$ 假设

错误率为 $\alpha$, $0 \lt \alpha \lt 0.5$, 注意 $\alpha$ 是 MK 检验错误地拒绝了零假设时可以容忍的概率, 即 MK 检验拒绝了零假设时错误的, 但是这个事情发生的概率是 $\alpha$, 我们可以容忍这个错误.

9. $P$ 值计算验证(可选)

$$
P = 2(1-cdf(|Z|))
$$

10. 最终得到错误率为 $\alpha$, $0 \lt \alpha \lt 0.5$, $|Z| \ge Z_{1-\frac{\alpha}{2}}$, $Z_{1-\frac{\alpha}{2}}$ 为 $ppf(1-\frac{\alpha}{2})$(为什么是 $1 - \frac{\alpha}{2}$, 是因为概率为正态分布而且左右两边均存在, 且 $1-\frac{\alpha}{2}$ 为置信度)

在双边趋势检验中, 对于给定的置信水平 $\alpha$ (显著性水平), 若 $|Z| \ge Z_{1 - \frac{\alpha}{2}}$, 则原假设 $H_0$ 是不可接受的, 即在置信水平 $\alpha$ (显著性检验水平)上, 时间序列数据存在明显的上升或下降趋势. $Z$ 为正值表示上升趋势, 负值表示减少趋势, $Z$ 的绝对值在大于等于 $1.645, 1.96, 2.576$ 时表示分别通过了置信度 $90\%, 95\%, 99\%$ 的显著性检验. 计算过程: 以 $ \alpha = 0.1$ 为例, $Z_{1-\frac{\alpha}{2}} = Z_{0.95}$, 查询标准正态分布表 $Z_{0.95} = 1.645$, 故 $Z \ge 1.645$ 时通过 $90\%$ 的显著性检验, $H_0$ 假设不成立, $Z \gt 0$, 序列存在上升趋势.

优点: 功能强大, 不需要样本遵从一定的分布, 部分数据缺失不会对结果造成影响, 不受少数异常值的干扰, 适用性强. 不但可以检验时间序列的变化趋势, 还可以检验时间序列是否发生了突变.

缺点: 暂未发现, 待后续补充.

主要参考资料:

- [CSDN - 多项式拟合(最小二乘法)](https://blog.csdn.net/aaakirito/article/details/116941586)
- [CSDN - Cox-stuart 趋势检验](https://blog.csdn.net/aaakirito/article/details/116646521)
- [CSDN - MK 趋势检验](https://blog.csdn.net/aaakirito/article/details/116600294)

更多资料:

- [机器学习--线性回归算法的原理及优缺点](https://www.cnblogs.com/lsm-boke/p/11746274.html)
- [知乎 最小二乘法(least sqaure method)](https://zhuanlan.zhihu.com/p/38128785/)
- [知乎 多项式曲线拟合](https://zhuanlan.zhihu.com/p/53056358)
- [知乎 时序数据常用趋势检测方法](https://zhuanlan.zhihu.com/p/112703276)
- [百度文库 Cox-Stuart 趋势检验](https://wenku.baidu.com/view/cec731b981c758f5f61f6760.html)
- [python 中的 Mann-Kendall 单调趋势检验--及原理说明](https://blog.csdn.net/liuchengzimozigreat/article/details/87931248)
- [norm.ppf() norm.cdf() 【Matlab】正态分布常用函数](https://blog.csdn.net/shanchuan2012/article/details/52901758/)
- [序列的趋势存在性检验:Cox-Stuart test 和 Mann-Kendall test](https://blog.csdn.net/weixin_43850016/article/details/106457201)
- [时间序列数据趋势分析 Cox-Stuart、Mann-Kendall、Dickey-Fuller](https://blog.csdn.net/qq_34356768/article/details/106559399)

0 comments on commit df1938f

Please sign in to comment.