matlab实现Mann-Kendall趋势/突变检验

MATLAB 专栏收录该内容
16 篇文章 2 订阅

在时间序列趋势分析中,Mann-Kendall检验是世界气象组织推荐并已被广泛使用的非参数检验方法,最初由Mann和Kendall提出,现已被很多学者用来分析降雨、气温、径流和水质等要素时间序列的趋势变化。Mann-Kendall检验不需要样本遵从一定的分布,也不受少数异常值的干扰,适用于水文、气象等非正态分布的数据,计算简便。

1)Mann-Kendall趋势检验

在这里插入图片描述
在这里插入图片描述

2)Mann-Kendall突变检验

在这里插入图片描述
在这里插入图片描述

MATLAB代码如下:

function  [Zs ,beta ,UFk ,UBk2 ]= MKTest(Data,n)

%% 趋势分析线性:Mann-Kendall检验
Sgn=zeros(n-1,n-1);        %初始化分配内存
for i=1:n-1
    for j=i+1:n
        if((Data(j)-Data(i))>0)
            Sgn(i,j)=1;
        else
            if((Data(j)-Data(i))==0)
                Sgn(i,j)=0;
            else
                if((Data(j)-Data(i))<0)
                    Sgn(i,j)=-1;
                end
            end
        end
    end
end
Smk=sum(sum(Sgn));

VarS=n*(n-1)*(2*n+5)/18;

if n>10
    if Smk>0
        Zs=(Smk-1)/sqrt(VarS);
    else
        if Smk==0
            Zs=0;
        else
            if  Smk<0
                Zs=(Smk+1)/sqrt(VarS);
            end
        end
    end
end

%% beta 斜率 描述单调趋势
t=1;
for i=2:n
   for j=1:(i-1)
       temp(t)=( Data(i)-Data(j) )/( i-j );
       t=t+1;
   end
end
beta=median( temp );

%% 突变检验
Sk=zeros(n,1);          % 定义累计量序列Sk
UFk=zeros(n,1);        % 定义统计量UFk
s = 0;
% 正序列计算start---------------------------------
for i=2:n
   for j=1:i
         if Data(i)>Data(j)
           s=s+1;
         else
           s=s+0;
         end
   end
   Sk(i)=s;
   E=i*(i-1)/4; % Sk(i)的均值
  Var=i*(i-1)*(2*i+5)/72; % Sk(i)的方差
  UFk(i)=(Sk(i)-E)/sqrt(Var);
end
% 正序列计算end---------------------------------

% 逆序列计算start---------------------------------
Sk2=zeros(n);  % 定义逆序累计量序列Sk2
UBk=zeros(n,1); 
s=0;
Data2=flipud(Data);        % 按时间序列逆转样本y
for i=2:n
   for j=1:i
         if Data2(i)>Data2(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,1)=0-(Sk2(i)-E)/sqrt(Var);
end
% 逆序列计算end------------------------------
UBk2=flipud(UBk);
UFk=UFk';
UBk2=UBk2';
%{
figure(3)%画图
plot(1:n,UFk,'r-','linewidth',1.5);
hold on
plot(1:n,UBk2,'b-.','linewidth',1.5);
plot(1:n,1.96*ones(n,1),':','linewidth',1);
% axis([1,n,-5,8]);
legend('UF统计量','UB统计量','0.05显著水平');
xlabel('t (year)','FontName','TimesNewRoman','FontSize',12);
ylabel('统计量','FontName','TimesNewRoman','Fontsize',12);
%grid on
hold on
plot(1:n,0*ones(n,1),'-.','linewidth',1);
plot(1:n,1.96*ones(n,1),':','linewidth',1);
plot(1:n,-1.96*ones(n,1),':','linewidth',1);
%}
end
  • 9
    点赞
  • 6
    评论
  • 21
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值