赞
踩
使用MK算法检验时序数据大致趋势,趋势分为无明显趋势(稳定)、趋势上升、趋势下降。
上面置信度为1-alpha,写错了
优点:功能强大,不需要样本遵从一定的分布,部分数据缺失不会对结果造成影响,不受少数异常值的干扰,适用性强。
不但可以检验时间序列的变化趋势,还可以检验时间序列是否发生了突变。
缺点:暂未发现,待后续补充。
目前MK检验还没有可直接调用的函数,具体MK模板可以根据下面所写的实例去修改
- from scipy.stats import norm
- import numpy as np
-
-
- def mk(x, alpha=0.1): # 0<alpha<0.5 1-alpha/2为置信度
- n = len(x)
-
- # 计算S的值
- s = 0
- for j in range(n - 1):
- for i in range(j + 1, n):
- s += np.sign(x[i] - x[j])
-
- # 判断x里面是否存在重复的数,输出唯一数队列unique_x,重复数数量队列tp
- unique_x, tp = np.unique(x, return_counts=True)
- g = len(unique_x)
-
- # 计算方差VAR(S)
- if n == g: # 如果不存在重复点
- var_s = (n * (n - 1) * (2 * n + 5)) / 18
- else:
- var_s = (n * (n - 1) * (2 * n + 5) - np.sum(tp * (tp - 1) * (2 * tp + 5))) / 18
-
- # 计算z_value
- if n <= 10: # n<=10属于特例
- z = s / (n * (n - 1) / 2)
- else:
- if s > 0:
- z = (s - 1) / np.sqrt(var_s)
- elif s < 0:
- z = (s + 1) / np.sqrt(var_s)
- else:
- z = 0
-
- # 计算p_value,可以选择性先对p_value进行验证
- p = 2 * (1 - norm.cdf(abs(z)))
-
- # 计算Z(1-alpha/2)
- h = abs(z) > norm.ppf(1 - alpha / 2)
-
- # 趋势判断
- if (z < 0) and h:
- trend = 'decreasing'
- elif (z > 0) and h:
- trend = 'increasing'
- else:
- trend = 'no trend'
-
- return trend
python中的Mann-Kendall单调趋势检验--及原理说明python中的Mann-Kendall单调趋势检验--及原理说明_liucheng_zimozigreat的博客-CSDN博客_mann-kendall检验
norm.ppf() norm.cdf() 【Matlab】正态分布常用函数normpdf_normcdf_norminv_normrnd_normfit_itsc的博客-CSDN博客_matlab正态分布函数
知乎 时序数据常用趋势检测方法 时序数据常用趋势检测方法 - 知乎
序列的趋势存在性检验:Cox-Stuart test和Mann-Kendall test序列的趋势存在性检验:Cox-Stuart test和Mann-Kendall test_老身聊发少年狂的博客-CSDN博客_趋势存在性检验
时间序列数据趋势分析 Cox-Stuart、Mann-Kendall、Dickey-Fuller时间序列数据趋势分析 Cox-Stuart、Mann-Kendall、Dickey-Fuller_LaoChen_ZeroonE的博客-CSDN博客
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。