利用Matlab实现Mann-Kendall(MK)突变检验函数

利用Matlab实现Mann-Kendall(MK)突变检验函数

一、MK突变检验

        1、一般取显著性水平α=0.05,那么临界值U0.05= ±1.96 。将UFkUBk两个统计量序列曲线和±1.96 两条直线均绘在一张图上。

         2、UFkUBk的值大于0,则表明序列呈上升趋势,小于则表明呈下降趋势。 当它们超过临界直线时,表明上升或下降趋势显著,超过临界线的范围确定为出现突变的时间区域。

        3、如果UFkUBk两条曲线出现交点,且交点在临界线之间,那么交点对应的时刻便是突变开始的时间

         4、Mann-Kendall突变检测方法的简要计算步骤:

(1)计算顺序时间序列的秩序列,按照上述公式计算UFx;

(2)计算逆序时间序列的秩序列,按照上述公式计算UBx;

(3)给定显著性水平,如a=0.05,对于临界值为U0.05 = ±1.96,将UFx与UB,两个二个统计量序列曲线与U0.05 =±1.96两条直线绘制在一个平面直角坐标α=0.10对应U0.10 = ±1.28,1=0.01对应U0.01= ±2.32。

(4)分析绘制出的UFR与UB,曲线图,若UF,或UBx的值大于0,则表明序列呈上升趋势,小于0则呈下降趋势。当它们超出临界直线时,表明上升或下降趋势显著。超过临界线的范围确定为出现突变的时间区域。若UFx与UB,两条曲线出现交叉点,且交叉点在临界线之间,它们交叉点对应的时刻便是突变开始的数据。

二、在Matlab上的两种实现方法

代码一

data1=load('D:\1\2.txt');

x=data1;

year=1987:2021; 

%% 突变检验

for i=2:length(x)

    r(i)=0;

    for j=1:i

        if x(i)>x(j)

           r(i)=r(i)+1;

        end

    end

end

for k=2:length(x)

    S(k)=sum(r(1:k));

    E(k)=k*(k-1)/4;

    Var(k)=k*(k-1)*(2*k+5)/72;

    UF(k)=(S(k)-E(k))./sqrt(Var(k));

end

x1=x(end:-1:1);

for i=2:length(x)

    r1(i)=0;

    for j=1:i

        if x1(i)>x1(j)

           r1(i)=r1(i)+1;

        end

    end

end

for k=2:length(x)

    S1(k)=sum(r1(1:k));

    E1(k)=k*(k-1)/4;

    Var1(k)=k*(k-1)*(2*k+5)/72;

   UB(k)=-(S1(k)-E1(k))./sqrt(Var1(k));

end

%% 绘图

figure(1)

plot(year,data1)

xlabel('Year','FontSize',12);

ylabel('Sunspot','FontSize',12);

set(gca,'FontSize',12);

figure(2)

plot(year,UF,'r-','MarkerSize',2,'linewidth',1.5);

hold on

plot(year,UB(end:-1:1),'b-','MarkerSize',2,'linewidth',1.5);

plot(year,1.96*ones(length(x),1),'k--','linewidth',1);

plot(year,-1.96*ones(length(x),1),'k--','linewidth',1);

xlabel('Year','FontSize',12);

ylabel('UF&UB','FontSize',12);

set(gca,'FontSize',12);

legend('UF','UB');

代码二:


[filename,pathname] = uigetfile('*.txt','请选择打开的数据文件');
file = [pathname, filename];
data = importdata(file);
x=data(:,1);%时间序列
y=data(:,2);%数据列

N=length(y);

n=length(y);

% 正序列计算---------------------------------

% 定义累计量序列Sk,长度=y,初始值=0

Sk=zeros(size(y));

% 定义统计量UFk,长度=y,初始值=0

UFk=zeros(size(y));

% 定义Sk序列元素s

s = 0;

% i从2开始,因为根据统计量UFk公式,i=1时,Sk(1)、E(1)、Var(1)均为0

% 此时UFk无意义,因此公式中,令UFk(1)=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; % Sk(i)的均值

Var=i*(i-1)*(2*i+5)/72; % Sk(i)的方差

UFk(i)=(Sk(i)-E)/sqrt(Var);

end

% ------------------------------正序列计算end

% 逆序列计算---------------------------------

% 构造逆序列y2,长度=y,初始值=0

y2=zeros(size(y));

% 定义逆序累计量序列Sk2,长度=y,初始值=0

Sk2=zeros(size(y));

% 定义逆序统计量UBk,长度=y,初始值=0

UBk=zeros(size(y));

% s归0

s=0;

% 按时间序列逆转样本y

% 也可以使用y2=flipud(y);或者y2=flipdim(y,1);

for i=1:n

y2(i)=y(n-i+1);

end

% i从2开始,因为根据统计量UBk公式,i=1时,Sk2(1)、E(1)、Var(1)均为0

% 此时UBk无意义,因此公式中,令UBk(1)=0

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; % Sk2(i)的均值

Var=i*(i-1)*(2*i+5)/72; % Sk2(i)的方差

% 由于对逆序序列的累计量Sk2的构建中,依然用的是累加法,即后者大于前者时s加1,

% 则s的大小表征了一种上升的趋势的大小,而序列逆序以后,应当表现出与原序列相反

% 的趋势表现,因此,用累加法统计Sk2序列,统计量公式(S(i)-E(i))/sqrt(Var(i))

% 也不应改变,但统计量UBk应取相反数以表征正确的逆序序列的趋势

UBk(i)=0-(Sk2(i)-E)/sqrt(Var);

end

% ------------------------------逆序列计算end

% 此时上一步的到UBk表现的是逆序列在逆序时间上的趋势统计量

% 与UFk做图寻找突变点时,2条曲线应具有同样的时间轴,因此

% 再按时间序列逆转结果统计量UBk,得到时间正序的UBk2,做图用

UBk2=zeros(size(y));

% 也可以使用UBk2=flipud(UBk);或者UBk2=flipdim(UBk,1);

for i=1:n

UBk2(i)=UBk(n-i+1);

end

% 做突变检测图时,使用UFk和UBk2

% 写入目标xls文件:f:\test2.xls

% 目标表单:Sheet1

% 目标区域:UFk从A1开始,UBk2从B1开始

xlswrite('D:\12.xls',UFk,'Sheet1','A1');

xlswrite('D:\12.xls',UBk2,'Sheet1','B1');

figure(3)%画图

plot(x,UFk,'r-','linewidth',1.5);

hold on

plot(x,UBk2,'b-.','linewidth',1.5);

plot(x,1.96*ones(N,1),':','linewidth',1);

axis([min(x),max(x),-5,5]);

legend('UF统计量','UB统计量','0.05显著水平');

xlabel('t (year)','FontName','TimesNewRoman','FontSize',12);

ylabel('统计量','FontName','TimesNewRoman','Fontsize',12);

%grid on

hold on

plot(x,0*ones(N,1),'-.','linewidth',1);

plot(x,1.96*ones(N,1),':','linewidth',1);

plot(x,-1.96*ones(N,1),':','linewidth',1);

三、参考文献:

Mann-Kendall突变检验原理及实现

  • 15
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
### 回答1: 对于您提出的问题,我可以回答。Mann-Kendall突变检验是一种用于检测时间序列中非线性变化的统计方法,它被广泛应用于地质、气象、环境科学等领域。该检验采用秩和检验的统计方法,通过计算时间序列中每一对数值的秩和差异,来判断时间序列中是否存在突变点。 ### 回答2: mann-kendall突变检验是一种常用的非参数统计方法,用于检测时间序列数据中是否存在趋势变化或突变点。该方法的主要目的是确定时间序列数据的趋势性,并判断是否存在变化点。 mann-kendall突变检验的基本原理是比较中位数与其他数据点的大小关系,以判断时间序列数据是否存在趋势性。检验的步骤如下: 1. 首先,对给定的时间序列数据进行排序,确保数据按照时间顺序排列。 2. 然后,计算序列中每个数据点与其他数据点的差值,得到一个新的差值序列。 3. 接下来,计算差值序列中每个数据点的正负符号,并统计正负符号的数量。 4. 根据正负符号的数量,计算mann-kendall统计量,该统计量代表了时间序列数据的趋势性。 5. 最后,根据mann-kendall统计量与临界值的比较,进行假设检验。如果统计量大于临界值,则可以得出时间序列数据存在趋势的结论;反之,则可以得出时间序列数据不存在趋势的结论。 mann-kendall突变检验广泛应用于气象学、水文学、环境科学等领域,用于分析气候变化、水文变化等时间序列数据的趋势性和突变点。它具有较好的鲁棒性和适应性,能够处理各种类型的时间序列数据,并且不需要对数据进行正态性假设。然而,该方法对于数据量较大的情况可能存在计算复杂度较高的问题,因此在使用时需注意数据规模的限制。 ### 回答3: Mann-Kendall突变检验是一种用于检测时间序列数据中是否存在趋势突变的统计方法。它是由MannKendall于1945年提出的。它基于对数据的等级排列,对序列中的个别值与其他值之间的关系进行比较,并通过统计检验确定序列是否存在显著的突变。 该方法的思想是对给定的时间序列数据进行秩次排列,然后比较相邻两个数据的大小关系。具体来说,对于给定的时间序列数据,首先对每个数据进行等级赋值,然后计算每个数据与其后续数据之间的差异。对于每个时间点,如果其后续时间点较大,则计数器加1;如果较小,则计数器减1;如果相等,则计数器保持不变。最终,通过计算秩和统计量来判断序列是否存在显著的突变Mann-Kendall突变检验的零假设是序列不存在突变,即序列具有平稳趋势。如果计算得到的统计量的绝对值大于临界值,就可以拒绝零假设,认为序列存在显著的突变,即序列具有非平稳趋势。 这种检验方法简单易懂,适用于不需要对数据进行前期处理的时间序列数据。通过Mann-Kendall突变检验,可以帮助分析人员判断时间序列数据中是否存在显著突变,并为后续相关分析提供基础。然而,需要注意的是,Mann-Kendall突变检验只能用于检测时间序列数据是否存在趋势突变,而不能确定具体突变的时点。因此在进行数据分析和决策时,需要结合其他方法和领域知识来综合判断。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

日益崛起的小羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值