趋势检验方法(二)MK趋势检验

MK(Mann-Kendall)检验

a基本原理:

使用MK算法检验时序数据大致趋势,趋势分为无明显趋势(稳定)、趋势上升、趋势下降。

MK检验的基础:

  1. 当没有趋势时,随时间获得的数据是独立同分布的,数据随着时间不是连续相关的。
  2. 所获得的时间序列上的数据代表了采样时的真实条件,样本要具有代表性。
  3. MK检验不要求数据是正态分布,也不要求变化趋势是线性的。
  4. 如果有缺失值或者值低于一个或多个检测限制,是可以计算MK检测的,但检测性 能会受到不利影响。
  5. 独立性假设要求样本之间的时间足够大,这样在不同时间收集的测量值之间不存在 相关性。

b MK算法原理:

上面置信度为1-alpha,写错了

c方法优缺点:

优点:功能强大,不需要样本遵从一定的分布,部分数据缺失不会对结果造成影响,不受少数异常值的干扰,适用性强。

不但可以检验时间序列的变化趋势,还可以检验时间序列是否发生了突变。

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

d算法入口:

目前MK检验还没有可直接调用的函数,具体MK模板可以根据下面所写的实例去修改

e实例参考:

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

f参考文献:

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博客

### 回答1: MK趋势检验是一种常用的非参数检验方法,用于检测变量在研究过程中是否存在趋势。所谓趋势指的是变量随时间或其它相关因素的变化趋势,常用于环境科学、气候变化、经济学等领域的研究。 MK趋势检验方法基于Mann-Kendall检验,主要包含以下步骤: 1. 数据准备:首先,收集研究所需的变量数据,包括时间和对应的观测值。 2. 数据预处理:对于任何数据分析方法,数据预处理是必要的。例如,处理缺失值、异常值等。另外,将数据按照时间排序,确保顺序正确。 3. MK统计量计算:计算MK统计量,用于检验变量的趋势MK统计量基于观测值的大小关系确定趋势的方向和强度,不受数据分布的假设限制。 4. MK统计量的标准化:将MK统计量标准化为正态分布的Z分数,便于进行统计推断。 5. 构建零假设:建立零假设,假设变量不存在趋势。根据零假设,可以计算出MK统计量的期望值和方差。 6. 假设检验:利用标准正态分布,根据MK统计量的Z分数和零假设的期望值与方差,计算出P值。如果P值小于预设的显著性水平,就可以拒绝零假设,认为存在趋势。 7. 结果解释:根据检验结果,可以判断变量是否存在上升、下降或持平的趋势。同时,也可以计算趋势的强度和显著性。 总的来说,MK趋势检验是一种简单而有效的方法,适用于时间序列数据和其它有序观测数据的趋势检测。它不需要假设数据分布,具有较好的鲁棒性和统计效能。 ### 回答2: MK趋势检验是一种非参数统计方法,用于检验样本数据中存在的趋势性变化。它是根据数据的秩次来进行推断,不依赖于特定的分布假设。MK趋势检验可以用于不同领域的时间序列数据,例如气象、环境、医学等领域。 MK趋势检验的步骤如下: 1. 对于给定的数据序列,将数据按照时间顺序排列,并为每个数据分配一个秩次,其中较小的值获得较小的秩次。 2. 计算每对数据之间的差值,并计算出差值的符号,用于判断样本数据的递增或递减趋势。 3. 计算秩次之和的期望值(E)和方差(Var)。期望值可以用来判断数据序列中存在的趋势方向,正值表示递增趋势,负值表示递减趋势,接近零表示不存在明显趋势。方差可以用来检验数据序列是否存在统计显著的趋势。 4. 根据期望值和方差,计算出MK统计量。MK统计量越大,说明数据序列中趋势性的差异越显著。 5. 利用标准正态分布的性质,可以将MK统计量转化为p值,用于判断数据序列的趋势性是否显著。一般来说,如果p值小于设定的显著性水平(通常为0.05),则可以拒绝无趋势的原假设,认为数据存在显著的趋势MK趋势检验具有很好的鲁棒性,对于不同类型的趋势变化都能有效检测。然而,MK趋势检验也有一些限制,例如样本容量的要求较高,对异常值比较敏感等。因此,在进行MK趋势检验时,需要结合实际情况进行综合分析。 ### 回答3: MK趋势检验是一种用于分析时间序列数据中趋势性变化的非参数统计方法。它可以评估一组观测数据是否具有趋势性,并判断趋势的方向和强度。它适用于各种类型的数据,包括连续的和离散的数据。 MK趋势检验的主要思想是比较数据中的每对观测值,计算每对之间的差异,并计算差异的秩次。然后,通过对秩次的总和进行统计检验,判断秩次总和的正负和显著性水平,来确定是否存在趋势MK趋势检验的步骤如下: 1. 将时间序列数据绘制成散点图,观察数据的分布模式。 2. 对于每对观测值,计算它们之间的差异,并计算这些差异的秩次。 3. 对所有的差异秩次进行累加,得到秩次总和。 4. 根据样本量和置信水平确定计算MK趋势统计量的方差,进而计算出Z值。 5. 判断Z值是否在给定显著性水平下的临界值范围内,如果在范围内,则拒绝原假设,即存在趋势;反之,接受原假设,即不存在趋势。 6. 根据秩次总和的正负,可以确定趋势的方向,正总和表示上升趋势,负总和表示下降趋势MK趋势检验具有广泛的应用领域,例如气象学中的气温变化、水文学中的河流流量、经济学中的股市指数等等。它不受数据分布的影响,而且能够有效地识别和量化时间序列数据中的趋势变化,因此在实践中具有重要的应用意义。
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值