在python中使用Mann-kendall:
Q: Using Mann Kendall in python with a lot of data
在python中使用mann-Kendall,可以用scipy.stats.kendalltau,该函数返回两个值:tau-反映两个序列的相关性,接近1的值表示强烈的正相关,接近-1的值表示强烈的负相关;p_value:p值反映的是假设检验的双边p值,其零假设为无关联——即通常所谓的显著性水平,一般取p<0.05为显著。
其实上面重要的是显著性水平,至于正相关还是负相关我们可以用斜率来表示。斜率可用线性回归的斜率,也可以是Sen’s slope(python中可以用stat包提供的函数来计算)。
想了解关于风速历年变化趋势,被推荐用Mann-Kendall趋势检验,查到一篇相对详细的介绍,转译成中文以飨诸君。原文:Mann-Kendall Test For Monotonic Trend
水平有限,如有纰漏,还望斧正。
背景知识
Mann-Kendall(MK)检验(test)(Mann 1945, Kendall 1975, Gilbert 1987) 的目的是统计评估我们所感兴趣的变量,随着时间变化,是否有单调上升或下降的趋势。单调上升(下降)的趋势意味着该变量随时间增加(减少),但此趋势可能是、也可能不是线性的。MK test可替代参数线性回归分析——线性回归可检验线性拟合直线的斜率是否不为零。回归分析要求拟合回归线的残差是正态分布的,MK检验不需要这种假设,MK检验是非参数检验(不要求服从任何分布-distribution free)
Hirsch, Slack and Smith (1982, page 107)表明MK检验最好被视作探索性分析,最适合用于识别变化显着或幅度较大的站点,并量化这些结果。
相关前提(assumption)
以下这些假设是MK检验的基础:
- 当没有趋势时,随时间获得的数据是独立同分布的。独立的假设是说数据随着时间不是连续相关的。
- 所获得的时间序列上的数据代表了采样时的真是条件。(样本具有代表性)
- 样本的采集、处理和测量方法提供了总体样本中的无偏且具有代表性的观测值。
MK检验不要求数据是正态分布,也不要求变化趋势——如果存在的话——是线性的。如果有缺失值或者值低于一个或多个检测限制,是可以计算MK检测的,但检测性能会受到不利影响。独立性假设要求样本之间的时间足够大,这样在不同时间收集的测量值之间不存在相关性。
计算
MK检验是检验是否拒绝零假设(null hypothesis: H0),并接受替代假设(alternative hypothesis: Ha):
H0:没有单调趋势
Ha:存在单调趋势
最初的假设是:H0为真,在拒绝H0并接受Ha之前,数据必须要超出合理怀疑——要到达一定的置信度。
MK检验的流程 (from Gilbert 1987, pp. 209-213):
1.将数据按采集时间列出:x1,x2,…,xn,,即分别在时间1,2,…,n得到的数据。
2.确定所有n(n-1)/2个xj - xk差值的符号,其中j > k,这些差值是:x2 - x1,x3 - x1, … , xn - x1,x3 - x2,x4 - x2,…,xn - xn-2,xn - xn-1
3.令sgn(xj - xk)作为指示函数,依据xj - xk的正负号取值为1,0或-1,即:
s g n ( x j − x k ) = { 1 , x j − x k > 0 0 , x j − x k = 0 或 者 x j − x k 的 值 因 没 检 测 ( 数 据 缺 失 ) 而 不 能 确 定 ; − 1 , x j − x k < 0 ( 3 ) \boldsymbol{sgn(x_j-x_k)} =\begin{cases} \boldsymbol{ 1, x_j-x_k>0 }\\ \boldsymbol{ 0, x_j-x_k=0 }或者x_j-x_k的值因没检测(数据缺失)而不能确定;\\ \boldsymbol{ -1, x_j-x_k<0 }\\ \end{cases}\quad\quad\quad\boldsymbol{(3)} sgn(xj−xk)=⎩⎪⎨⎪⎧1,xj−xk>00,xj−xk=0或者xj−xk的值因没检测(数据缺失)而不能确定;−1,