找回密码
 注册
关于网站域名变更的通知
查看: 632|回复: 1
打印 上一主题 下一主题

利用MATLAB实现Mann-Kendall突变检测(mk突变检测)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-2-3 09:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
0 q9 Y1 W) V, j' X; N0 @
%最近写论文需要用到MK检验法,网上收集到大量的matlab代码,但是没有一个代码能够3 X& }, N- E- F8 u, ]
%完全正确运行或者分析信息不全,结合多位网友编写的MK检验法,经过我的改编,顺利得到) e, s2 B0 A; l4 [, N( j; M7 |
%正确的运行结果,谢谢各位网友,希望对有需要的盆友有帮助
' j6 Q3 n4 I( g' K% Mann-Kendall突变检测& Q7 M. }) E0 ^- q0 n7 j8 z
% 数据序列y# X6 C( v7 l! \4 T
% 结果序列UFk,UBk2" i$ W' F# X) Y5 C/ m5 B! P
%--------------------------------------------# s. w7 ~2 e& J. ~' k; _
%读取excel中的数据,赋给矩阵y
! P# i2 U, ^' y" ]. d! l%获取y的样本数
2 s& O3 P; q. d' z. O: h%A为时间和径流数据列
) j$ }9 `& m. {4 _* `A=xlswrite('数据.xls')2 X2 b+ G5 U! s" V. d
x=A(:,1);%时间序列
0 ~+ j, Y# o* Ky=A(:,2);%径流数据列6 S8 s/ W7 h! i
N=length(y);4 P2 ~7 |) c. K$ ?" j
n=length(y);
1 r( m* u- [4 j3 a% 正序列计算---------------------------------
, f# A; D  T( t' @% 定义累计量序列Sk,长度=y,初始值=0' B3 _: i1 a# T3 t' a
Sk=zeros(size(y));# f+ c" l) @& u9 X7 B9 o$ j
% 定义统计量UFk,长度=y,初始值=00 u9 V6 U2 |) m/ C
UFk=zeros(size(y));% H- [5 I" M* P
% 定义Sk序列元素s1 g/ b# ]! f: V, R; x4 G  x, ?
s = 0;
# Q+ x; w! f. P6 S7 g2 K9 i; W% i从2开始,因为根据统计量UFk公式,i=1时,Sk(1)、E(1)、Var(1)均为0
+ C/ L: M7 T" Y% 此时UFk无意义,因此公式中,令UFk(1)=0
# h7 J/ w, Q6 I/ @% \for i=2:n
) L* b: X2 p$ ?% T6 H- _   for j=1:i
& c  `& P! _( `; g         if y(i)>y(j)! `5 Q5 K7 E  {3 ~7 ?2 \9 ?5 ]1 t
           s=s+1;9 \0 O& B1 ?1 m5 S
         else, {* Q# i: |, _/ N
           s=s+0;' Z/ E1 k+ G8 \& t
         end;
2 k/ t0 J: @- R1 J8 y   end;
+ k; M( }2 U( I  v" `* D   Sk(i)=s;
& E9 J( e" ]' x) f8 s1 K4 E* H: l) V4 D   E=i*(i-1)/4; % Sk(i)的均值
! [! w: S7 a( z1 J- a  Var=i*(i-1)*(2*i+5)/72; % Sk(i)的方差' Q  `1 @" f: o# n4 _, u5 E' T% ^
  UFk(i)=(Sk(i)-E)/sqrt(Var);
2 P9 K! s# e0 S! u0 ^0 X1 Eend;; P2 a7 s: s/ U5 U& d4 @
% ------------------------------正序列计算end3 ^+ [* i$ F) a; K% x
% 逆序列计算---------------------------------
/ E- T/ I! \% D1 X; _% 构造逆序列y2,长度=y,初始值=0
6 U: R4 ~0 F! }6 b5 I$ [) ky2=zeros(size(y));. W  ]+ m0 q; [& m9 d
% 定义逆序累计量序列Sk2,长度=y,初始值=0
. m2 p- u) y: L- p; m- xSk2=zeros(size(y));
. U% h3 i; a* c  ]: J8 a% 定义逆序统计量UBk,长度=y,初始值=0
% k2 m* T* }: b1 K) s( nUBk=zeros(size(y));, [( H7 o7 b$ `  K" H
% s归0
3 G; O: g" X0 Fs=0;* Z8 F3 I: i) i# l6 P
% 按时间序列逆转样本y0 O4 ?2 Y& p+ m
% 也可以使用y2=flipud(y);或者y2=flipdim(y,1);. r( m" W+ T6 J& L- _
for i=1:n
: @" @: {; t4 Z    y2(i)=y(n-i+1);, c9 B1 U: J% Y6 w/ T
end;
$ C9 a3 Z$ a# p% i从2开始,因为根据统计量UBk公式,i=1时,Sk2(1)、E(1)、Var(1)均为0
5 Y! A  f1 I+ q% 此时UBk无意义,因此公式中,令UBk(1)=0$ C2 _2 ?! g0 m: ~4 c% D4 z( m
for i=2:n" t( o( g1 Q( k
   for j=1:i
! n2 \% B% r/ ^  {3 e         if y2(i)>y2(j)
3 U2 p5 h& j  H' G; P           s=s+1;, Y: H3 \: W% J2 h# P
         else
: J% ?. b+ L4 {4 v' r: W: w0 Y" W           s=s+0;
& U/ G  v) A1 a) ~; j         end;
! b2 c! U+ S' e9 s+ g   end;
/ ^3 C5 a9 x5 O3 l7 @/ S   Sk2(i)=s;
2 p6 R9 b1 n% O- b* z   E=i*(i-1)/4; % Sk2(i)的均值
8 e: X; g! l! L  Var=i*(i-1)*(2*i+5)/72; % Sk2(i)的方差' U9 v3 r/ n7 R% R1 _% `
% 由于对逆序序列的累计量Sk2的构建中,依然用的是累加法,即后者大于前者时s加1,
% f, T& \6 k. W* W3 ^& |% 则s的大小表征了一种上升的趋势的大小,而序列逆序以后,应当表现出与原序列相反
1 _$ c/ I* r# q) O7 `% 的趋势表现,因此,用累加法统计Sk2序列,统计量公式(S(i)-E(i))/sqrt(Var(i))
& g9 F0 ?* j" y2 y$ F% 也不应改变,但统计量UBk应取相反数以表征正确的逆序序列的趋势
: U* Z, i. _7 V+ ^! Z$ _5 l- l, i/ |  UBk(i)=0-(Sk2(i)-E)/sqrt(Var);
5 u8 ]) g3 l& G- L" }end;' p& W. E* Q9 L/ d& J
% ------------------------------逆序列计算end" X+ n) T: _$ ^1 p- n" ?
% 此时上一步的到UBk表现的是逆序列在逆序时间上的趋势统计量
/ J1 P. q& J; ~% 与UFk做图寻找突变点时,2条曲线应具有同样的时间轴,因此: u0 N! P& L4 o; ?! q
% 再按时间序列逆转结果统计量UBk,得到时间正序的UBk2,做图用
9 i! d* S* ~' E) U9 E, O0 ~# a) mUBk2=zeros(size(y));
5 ]2 M- B0 `* m3 {# _& f3 `% 也可以使用UBk2=flipud(UBk);或者UBk2=flipdim(UBk,1);$ w+ P. k9 w) G3 R3 M# N! g
for i=1:n
. u0 V5 _9 o' d' x0 m  z   UBk2(i)=UBk(n-i+1);0 L* h4 |5 R" E+ w: B% e5 Q
end;4 F% q( g' E" G
% 做突变检测图时,使用UFk和UBk2& Z! S* H4 r. p- j. w
% 写入目标xls文件:f:\test2.xls
- Y9 Y' N4 S; F& q8 m+ d" h% 目标表单:Sheet11 n' L9 e# u: m& n+ o1 A
% 目标区域:UFk从A1开始,UBk2从B1开始
: R6 S, y6 F9 S- M1 r+ U/ G3 `xlswrite('f:\test2.xls',UFk,'Sheet1','A1');
. |' c4 D5 T6 x( Q8 B2 axlswrite('f:\test2.xls',UBk2,'Sheet1','B1');
' Q' j. h: u( @* L6 }0 |1 Z$ i6 ifigure(3)%画图
/ H+ m! Y+ S" T+ d. ]% S" T) eplot(x,UFk,'r-','linewidth',1.5);
1 p" q/ E) B2 W+ d, Q7 K1 F+ \/ nhold on
( i# Q# p, f) ^plot(x,UBk2,'b-.','linewidth',1.5);6 V; o  j  S1 a3 G, j9 F* Y6 b" `
plot(x,1.96*ones(N,1),':','linewidth',1);
) D1 G( b% b. g4 x( Caxis([min(x),max(x),-5,5]);& R# k! f, l/ m3 i' q
legend('UF统计量','UB统计量','0.05显著水平');$ K9 C8 |1 p8 b7 ~9 a0 [8 r
xlabel('t (year)','FontName','TimesNewRoman','FontSize',12);/ ?6 g3 c) p6 u9 w9 \
ylabel('统计量','FontName','TimesNewRoman','Fontsize',12);
6 ~5 G0 O" i' `7 U%grid on! g% f4 O  u+ i* ~  h% r  m0 _
hold on5 ]! s. s* H: F, Z5 r2 c
plot(x,0*ones(N,1),'-.','linewidth',1);
7 k" A6 P" R/ |5 Gplot(x,1.96*ones(N,1),':','linewidth',1);
2 z: S5 F5 ?; G5 t; U* ]plot(x,-1.96*ones(N,1),':','linewidth',1);
# j  u  M: E( O4 ~
' j1 ~5 p! B2 m- S* G! b
+ Y+ U% h! C- x0 W/ R& _' R0 s: q3 F" F! |& |

该用户从未签到

2#
发表于 2020-2-3 19:03 | 只看该作者
谢谢分享程序
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-2 22:56 , Processed in 0.156250 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表