当前位置:   article > 正文

利用Matlab实现Mann-Kendall(MK)突变检验函数_mann kendall检验方法怎么确定突变时间

mann kendall检验方法怎么确定突变时间

利用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上的两种实现方法

代码一

  1. data1=load('D:\1\2.txt');
  2. x=data1;
  3. year=1987:2021;
  4. %% 突变检验
  5. for i=2:length(x)
  6. r(i)=0;
  7. for j=1:i
  8. if x(i)>x(j)
  9. r(i)=r(i)+1;
  10. end
  11. end
  12. end
  13. for k=2:length(x)
  14. S(k)=sum(r(1:k));
  15. E(k)=k*(k-1)/4;
  16. Var(k)=k*(k-1)*(2*k+5)/72;
  17. UF(k)=(S(k)-E(k))./sqrt(Var(k));
  18. end
  19. x1=x(end:-1:1);
  20. for i=2:length(x)
  21. r1(i)=0;
  22. for j=1:i
  23. if x1(i)>x1(j)
  24. r1(i)=r1(i)+1;
  25. end
  26. end
  27. end
  28. for k=2:length(x)
  29. S1(k)=sum(r1(1:k));
  30. E1(k)=k*(k-1)/4;
  31. Var1(k)=k*(k-1)*(2*k+5)/72;
  32. UB(k)=-(S1(k)-E1(k))./sqrt(Var1(k));
  33. end
  34. %% 绘图
  35. figure(1)
  36. plot(year,data1)
  37. xlabel('Year','FontSize',12);
  38. ylabel('Sunspot','FontSize',12);
  39. set(gca,'FontSize',12);
  40. figure(2)
  41. plot(year,UF,'r-','MarkerSize',2,'linewidth',1.5);
  42. hold on
  43. plot(year,UB(end:-1:1),'b-','MarkerSize',2,'linewidth',1.5);
  44. plot(year,1.96*ones(length(x),1),'k--','linewidth',1);
  45. plot(year,-1.96*ones(length(x),1),'k--','linewidth',1);
  46. xlabel('Year','FontSize',12);
  47. ylabel('UF&UB','FontSize',12);
  48. set(gca,'FontSize',12);
  49. legend('UF','UB');

代码二:

  1. [filename,pathname] = uigetfile('*.txt','请选择打开的数据文件');
  2. file = [pathname, filename];
  3. data = importdata(file);
  4. x=data(:,1);%时间序列
  5. y=data(:,2);%数据列
  6. N=length(y);
  7. n=length(y);
  8. % 正序列计算---------------------------------
  9. % 定义累计量序列Sk,长度=y,初始值=0
  10. Sk=zeros(size(y));
  11. % 定义统计量UFk,长度=y,初始值=0
  12. UFk=zeros(size(y));
  13. % 定义Sk序列元素s
  14. s = 0;
  15. % i从2开始,因为根据统计量UFk公式,i=1时,Sk(1)、E(1)、Var(1)均为0
  16. % 此时UFk无意义,因此公式中,令UFk(1)=0
  17. for i=2:n
  18. for j=1:i
  19. if y(i)>y(j)
  20. s=s+1;
  21. else
  22. s=s+0;
  23. end
  24. end
  25. Sk(i)=s;
  26. E=i*(i-1)/4; % Sk(i)的均值
  27. Var=i*(i-1)*(2*i+5)/72; % Sk(i)的方差
  28. UFk(i)=(Sk(i)-E)/sqrt(Var);
  29. end
  30. % ------------------------------正序列计算end
  31. % 逆序列计算---------------------------------
  32. % 构造逆序列y2,长度=y,初始值=0
  33. y2=zeros(size(y));
  34. % 定义逆序累计量序列Sk2,长度=y,初始值=0
  35. Sk2=zeros(size(y));
  36. % 定义逆序统计量UBk,长度=y,初始值=0
  37. UBk=zeros(size(y));
  38. % s归0
  39. s=0;
  40. % 按时间序列逆转样本y
  41. % 也可以使用y2=flipud(y);或者y2=flipdim(y,1);
  42. for i=1:n
  43. y2(i)=y(n-i+1);
  44. end
  45. % i从2开始,因为根据统计量UBk公式,i=1时,Sk2(1)、E(1)、Var(1)均为0
  46. % 此时UBk无意义,因此公式中,令UBk(1)=0
  47. for i=2:n
  48. for j=1:i
  49. if y2(i)>y2(j)
  50. s=s+1;
  51. else
  52. s=s+0;
  53. end
  54. end
  55. Sk2(i)=s;
  56. E=i*(i-1)/4; % Sk2(i)的均值
  57. Var=i*(i-1)*(2*i+5)/72; % Sk2(i)的方差
  58. % 由于对逆序序列的累计量Sk2的构建中,依然用的是累加法,即后者大于前者时s加1
  59. % 则s的大小表征了一种上升的趋势的大小,而序列逆序以后,应当表现出与原序列相反
  60. % 的趋势表现,因此,用累加法统计Sk2序列,统计量公式(S(i)-E(i))/sqrt(Var(i))
  61. % 也不应改变,但统计量UBk应取相反数以表征正确的逆序序列的趋势
  62. UBk(i)=0-(Sk2(i)-E)/sqrt(Var);
  63. end
  64. % ------------------------------逆序列计算end
  65. % 此时上一步的到UBk表现的是逆序列在逆序时间上的趋势统计量
  66. % 与UFk做图寻找突变点时,2条曲线应具有同样的时间轴,因此
  67. % 再按时间序列逆转结果统计量UBk,得到时间正序的UBk2,做图用
  68. UBk2=zeros(size(y));
  69. % 也可以使用UBk2=flipud(UBk);或者UBk2=flipdim(UBk,1);
  70. for i=1:n
  71. UBk2(i)=UBk(n-i+1);
  72. end
  73. % 做突变检测图时,使用UFk和UBk2
  74. % 写入目标xls文件:f:\test2.xls
  75. % 目标表单:Sheet1
  76. % 目标区域:UFk从A1开始,UBk2从B1开始
  77. xlswrite('D:\12.xls',UFk,'Sheet1','A1');
  78. xlswrite('D:\12.xls',UBk2,'Sheet1','B1');
  79. figure(3)%画图
  80. plot(x,UFk,'r-','linewidth',1.5);
  81. hold on
  82. plot(x,UBk2,'b-.','linewidth',1.5);
  83. plot(x,1.96*ones(N,1),':','linewidth',1);
  84. axis([min(x),max(x),-5,5]);
  85. legend('UF统计量','UB统计量','0.05显著水平');
  86. xlabel('t (year)','FontName','TimesNewRoman','FontSize',12);
  87. ylabel('统计量','FontName','TimesNewRoman','Fontsize',12);
  88. %grid on
  89. hold on
  90. plot(x,0*ones(N,1),'-.','linewidth',1);
  91. plot(x,1.96*ones(N,1),':','linewidth',1);
  92. plot(x,-1.96*ones(N,1),':','linewidth',1);

三、参考文献:

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/592395
推荐阅读
相关标签
  

闽ICP备14008679号