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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
1 c' \2 R' x7 E% L9 y" j! L0 h' y
%最近写论文需要用到MK检验法,网上收集到大量的matlab代码,但是没有一个代码能够. ]! A8 P# v# K. _& y
%完全正确运行或者分析信息不全,结合多位网友编写的MK检验法,经过我的改编,顺利得到
* L4 J; j& j9 R& S; A, r% q2 C%正确的运行结果,谢谢各位网友,希望对有需要的盆友有帮助5 H' l3 L7 D% P  Z! n: Y
% Mann-Kendall突变检测4 V% Y/ ~. Z8 L0 A
% 数据序列y& m! X1 c5 l) r0 l% ~
% 结果序列UFk,UBk2: X: z0 I% S1 r; z4 m" H
%--------------------------------------------! ~- W, F9 V* Z0 c! @* v: R
%读取excel中的数据,赋给矩阵y
* y& ?9 X) j! `9 w2 ]%获取y的样本数' ]; V8 ^/ J! w2 k
%A为时间和径流数据列
3 v3 F' c: V* V2 p0 W0 OA=xlswrite('数据.xls')" s! J  X9 r" S9 r- K, v3 z( ?
x=A(:,1);%时间序列
% k( T5 X  l4 [1 |5 U- Oy=A(:,2);%径流数据列( Z# @' R! F: l% n
N=length(y);
# z7 a8 G! Z9 h3 U4 a" a- on=length(y);3 S0 m; R9 g6 n: w
% 正序列计算---------------------------------
. w0 o* Y4 W8 g5 @' B( \% 定义累计量序列Sk,长度=y,初始值=0) [9 t, q4 k! _4 z, T' B% C
Sk=zeros(size(y));
& y( A# h" j6 E' B0 ?! |  R6 F% 定义统计量UFk,长度=y,初始值=09 o9 M! s- W6 ~3 s& e) y, L/ C' e
UFk=zeros(size(y));! T' K) g( v, |" v7 L+ W/ z# ?$ t
% 定义Sk序列元素s. a5 a3 X% t( j2 U
s = 0;
5 e! B3 A% F5 U" F* U7 A% P) K% i从2开始,因为根据统计量UFk公式,i=1时,Sk(1)、E(1)、Var(1)均为0
# Z* X6 @1 b! p% 此时UFk无意义,因此公式中,令UFk(1)=0
7 I6 q1 Y9 \* N- c' X0 M! N* [, ?for i=2:n* W  c0 [; Z4 b( u
   for j=1:i
; d4 g/ r" B  b* n) A! Z# C4 y3 ^         if y(i)>y(j)
7 o) U9 |! ^/ B5 n           s=s+1;8 r7 ]! j1 |" B: U" I5 T. Q; w  }
         else- A( _' G: Z  m
           s=s+0;
% N2 [0 ~5 v. h; ^) [         end;
  D9 _8 s/ x0 |) V) I+ H6 Z4 P   end;
' }) a- m  `1 F( }: P- K8 ]   Sk(i)=s;( {# f! \3 T/ v5 T6 }5 @
   E=i*(i-1)/4; % Sk(i)的均值1 r( X: t9 G; e" a" T7 B% A
  Var=i*(i-1)*(2*i+5)/72; % Sk(i)的方差2 e$ @: J- v+ [' o8 ]7 `
  UFk(i)=(Sk(i)-E)/sqrt(Var);
$ E* |6 u/ v6 Z" i. I  k( Nend;) I' M7 l1 |5 e% H% f+ ?
% ------------------------------正序列计算end
" M9 @6 R  Q- _: S2 [/ A9 w% 逆序列计算---------------------------------
: j# P: t  u" c0 f; s, n0 n% 构造逆序列y2,长度=y,初始值=0  ^3 x+ {% f0 M+ T/ ~. J
y2=zeros(size(y));
2 ?5 D- T" F. a. D1 Z% 定义逆序累计量序列Sk2,长度=y,初始值=0, b. Q, v) L; b" J: d
Sk2=zeros(size(y));( }! P3 \6 A9 y9 e/ l  u
% 定义逆序统计量UBk,长度=y,初始值=02 E! `! d7 b, `
UBk=zeros(size(y));
: _! \0 W4 ?& T% F% s归0
* g3 K6 t0 O" p+ X0 @  A% ]0 G1 Ps=0;. K% O5 F: w  @: h  k4 S, @+ O& I/ ?
% 按时间序列逆转样本y
6 g9 v, k  |) r) p% m$ u% 也可以使用y2=flipud(y);或者y2=flipdim(y,1);
4 T) l6 v, I2 L% w& xfor i=1:n
5 Z7 k8 U4 y4 W1 H. ~$ g    y2(i)=y(n-i+1);; d# [6 B- s& O+ h
end;
$ }7 k8 o$ Z3 S% i从2开始,因为根据统计量UBk公式,i=1时,Sk2(1)、E(1)、Var(1)均为0" l5 s7 C6 H# F4 i
% 此时UBk无意义,因此公式中,令UBk(1)=0% t/ y7 L6 w+ `; d" B, ]
for i=2:n
2 S3 O9 \8 w: q6 B# ]   for j=1:i
4 ]" ?4 |6 s! z8 L         if y2(i)>y2(j)2 T! E" M3 Y( U  I! L: |  x
           s=s+1;
1 J8 |) q, M3 C! i         else& T0 h) b  T- L4 I: ~
           s=s+0;  B3 q. X0 l9 J- X& {9 v4 i
         end;3 }+ @% e4 f: Y
   end;2 G; t  |& G- H2 r5 `# j7 H1 K; o
   Sk2(i)=s;
3 {- ^1 [- Y! |5 V   E=i*(i-1)/4; % Sk2(i)的均值5 M6 q- L: J$ w
  Var=i*(i-1)*(2*i+5)/72; % Sk2(i)的方差5 R( l5 w. O( v/ ]0 l! |: l/ n
% 由于对逆序序列的累计量Sk2的构建中,依然用的是累加法,即后者大于前者时s加1,5 Y: W7 Y' }. y/ ~: j0 t. C
% 则s的大小表征了一种上升的趋势的大小,而序列逆序以后,应当表现出与原序列相反
5 ~' o& t' ?2 l! ~% 的趋势表现,因此,用累加法统计Sk2序列,统计量公式(S(i)-E(i))/sqrt(Var(i))
* u# h8 U, t& {1 {7 V1 ?% 也不应改变,但统计量UBk应取相反数以表征正确的逆序序列的趋势
0 Q5 h( k# P8 ^" f8 N) |% r  y2 L  UBk(i)=0-(Sk2(i)-E)/sqrt(Var);
: Y, B3 Z" ^7 w& T$ [. R# Fend;4 G) h( b0 Y. p9 c; F1 t# {
% ------------------------------逆序列计算end) h6 W' C" E" i  }& f7 s- N
% 此时上一步的到UBk表现的是逆序列在逆序时间上的趋势统计量
! y% h, e6 f+ F5 N- h' L; O3 A% 与UFk做图寻找突变点时,2条曲线应具有同样的时间轴,因此
+ I+ H; X4 Q$ W' n- o% 再按时间序列逆转结果统计量UBk,得到时间正序的UBk2,做图用  L, L- [% P5 G+ O) j9 p, C8 U
UBk2=zeros(size(y));
+ S/ u# C7 c/ L% f8 M" L% 也可以使用UBk2=flipud(UBk);或者UBk2=flipdim(UBk,1);
2 m( \+ f% y7 a: L) f3 [4 ^) q# Dfor i=1:n
, p! r/ ?9 o1 Q% ~: F! F* j3 [   UBk2(i)=UBk(n-i+1);/ s' t( B8 q4 j0 o+ p& I6 G) I2 E
end;
5 Q$ H/ X( [. c  _4 j( X% 做突变检测图时,使用UFk和UBk2
5 s9 c/ C# G+ i0 p1 C- o3 ]" K9 B* D% 写入目标xls文件:f:\test2.xls8 q$ }  u4 L- \3 ^5 p) M
% 目标表单:Sheet1
7 H7 i+ S- ^2 g. Y0 U% 目标区域:UFk从A1开始,UBk2从B1开始' e* L1 W: U: P# A
xlswrite('f:\test2.xls',UFk,'Sheet1','A1');* x8 _! ~  X( |- Z& E# b* p
xlswrite('f:\test2.xls',UBk2,'Sheet1','B1');
+ A) v1 \+ q$ \4 R% M- hfigure(3)%画图5 N+ B! o8 C' h* j
plot(x,UFk,'r-','linewidth',1.5);
3 P9 T+ Q4 d# N, T+ x$ {hold on
) j* N9 X- {7 {# z) i+ _plot(x,UBk2,'b-.','linewidth',1.5);0 b" I; f+ c. H+ q4 S& H
plot(x,1.96*ones(N,1),':','linewidth',1);
3 f+ {  f; O- zaxis([min(x),max(x),-5,5]);8 n( N# p6 o/ I+ t0 s0 T" r. C
legend('UF统计量','UB统计量','0.05显著水平');
, i) W4 E* e; exlabel('t (year)','FontName','TimesNewRoman','FontSize',12);  k! o. Z, Z2 Z
ylabel('统计量','FontName','TimesNewRoman','Fontsize',12);
! v4 q7 S& [# @' R7 t0 i2 P1 n$ k- Q%grid on
/ ^3 i+ g. E4 P# @1 X6 Dhold on6 u& W" d  d: D2 v3 t" B
plot(x,0*ones(N,1),'-.','linewidth',1);5 E2 e- Q- K+ G( G% A% R% I
plot(x,1.96*ones(N,1),':','linewidth',1);  e" I. m( M. ~8 z' y1 h' j$ N8 T
plot(x,-1.96*ones(N,1),':','linewidth',1);- D; C, ?" Y( c. `

* o& }+ \4 @+ Z  v0 s$ V% ]2 [9 q
- X! K, i/ b% U* O
8 Y; U, h9 U1 }

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-10 09:27 , Processed in 0.062500 second(s), 23 queries , Gzip On.

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

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

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