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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

/ [* g9 }/ O* k& {, i5 J* ]%最近写论文需要用到MK检验法,网上收集到大量的matlab代码,但是没有一个代码能够
1 J- f" i: j: u# `  s$ j+ x%完全正确运行或者分析信息不全,结合多位网友编写的MK检验法,经过我的改编,顺利得到
5 [3 f: z1 p# n% c3 E( f$ r%正确的运行结果,谢谢各位网友,希望对有需要的盆友有帮助
" w/ b) G: J% C% W, J% Mann-Kendall突变检测( }/ p. U7 c( t
% 数据序列y# i7 G+ ]) ~' P* |6 ^
% 结果序列UFk,UBk2
# ~; n' `# V9 s3 C- N%--------------------------------------------
# c9 d+ c/ _3 |0 O%读取excel中的数据,赋给矩阵y: l8 a' r- P9 G3 Y
%获取y的样本数
  d" a) l. z! B3 I+ b/ W) C. P%A为时间和径流数据列
* k6 y$ A9 t. P( |0 o* E8 c2 YA=xlswrite('数据.xls')
" S$ T5 g5 G# ~, w* Cx=A(:,1);%时间序列
: _5 @4 K/ k5 x+ M( @8 Ky=A(:,2);%径流数据列& e# Y1 @! y$ O0 z% h6 _
N=length(y);9 J, L9 u5 F# [- y
n=length(y);5 E7 L; `" b& d3 B1 f; O' X
% 正序列计算---------------------------------
9 R" s8 s1 C% W1 Y% 定义累计量序列Sk,长度=y,初始值=0
+ n: Y+ Z( w: I! q3 d: HSk=zeros(size(y));
; d8 k( F% f0 Y- O& d$ \5 c% 定义统计量UFk,长度=y,初始值=0
# [- e  k; N5 ~8 k$ |# @8 c; f$ @UFk=zeros(size(y));& p6 ^; v2 G$ u4 d3 n+ \
% 定义Sk序列元素s
. e2 z  @" Q+ }, S  E8 ^s = 0;* p. s6 D! B3 |2 O9 U' |8 |
% i从2开始,因为根据统计量UFk公式,i=1时,Sk(1)、E(1)、Var(1)均为0
# X# L7 V) U* D% 此时UFk无意义,因此公式中,令UFk(1)=0( Z% q/ M9 |) V! q# |6 s
for i=2:n
0 V( n$ w# a. K! L$ `6 u- B+ X   for j=1:i* n  @: h2 O# \! z8 @4 c
         if y(i)>y(j)
3 |- q, D# R  f2 y           s=s+1;, s, [0 C$ y# }4 K
         else
2 h6 H9 D2 l+ D8 V           s=s+0;5 D: \5 R5 L+ g% {2 M
         end;
7 D$ \( d% z! p% q   end;
3 }7 o* I2 d- z   Sk(i)=s;6 C( y' Y8 z% o) q0 o6 P4 b
   E=i*(i-1)/4; % Sk(i)的均值
; p" T0 v7 E2 P+ U2 H; m  Var=i*(i-1)*(2*i+5)/72; % Sk(i)的方差% ^. J* E2 M% f, T- L) ^
  UFk(i)=(Sk(i)-E)/sqrt(Var);
  E/ o* Y# }$ k" A! Hend;
8 X" W- o6 D+ X' r/ y% ------------------------------正序列计算end+ [6 t% }; _6 e* w# g# w; T
% 逆序列计算---------------------------------- v7 ?3 E: v/ _! D6 P& a
% 构造逆序列y2,长度=y,初始值=09 F& p# @: \( j2 M. h6 Y; E: V
y2=zeros(size(y));* W4 N1 ~7 d& P
% 定义逆序累计量序列Sk2,长度=y,初始值=0
9 z! X4 {$ |" Q2 P, J7 @Sk2=zeros(size(y));
& Z( k( Z0 Y4 w: x/ {% 定义逆序统计量UBk,长度=y,初始值=0
  ]+ R) j2 p& y7 U+ }UBk=zeros(size(y));! L& X8 w1 Y3 P5 i' M
% s归0
% Z3 K$ n: h) q! D0 rs=0;) ~) U8 O  O0 N" I
% 按时间序列逆转样本y+ ^& o" f4 d" u8 F. F# P4 G0 [. O
% 也可以使用y2=flipud(y);或者y2=flipdim(y,1);  k- y" }" X' K' o) h: `5 i
for i=1:n( {6 W& [; O6 A5 f8 N
    y2(i)=y(n-i+1);" ~: c% P/ v2 j: {. k
end;
. g+ b1 I  W3 L% i从2开始,因为根据统计量UBk公式,i=1时,Sk2(1)、E(1)、Var(1)均为0
5 {& E5 P( G/ `8 e( {, p( C% 此时UBk无意义,因此公式中,令UBk(1)=0/ p% A) `9 J4 e) v7 x! t
for i=2:n
  v! `* H" J6 }' U+ G3 [# W   for j=1:i, U9 m/ E+ A4 w0 F: g$ Z! {
         if y2(i)>y2(j)) i* n  `- N) ^! H8 n" Z! Y, ?, W
           s=s+1;
0 {+ P, f: f' L: ?  g5 f         else
6 G( d- U- u% k" E           s=s+0;) ?" z1 F' i+ E" F0 f& ], ~& t
         end;
8 N+ E% R$ F& U/ R# q* ^8 F$ g- l   end;
2 W6 R( {* N+ L3 Z! j  _6 z& R8 P8 B   Sk2(i)=s;$ r8 F& c: M7 f
   E=i*(i-1)/4; % Sk2(i)的均值
7 ~) @3 M# `+ y7 ]! t, }& Z  Var=i*(i-1)*(2*i+5)/72; % Sk2(i)的方差3 ~9 N1 [4 Z- @4 Q' u% v1 L
% 由于对逆序序列的累计量Sk2的构建中,依然用的是累加法,即后者大于前者时s加1,
# _. A7 N5 i: f9 g9 e4 \7 `% 则s的大小表征了一种上升的趋势的大小,而序列逆序以后,应当表现出与原序列相反. f& r: \2 G$ A" T$ i
% 的趋势表现,因此,用累加法统计Sk2序列,统计量公式(S(i)-E(i))/sqrt(Var(i))
$ n5 k/ u, f/ I  p/ l5 [" j8 p% 也不应改变,但统计量UBk应取相反数以表征正确的逆序序列的趋势
" k$ ]  d$ Z8 a6 K9 ?  UBk(i)=0-(Sk2(i)-E)/sqrt(Var);. Z3 m! @" l5 M8 q$ z' w
end;
( s  E/ B7 ?- g% ------------------------------逆序列计算end$ a* w; D' o- g) I' {/ _. z
% 此时上一步的到UBk表现的是逆序列在逆序时间上的趋势统计量
. a& F9 s  h1 T2 E/ A/ J% 与UFk做图寻找突变点时,2条曲线应具有同样的时间轴,因此
- f& h- U# I3 ?# N9 _% 再按时间序列逆转结果统计量UBk,得到时间正序的UBk2,做图用# D3 r7 I8 }6 z
UBk2=zeros(size(y));8 q: x1 d2 ^; ?) E5 R' _( H1 Y2 X
% 也可以使用UBk2=flipud(UBk);或者UBk2=flipdim(UBk,1);/ d% q( N7 B' T' X
for i=1:n
. O6 u% T0 A  y* F3 S+ t2 T   UBk2(i)=UBk(n-i+1);
5 z  i$ G6 T- A8 T1 dend;
* G) w( T6 S( u: A' ]% 做突变检测图时,使用UFk和UBk2  Y9 v9 T; ?, a9 O" k8 B
% 写入目标xls文件:f:\test2.xls8 k: f- F" _" U7 S1 h
% 目标表单:Sheet1
' H* @$ b) m4 @2 Q2 b% 目标区域:UFk从A1开始,UBk2从B1开始# n6 N5 c! ?5 I7 O  |$ u/ ~
xlswrite('f:\test2.xls',UFk,'Sheet1','A1');9 ~) S; ~' F7 n! Q7 A
xlswrite('f:\test2.xls',UBk2,'Sheet1','B1');
% U8 B9 j. N. \6 Q; n& ifigure(3)%画图
5 c& O6 ]/ J6 R( vplot(x,UFk,'r-','linewidth',1.5);
$ P3 t" i! ?* z3 Ihold on
# q( i. ^& [0 |# n$ mplot(x,UBk2,'b-.','linewidth',1.5);
3 |; q0 @8 b' Uplot(x,1.96*ones(N,1),':','linewidth',1);
, w) e5 u" Z* P' B7 f5 laxis([min(x),max(x),-5,5]);
' \0 {# k- S: ]2 L' Nlegend('UF统计量','UB统计量','0.05显著水平');
9 ?9 C' ^5 X  x  S% a. yxlabel('t (year)','FontName','TimesNewRoman','FontSize',12);- y& p2 z! n' H4 g2 D
ylabel('统计量','FontName','TimesNewRoman','Fontsize',12);
) a# ?4 ?+ Q7 z+ i& z0 p%grid on, n- x! Z8 @* A( ^( k8 a, @+ D) d4 M% i
hold on
0 i# X4 `( I% q# b8 F0 Gplot(x,0*ones(N,1),'-.','linewidth',1);
  z- K& o  s- u& Uplot(x,1.96*ones(N,1),':','linewidth',1);% C0 M* r: j/ \/ I0 C
plot(x,-1.96*ones(N,1),':','linewidth',1);
* L- W% g0 U. }2 x! i4 N
* F9 A6 N& \- J* _& ~3 p( E$ g4 I5 H  _; r, Q

# V9 o. _, f& ^

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 22:14 , Processed in 0.171875 second(s), 23 queries , Gzip On.

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

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

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