精华内容
下载资源
问答
  • 在MATLAB中实现MK趋势检验,包括突变点分析图
  • MK趋势检验matlab程序

    2020-04-28 23:18:47
    MK趋势检验matlab程序
  • matlab mk检验降水趋势检验,一眼就能看懂
  • 这个压缩包中的MATLAB程序代码,用于MK趋势检验,欢迎大家下载
  • 可针对遥感时序数据进行空间上的SEN趋势度分析及MK显著性检验,亲测可用
  • 实现MK突变检验,代码包含两个,具体功能详见脚本
  • MK趋势检验

    千次阅读 多人点赞 2020-03-23 20:47:18
    A=xlsread('D:\新建文件夹\遥感\MK.xlsx','Sheet1','A2:B11'); x=A(:,1); % 时间列 y=A(:,2); % 数据列 N=length(y); n=length(y); Sk=zeros(size(y)); UFk=zeros(size(y)); s=0; for i=2:n for j=1:i ...

    最近写论文要用到MK趋势检验,终于调试出可执行的代码。 

    参考:

    https://blog.csdn.net/liyanzhong/article/details/41867859

    http://blog.sciencenet.cn/blog-1103122-851049.html

    https://blog.csdn.net/qq_25102303/article/details/100727568

    感谢地学研究中心提供的代码

    clc
    clear all
    A=xlsread('D:\新建文件夹\遥感\MK.xlsx','Sheet1','A2:B11');
    x=A(:,1); % 时间列
    y=A(:,2); % 数据列
    N=length(y);
    n=length(y);
    Sk=zeros(size(y));
    UFk=zeros(size(y));
    s=0;
    for i=2:n
       for j=1:i
             if y(i)>y(j)
               s=s+1;
             else
               s=s+0;
             end
       end
       Sk(i)=s;
       E=i*(i-1)/4; 
      Var=i*(i-1)*(2*i+5)/72; 
      UFk(i)=(Sk(i)-E)/sqrt(Var);
    end
    y2=zeros(size(y));
    Sk2=zeros(size(y));
    UBk=zeros(size(y));
    s=0;
    for i=1:n
        y2(i)=y(n-i+1);
    end
    for i=2:n
       for j=1:i
             if y2(i)>y2(j)
               s=s+1;
             else
               s=s+0;
             end
       end
       Sk2(i)=s;
       E=i*(i-1)/4; 
      Var=i*(i-1)*(2*i+5)/72;
      UBk(i)=0-(Sk2(i)-E)/sqrt(Var);
    end
    UBk2=zeros(size(y));
    for i=1:n
       UBk2(i)=UBk(n-i+1);
    end
    h1=plot(x,UFk,'r-','linewidth',1.5);
    hold on
    h2=plot(x,UBk2,'b-.','linewidth',1.5);
    axis([min(x),max(x),-5,6]);
    xlabel('年份','FontName','TimesNewRoman','FontSize',12);
    ylabel('时间序列数据','FontName','TimesNewRoman','Fontsize',12);
    hold on
    plot(x,0*ones(N,1),'-.','linewidth',1); 
    ylim([-3 7]);
    h3=plot(x,1.96*ones(N,1),':','linewidth',1);
    plot(x,-1.96*ones(N,1),':','linewidth',1);
    legend([h1 h2 h3],'UF统计量','UB统计量','0.05显著水平','Location','NorthEast');
    f1=UFk;
    f2=UBk2;
    
    

     

     

    展开全文
  • 基于matlab做栅格数据的MK趋势分析
  • Mann—Kenddall 检验法,是一种气候诊断与预测技术,应用Mann-Kendall检验法可以判断气候序列中是否存在气候突变,如果存在,可确定出突变...Mann-Kendall检验法也经常用于气候变化影响下的降水、干旱频次趋势检测
  • 做水文或者气候演变趋势
  • 趋势检验方法(二)MK趋势检验

    千次阅读 2021-05-10 16:39:27
    使用MK算法检验时序数据大致趋势趋势分为无明显趋势(稳定)、趋势上升、趋势下降。 MK检验的基础: 当没有趋势时,随时间获得的数据是独立同分布的,数据随着时间不是连续相关的。 所获得的时间序列上的数据...

    MK(Mann-Kendall)检验

    a基本原理:

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

    MK检验的基础:

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

    b MK算法原理:

     

    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单调趋势检验--及原理说明https://blog.csdn.net/liuchengzimozigreat/article/details/87931248

    norm.ppf() norm.cdf() https://blog.csdn.net/shanchuan2012/article/details/52901758/

    知乎 时序数据常用趋势检测方法 https://zhuanlan.zhihu.com/p/112703276

    序列的趋势存在性检验:Cox-Stuart test和Mann-Kendall testhttps://blog.csdn.net/weixin_43850016/article/details/106457201

    时间序列数据趋势分析 Cox-Stuart、Mann-Kendall、Dickey-Fullerhttps://blog.csdn.net/qq_34356768/article/details/106559399

     

     

     

     

     

    展开全文
  • 在MATLAB中实现MK趋势检验,包括突变点分析图
  • 基于MATLAB进行长时间序列数据的MK趋势检验,程序书写简易,且循环操作简单,结果以矩阵形式输出,极大的方便初学者的实验进行。本文实验数据为所有站点的1961-2018年时间序列的SPI3数据:SPI3hebing.xls。结果显示...
  • MATLAB MK趋势检验

    2021-10-26 21:22:33
    %% MK趋势检验 function MKtrend = MKtrend(time_series) n = length(time_series); for i = 1:n s(i) = sum(time_series(i:end)>time_series(i)) - sum(time_series(i:end)<time_series(i)); end S = sum...
    %% MK趋势检验
    function MKtrend = MKtrend(time_series)
    
    n = length(time_series);
    
    for i = 1:n
        s(i) = sum(time_series(i:end)>time_series(i)) - sum(time_series(i:end)<time_series(i));
    end
    S = sum(s);
    %s是正态分布,均值为零,方差:
    varS = n*(n-1)*(2*n+5)/18;
    
    %当n>10时,标准的正态统计变量计算:
    if S > 0
        MKtrend = S-1/sqrt(varS);
    elseif S == 0
        MKtrend = 0;
    else
        MKtrend = S+1/sqrt(varS);
    end
    
    % 对于统计值MKtrend来说,大于0时,是增加趋势;小于0时,是减少趋势。
    % MKtrend的绝对值大于1.651.962.58时,表示趋势分别通过了信度为90%95%99%的显著性检验。
    

    MK趋势分析

    展开全文
  • python mk趋势检验的实现

    千次阅读 热门讨论 2021-02-16 11:14:15
    在网上查了很久有关MK突变检验的代码,大部分都是基于matlab实现。由于本人不熟悉matlab,于是将matlab代码转换成了python代码,并最终调试出正确可运行的代码。 Manner-Kendall(M-K)—突变检验原理 代码 import ...

    简介

    在网上查了很久有关MK突变检验的代码,大部分都是基于matlab实现。由于本人不熟悉matlab,于是将matlab代码转换成了python代码,并最终调试出正确可运行的代码。

    20210723
    更新了代码,以方便更好控制数据及输出图格式
    主要看到有人问参数如何修改,于是今天把代码优化了下,如有不足之处,请指正。
    数据下载积分固定在了5.大家有需要自取。

    原理

    Manner-Kendall(M-K)—突变检验原理

    初始代码

    import numpy as np
    import pandas as pd
    from matplotlib import pyplot as plt
    
    plt.rcParams['font.family'] = ['MicroSoft YaHei']
    plt.rcParams['axes.unicode_minus'] = False
    
    df = pd.read_excel(r'D:\py\data.xls')
    
    # 获取数据
    x = df['year']
    y = df['data']
    
    n = len(y)
    
    # 正序计算
    # 定义累计量序列Sk,长度n,初始值为0
    Sk = np.zeros(n)
    UFk = np.zeros(n)
    
    # 定义Sk序列元素s
    s = 0
    
    for i in range(1, n):
        for j in range(0,i):
            if y.iloc[i] > y.iloc[j]:
                s += 1
        Sk[i] = s
        E = (i+1)*(i/4)
        Var = (i+1)*i*(2*(i+1)+5)/72
        UFk[i] = (Sk[i] - E)/np.sqrt(Var)
    
    # 逆序计算
    # 定义逆累计量序列Sk2
    # 定义逆统计量序列Sk2
    y2 = np.zeros(n)
    Sk2 = np.zeros(n)
    UBk = np.zeros(n)
    
    s = 0
    y2 = y[::-1]
    
    for i in range(1, n):
        for j in range(0,i):
            if y2.iloc[i] > y2.iloc[j]:
                s += 1
        Sk2[i] = s
        E = (i+1)*(i/4)
        Var = (i+1)*i*(2*(i+1)+5)/72
        UBk[i] = -(Sk2[i] - E)/np.sqrt(Var)
    
    UBk2 = UBk[::-1]
    
    
    # 画图
    plt.figure(figsize=(7, 6), dpi=350)
    plt.plot(range(18),UFk, label='UF', color='black',marker='s')
    plt.plot(range(18), UBk2, label='UB',color='black', linestyle='--', marker='o')
    plt.ylabel('Mann-Kendall检验值')
    plt.xlabel('年份 Year')
    
    # 添加辅助线
    x_lim = plt.xlim()
    # 添加显著水平线和y=0
    plt.plot(x_lim,[-1.96,-1.96],':',color='black',label='5%显著水平')
    plt.plot(x_lim, [0,0],'--',color='black')
    plt.plot(x_lim,[1.96,1.96],':',color='black')
    plt.xticks(range(18), x.tolist(), rotation=45)
    # plt.legend(loc='upper right', bbox_to_anchor=(0.9,0.95),ncol=3,fancybox=True)
    
    # 设置图例位置,第一个参数调整左右位置,第二个参数调整上下位置
    plt.legend(bbox_to_anchor=(0.75,0.07), facecolor='w',frameon=False)
    # 添加文本注释
    plt.text(0,-1.6,'突变点检验')
    plt.savefig("../IMG/MK检验.png")
    plt.show()
    

    结果
    在这里插入图片描述

    更新code

    import numpy as np
    import pandas as pd
    from matplotlib import pyplot as plt
    
    
    class Mk:
    
        def __init__(self, filepath: str, int_x: int, int_y: int):
            """
            :param filepath: 文件路径 文件格式为.xls、.xlsx
            :param da_x: x轴数据列号
            :param da_y: y周数据列号
            """
            self.__filepath = filepath
            self.__da_x = int_x
            self.__da_y = int_y
            self.__da_x_content = None
            self.__da_y_content = None
    
        @property
        def da_x_content(self):
            return self.__da_x_content
    
        @property
        def da_y_content(self):
            return self.__da_y_content
    
        def read_data(self):
            data = pd.read_excel(self.__filepath)
            self.__da_x_content = data.iloc[:, self.__da_x]
            self.__da_y_content = data.iloc[:, self.__da_y]
    
        @staticmethod
        def __cal_mk_process(y):
            n = len(y)
    
            # 正序计算
            # 定义累计量序列Sk,长度n,初始值为0
            Sk = np.zeros(n)
            UFk = np.zeros(n)
    
            # 定义Sk序列元素s
            s = 0
    
            for i in range(1, n):
                for j in range(0, i):
                    if y.iloc[i] > y.iloc[j]:
                        s += 1
                Sk[i] = s
                E = (i + 1) * (i / 4)
                Var = (i + 1) * i * (2 * (i + 1) + 5) / 72
                UFk[i] = (Sk[i] - E) / np.sqrt(Var)
    
            # 逆序计算
            # 定义逆累计量序列Sk2
            # 定义逆统计量序列Sk2
            y2 = np.zeros(n)
            Sk2 = np.zeros(n)
            UBk = np.zeros(n)
    
            s = 0
            y2 = y[::-1]
    
            for i in range(1, n):
                for j in range(0, i):
                    if y2.iloc[i] > y2.iloc[j]:
                        s += 1
                Sk2[i] = s
                E = (i + 1) * (i / 4)
                Var = (i + 1) * i * (2 * (i + 1) + 5) / 72
                UBk[i] = -(Sk2[i] - E) / np.sqrt(Var)
    
            UBk2 = UBk[::-1]
            return UFk, UBk2
    
        @staticmethod
        def make_img(x, UFk, UBk2, x_label = '年份 Year', y_label = 'Mann-Kendall检验值', lr = 0.75, tb = 0.07,):
            plt.rcParams['font.family'] = ['SimHei']
            plt.rcParams['axes.unicode_minus'] = False
            # 画图
            plt.figure(figsize=(7, 6), dpi=350)
            plt.plot(range(len(x)), UFk, label='UF', color='black', marker='s')
            plt.plot(range(len(x)), UBk2, label='UB', color='black', linestyle='--', marker='o')
            plt.ylabel(y_label)
            plt.xlabel(x_label)
    
            # 添加辅助线
            x_lim = plt.xlim()
            # 添加显著水平线和y=0
            plt.plot(x_lim, [-1.96, -1.96], ':', color='black', label='5%显著水平')
            plt.plot(x_lim, [0, 0], '--', color='black')
            plt.plot(x_lim, [1.96, 1.96], ':', color='black')
            plt.xticks(range(len(x)), x.tolist(), rotation=45)
            # plt.legend(loc='upper right', bbox_to_anchor=(0.9,0.95),ncol=3,fancybox=True)
    
            # 设置图例位置,第一个参数调整左右位置,第二个参数调整上下位置
            plt.legend(bbox_to_anchor=(lr, tb), facecolor='w', frameon=False)
            # 添加文本注释
            plt.text(0, -1.6, '突变点检验')
            plt.show()
    
        def cal_mk(self):
            return self.__cal_mk_process(self.da_y_content)
    
    
    if __name__ == '__main__':
        mk = Mk('data.xls', 0, 1) # 列数据
        mk.read_data()
        UFk, UBk2 = mk.cal_mk()
        mk.make_img(mk.da_x_content, UFk, UBk2) # 可通过x_label, y_label控制x,y轴标签
        # mk.make_img(mk.da_x_content, UFk, UBk2, "x", "y")
        # mk.make_img(mk.da_x_content, UFk, UBk2, "x", "y", 0.9, 0.9)# 通过lr,tb控制图例位置
    
    
    

    数据

    数据链接

    展开全文
  • MK趋势检验,mk趋势检验怎么看是否显著,matlab源码.rar
  • MK趋势检验,mk趋势检验怎么看是否显著,matlab源码.zip
  • python MK突变检验的实现及最终结果图输出
  • Mann—Kenddall 检验法,是一种气候诊断与预测技术,应用Mann-Kendall检验法可以判断气候序列中是否存在气候突变,如果存在,可确定出突变...Mann-Kendall检验法也经常用于气候变化影响下的降水、干旱频次趋势检测
  • matlab MK检验代码

    2018-08-22 21:44:34
    该matlab代码适用于MK显著性检验。类似于students t test
  • mann-kendall检验是一种强大的趋势检验,因此针对空间条件,发展了多元mk检验、区域mk检验、相关mk检验、部分mk检验等修正的mann-kendall检验。pymannkendal是非参数mann-kendall趋势分析的纯python实现,它集合了...
  • MK检验表格

    2018-04-02 21:24:37
    MK检验便捷的工具MK检验便捷的工具MK检验便捷的工具MK检验便捷的工具MK检验便捷的工具MK检验便捷的工具MK检验便捷的工具
  • MK趋势分析

    千次阅读 2020-07-02 18:48:27
    对于一个时间序列Xt = (x1,x2,…,xn),MK趋势检验的统计量S计算公式如下: 其中,sgn为检验函数: 然后计算方差Var以及Z统计量: 利用双边检验对数据进行检验,当-Z1-a<=Zs<=Z1-a时,即表明序列具有显著...
  • 气象分析中的MK检验

    2013-09-14 23:05:37
    气象分析中的经典MK突变检验程序,用一检测一个时间序列类发生突变的时间和突变方向
  • 想用R语言做个 MK检验检测序列变化趋势 做到这一步提示出错,请帮忙!!谢谢
  • 利用R语言进行MK检验检测序列变化趋势

    千次阅读 热门讨论 2019-10-12 17:16:34
    关于MK检验,目前因为搜索不到相关的R语言程序包,所以本人按照魏凤英老师在其著作《现代气候统计诊断与预测技术》中的MK检验方法,利用R语言写下如下代码,希望能够帮到大家,相互切磋,相互交流。 本文所用数据也...
  • mk检验程序

    2014-02-22 19:37:48
    用于MATLAB中时间系列的检验,趋势检验,突变检验
  • mk趋势检验代码,可计算水文、气象序列的趋势,并判断趋势的显著性,只要安装Python3以及numpy库即可计算,在test数组中输入自己的序列即可,不会可私信。相关文章见...
  • matlab编的MK检验

    2015-09-11 14:17:53
    常用的一种数学检验方法 很实用 并且还是基于Matlab语言
  • mk检验matlab程序

    2015-03-06 15:32:02
    % Mann-Kendall突变检测 % 数据序列y % 结果序列UFk,UBk2 %-------------------------------------------- %读取excel中的数据,赋给矩阵y %获取y的样本数 %A为时间和径流数据列 A=xlsread('kk.xls','Sheet1') x=A...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 510
精华内容 204
关键字:

mk趋势检验