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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
% |/ c8 O. q8 f3 f4 u0 c) O1 P  J" A
%最近写论文需要用到MK检验法,网上收集到大量的matlab代码,但是没有一个代码能够
9 u( j9 J2 K8 D- G; x# y* t%完全正确运行或者分析信息不全,结合多位网友编写的MK检验法,经过我的改编,顺利得到
7 A% |% C) H2 ?+ f%正确的运行结果,谢谢各位网友,希望对有需要的盆友有帮助
1 k0 B4 z( R, k% {: ]( A. n, ]  U% Mann-Kendall突变检测
# a5 I7 `& S' X9 ^% 数据序列y
' O. u! ?7 @4 r' [) w1 ^, t% 结果序列UFk,UBk2' T, o( {% _2 e% {' N
%--------------------------------------------
* L+ ^- _& y0 R# F8 F% K, ?5 M%读取excel中的数据,赋给矩阵y+ u% r( p4 J& v: S0 ]
%获取y的样本数
& g; J4 a( c. r' g1 }%A为时间和径流数据列
3 x9 D  U0 C, k- z4 j9 aA=xlswrite('数据.xls')
" b7 K/ \; x0 {( fx=A(:,1);%时间序列
" {" e, r' t  P; \( ny=A(:,2);%径流数据列
% m, N) h% ^$ q3 k7 A2 e' Y: c& h2 n. zN=length(y);
: G0 d4 \" a, ~4 C( {8 ?# Dn=length(y);
8 g; Z8 F8 @' q* _7 W+ A- c% A% 正序列计算---------------------------------2 H7 K5 [0 W  w! w* b3 s8 ]
% 定义累计量序列Sk,长度=y,初始值=0
0 g1 U; ]; Q, c6 S! a- d1 QSk=zeros(size(y));
5 Q$ O+ @( Q& d% 定义统计量UFk,长度=y,初始值=0, v5 w1 O7 K7 F' V
UFk=zeros(size(y));
. |# m0 Q$ e& F$ `& l% r% T% 定义Sk序列元素s) g  O1 z" y; R; ]4 ?# b  d, H; K
s = 0;6 t7 q9 A9 [; M$ e! G0 G
% i从2开始,因为根据统计量UFk公式,i=1时,Sk(1)、E(1)、Var(1)均为0  W6 Y! R1 \8 w, ^, ]: t( A) t
% 此时UFk无意义,因此公式中,令UFk(1)=0
% y  t4 u- w; Zfor i=2:n1 y0 D- B# i( z! m
   for j=1:i
6 H: |$ M+ w/ g- K- O8 p! [6 `: P         if y(i)>y(j)1 e& M( E, V9 ^+ p; v
           s=s+1;! w/ Y6 {, O1 }' n
         else2 v6 [0 g! X5 K2 ~; d% Q
           s=s+0;% }" E- g$ G, E. E2 K0 Q# a
         end;2 z  N8 U) e5 z
   end;, x* S8 S( Y, f0 l8 r: |5 I8 N: \
   Sk(i)=s;
: p" E# [+ A& R6 G; h5 U6 E* Y   E=i*(i-1)/4; % Sk(i)的均值
/ J: F$ T1 }, B  Var=i*(i-1)*(2*i+5)/72; % Sk(i)的方差
5 z- }" V2 I5 B4 c. s$ s  UFk(i)=(Sk(i)-E)/sqrt(Var);
+ p7 ~8 y6 Q# n) aend;" S6 g2 l6 O, _8 s' d- t/ I
% ------------------------------正序列计算end$ v) B+ y% e9 t' n! P- X6 x0 e6 b: Y
% 逆序列计算---------------------------------
1 g: X9 f4 `$ Z- u4 q" h4 ~% 构造逆序列y2,长度=y,初始值=0
* _' H+ u8 t, w6 s+ W  p5 Vy2=zeros(size(y));
" f% v# A: z* ~4 O0 u0 b% 定义逆序累计量序列Sk2,长度=y,初始值=03 a- ^/ t! f# U: o+ ~
Sk2=zeros(size(y));% N, \# s5 z% s1 p% K8 M
% 定义逆序统计量UBk,长度=y,初始值=0
5 V6 X% c- h1 y* a4 tUBk=zeros(size(y));0 P- n) F- J9 C# U! w1 G9 |
% s归0
5 n7 K. H; u( B4 {9 q6 x& ms=0;, i( Y! C% n1 b! s1 e
% 按时间序列逆转样本y
# n$ u3 v! m4 R. M; w8 G' o. m% 也可以使用y2=flipud(y);或者y2=flipdim(y,1);
5 b; C1 C% b2 U7 J4 zfor i=1:n0 |! E& s* A# [7 F
    y2(i)=y(n-i+1);# j% f$ G4 p. m. ^
end;
  `* R4 ], d, k: x) x6 ^% i从2开始,因为根据统计量UBk公式,i=1时,Sk2(1)、E(1)、Var(1)均为0
4 M9 ]  h* u! V5 N5 K  P% 此时UBk无意义,因此公式中,令UBk(1)=0
2 z7 u' J: }0 l* V( `% \2 ^. ifor i=2:n, s1 d* i7 G0 W. d% `
   for j=1:i
/ W. P2 Y0 J$ i) E+ q2 x( s9 O, z* G         if y2(i)>y2(j)5 y$ H' c; c2 A% T) P* B
           s=s+1;0 q; C" V8 f1 m& d! l  c
         else
2 g  n4 l9 k5 V2 j, B           s=s+0;: T  o1 h7 I. p' S7 Z8 F6 x% ^# \- G
         end;
) r- ?; C8 w2 ^% t' b% p   end;1 h  V5 C( s$ r( r  Q* p
   Sk2(i)=s;
' c- i* ], k4 P4 d   E=i*(i-1)/4; % Sk2(i)的均值
: d7 E" `( b/ b% I6 v- P" G  Var=i*(i-1)*(2*i+5)/72; % Sk2(i)的方差4 H  E$ v; N; f+ h2 f" B! L5 |8 R
% 由于对逆序序列的累计量Sk2的构建中,依然用的是累加法,即后者大于前者时s加1,
3 O( c8 w5 o9 ?% 则s的大小表征了一种上升的趋势的大小,而序列逆序以后,应当表现出与原序列相反
! O$ ^! V; t* Q& p% 的趋势表现,因此,用累加法统计Sk2序列,统计量公式(S(i)-E(i))/sqrt(Var(i))
  D9 o" {/ n# j; h, i# Y) q% 也不应改变,但统计量UBk应取相反数以表征正确的逆序序列的趋势
# h' L* l( h; p% `  UBk(i)=0-(Sk2(i)-E)/sqrt(Var);
, [$ V* R% _& Z9 Y0 Qend;$ R# o% L4 J/ E/ l1 [
% ------------------------------逆序列计算end
; t1 Z" {* N2 A3 l% 此时上一步的到UBk表现的是逆序列在逆序时间上的趋势统计量9 `9 v) c% n( F8 P6 g8 |
% 与UFk做图寻找突变点时,2条曲线应具有同样的时间轴,因此/ o. p/ G" U+ y8 [( B' y% G+ w$ M
% 再按时间序列逆转结果统计量UBk,得到时间正序的UBk2,做图用
* T7 M& `3 U" @3 z  uUBk2=zeros(size(y));# |  P3 z7 u# O: E1 e) p
% 也可以使用UBk2=flipud(UBk);或者UBk2=flipdim(UBk,1);6 U; `3 s; r  c7 h$ O! H) P
for i=1:n
# i, V9 m  _. ^' e! c, [$ U# A   UBk2(i)=UBk(n-i+1);
; o9 D4 w& g" n  ~* O. Wend;
" S4 U8 ?! ?; Y% s2 W5 D4 _% 做突变检测图时,使用UFk和UBk23 K- Q  \$ G2 Y" K7 y
% 写入目标xls文件:f:\test2.xls. s3 {3 g* b! i) P# r
% 目标表单:Sheet1
5 i8 ?4 w; c' Q4 f$ x* R3 S1 B% 目标区域:UFk从A1开始,UBk2从B1开始
; k5 K0 j7 v: v2 ?1 p4 x3 nxlswrite('f:\test2.xls',UFk,'Sheet1','A1');$ K3 A1 F' I6 E/ \$ q
xlswrite('f:\test2.xls',UBk2,'Sheet1','B1');
; V* l" H( X" \  {figure(3)%画图" p7 C8 U8 Z: R- n' Z
plot(x,UFk,'r-','linewidth',1.5);6 L& ^: y( P3 X. @8 D; W& \  V' _* H
hold on
" Y2 E3 `# z/ i& b) s( ~plot(x,UBk2,'b-.','linewidth',1.5);5 A- N# H, k% M& [# Q6 e
plot(x,1.96*ones(N,1),':','linewidth',1);
! }: z' D! P4 Haxis([min(x),max(x),-5,5]);7 ^) [5 ~& v* P2 z
legend('UF统计量','UB统计量','0.05显著水平');
" o# r, F5 W/ M2 o- {* F( Hxlabel('t (year)','FontName','TimesNewRoman','FontSize',12);5 R/ {  ], H3 \, k( p2 g4 F
ylabel('统计量','FontName','TimesNewRoman','Fontsize',12);9 N. `/ x0 }; b( G+ A2 h
%grid on
! Q; `3 a! x( B* ^& h+ ]" Qhold on
! B  K1 F# \9 D: @! o1 t! jplot(x,0*ones(N,1),'-.','linewidth',1);
/ r# n+ f. s+ F& S5 jplot(x,1.96*ones(N,1),':','linewidth',1);
: [7 e% Q0 H" _# ]& }# kplot(x,-1.96*ones(N,1),':','linewidth',1);& w% N# K! q0 H& Z

8 E+ ?4 C0 r9 |* p% S3 ^. l. g# K9 C+ X6 q! N4 x4 y/ i2 O  I
" ^9 ^/ P2 |$ r, {

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 04:41 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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