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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

2 a! D4 F4 [4 r2 b0 U4 O6 d% L%最近写论文需要用到MK检验法,网上收集到大量的matlab代码,但是没有一个代码能够/ C% D& i7 Y# n- `, s' |
%完全正确运行或者分析信息不全,结合多位网友编写的MK检验法,经过我的改编,顺利得到
0 E2 G! _% K* L. a6 r$ {. i' E+ Q%正确的运行结果,谢谢各位网友,希望对有需要的盆友有帮助. m8 ~) [* i3 M4 T' k
% Mann-Kendall突变检测
3 {, s: r: _  @% `+ O1 Y9 E3 h% 数据序列y
# \" Q2 t3 f8 X% 结果序列UFk,UBk2
7 p$ t1 G) Z' D/ [# F%--------------------------------------------0 R1 w" t. A- D% o- E
%读取excel中的数据,赋给矩阵y
' z4 f7 o  {6 \, t( v6 Q- R%获取y的样本数7 a8 A+ v3 O/ e) a/ T$ S7 S) D6 ~; Q+ `
%A为时间和径流数据列
3 G- {$ E% Q- q1 V8 G( P( kA=xlswrite('数据.xls')
+ p4 W5 z% l( n- \$ g* X# P! y( I" Gx=A(:,1);%时间序列
0 E4 ?7 x$ b' r9 A  vy=A(:,2);%径流数据列4 ~/ {3 R" s' s  a( z. ^8 t
N=length(y);/ r$ y5 |" J+ L: S& J1 N, ~/ g
n=length(y);
/ d( D6 [; v( t4 r5 a% 正序列计算---------------------------------
+ w, f: r1 R& p! {% 定义累计量序列Sk,长度=y,初始值=0$ Y" f( U" Y# K7 k9 A
Sk=zeros(size(y));
  c% U8 t7 S6 W) Y: p% 定义统计量UFk,长度=y,初始值=06 Q1 b( T- y+ Z1 i' C
UFk=zeros(size(y));2 B+ P3 c& y/ t5 C2 f7 e
% 定义Sk序列元素s
# f+ l2 G* v2 O- S  U& Us = 0;) r7 ~  e) X/ r  M+ K8 q
% i从2开始,因为根据统计量UFk公式,i=1时,Sk(1)、E(1)、Var(1)均为0+ U. P+ S% f+ c1 S* v1 c: m/ y3 \
% 此时UFk无意义,因此公式中,令UFk(1)=0
: x  `5 M0 ?( Mfor i=2:n
) D& y0 E" X  E4 k   for j=1:i" H- G9 G- N% x
         if y(i)>y(j)
) Z4 @6 a6 F$ [* Z: E, ?           s=s+1;
1 R/ z4 M. l3 X         else
2 y1 D# S3 z) z8 ^! ^* d           s=s+0;7 D/ K7 q5 l: c
         end;6 y6 e5 l* }5 _6 K5 A, ?
   end;
1 k+ o, _2 r9 l  T   Sk(i)=s;# d0 A* t$ C& d9 n* W
   E=i*(i-1)/4; % Sk(i)的均值6 T( S* _9 ]2 c
  Var=i*(i-1)*(2*i+5)/72; % Sk(i)的方差! ^4 f% z/ g1 |3 J' K* A
  UFk(i)=(Sk(i)-E)/sqrt(Var);
1 ^& {7 {2 {! I2 l5 A3 i6 v2 {; J) B5 pend;4 f" t. n$ {( X% K8 x
% ------------------------------正序列计算end
% e9 H4 F( c3 \& A4 ~# r% 逆序列计算---------------------------------0 u. D$ z8 W5 |# e# b/ ]
% 构造逆序列y2,长度=y,初始值=0) \3 y0 J: K/ D( h" d& X/ S: f
y2=zeros(size(y));
4 |0 I! C. k( @( p% 定义逆序累计量序列Sk2,长度=y,初始值=0
% Y9 a7 K( S* c) G+ o) GSk2=zeros(size(y));- P$ u( \# p& W! M! @) x7 S% f
% 定义逆序统计量UBk,长度=y,初始值=0
  O" G4 _& n1 `; n1 @) Q4 Z+ O; aUBk=zeros(size(y));' i: t; M1 [. G  D
% s归0
! Z  ?& I5 m* j- e; N3 ]; E! ts=0;: X, T' _0 @( Q8 }8 c, s
% 按时间序列逆转样本y- `9 v1 t3 \' Q
% 也可以使用y2=flipud(y);或者y2=flipdim(y,1);2 R& T/ B2 w; @) ]( S5 m% m
for i=1:n
& H  V, c! j& c: k1 w6 b    y2(i)=y(n-i+1);
/ N+ E* z! Z" F% v" L$ k4 rend;
# u  T8 b6 y$ I4 e4 W/ L; f% i从2开始,因为根据统计量UBk公式,i=1时,Sk2(1)、E(1)、Var(1)均为0
( }9 I5 r5 [$ E0 J+ z& |8 L; _# }% 此时UBk无意义,因此公式中,令UBk(1)=0
5 t* b* b0 {! f" cfor i=2:n
6 m+ n& c) _5 N% i6 v% B9 f   for j=1:i0 I3 V! V$ K/ A% @
         if y2(i)>y2(j)
2 a; u  T! r/ ?, r" R/ m           s=s+1;  ^/ r" J3 d9 l+ p
         else! x& z8 h4 E* f0 `& a
           s=s+0;/ e- ^- i1 v5 Z) c' R9 J/ W  v3 C: N. r: J
         end;
# s& w; B& `9 k; i0 T: k   end;
2 V; M8 S2 U# H& X   Sk2(i)=s;
% K  P- g0 N6 ~: {+ m- a   E=i*(i-1)/4; % Sk2(i)的均值4 s& Z' I5 R' J: W& U% G
  Var=i*(i-1)*(2*i+5)/72; % Sk2(i)的方差
( k% G) k* \7 A1 v4 Z5 V% 由于对逆序序列的累计量Sk2的构建中,依然用的是累加法,即后者大于前者时s加1,
% B9 _6 {5 T; S. `( F# v& V% 则s的大小表征了一种上升的趋势的大小,而序列逆序以后,应当表现出与原序列相反, a, P8 {4 @) z; y) y/ x% f9 Y
% 的趋势表现,因此,用累加法统计Sk2序列,统计量公式(S(i)-E(i))/sqrt(Var(i)): r& t: o5 ^$ U$ s
% 也不应改变,但统计量UBk应取相反数以表征正确的逆序序列的趋势. w4 q# h+ y* }( C2 i' r
  UBk(i)=0-(Sk2(i)-E)/sqrt(Var);
* R$ m% a4 G: j- Z1 A# _  U, {end;- u! t6 @+ Z, p, F  \6 [$ `
% ------------------------------逆序列计算end
" V! Q+ |' a9 `  g. y% 此时上一步的到UBk表现的是逆序列在逆序时间上的趋势统计量
9 ]0 ]& \4 B3 l4 p! t/ j; ~% 与UFk做图寻找突变点时,2条曲线应具有同样的时间轴,因此2 O2 y0 o, \1 Z4 i$ O% ~
% 再按时间序列逆转结果统计量UBk,得到时间正序的UBk2,做图用
: Y; r" a' W* `4 ^* s( yUBk2=zeros(size(y));* F; M9 A. R6 R4 T0 E
% 也可以使用UBk2=flipud(UBk);或者UBk2=flipdim(UBk,1);: v- i* j) V- p7 M# |" w
for i=1:n
  ^  R( z" J0 s# b   UBk2(i)=UBk(n-i+1);
: ~* |/ A# t2 b1 G( F2 [end;. T- t* S! P  v2 `$ ]
% 做突变检测图时,使用UFk和UBk26 s1 u& G! Z7 O6 V5 E
% 写入目标xls文件:f:\test2.xls. L2 d! W, h7 X" n6 S1 i
% 目标表单:Sheet1; V5 G: A. J7 i. }
% 目标区域:UFk从A1开始,UBk2从B1开始
0 J( N" O2 y; K- Z! V, ]. O& w9 C$ Jxlswrite('f:\test2.xls',UFk,'Sheet1','A1');6 l' K$ _1 t0 ]( [
xlswrite('f:\test2.xls',UBk2,'Sheet1','B1');
, e: ?& z+ W( q4 X# ^% Z) \figure(3)%画图
& @: G& w7 _; D$ e5 r/ T4 @plot(x,UFk,'r-','linewidth',1.5);
  ~3 S4 x) c. thold on
7 b9 a; a6 [8 _4 V5 ^7 i. K2 w+ z4 \plot(x,UBk2,'b-.','linewidth',1.5);
$ b3 N: o  B; V- i+ V3 s0 Kplot(x,1.96*ones(N,1),':','linewidth',1);
3 V! m, y8 ^4 O9 P5 o/ Caxis([min(x),max(x),-5,5]);
" W! e; U: E( U* {' T# Dlegend('UF统计量','UB统计量','0.05显著水平');7 r$ b' h) m' T& ]" i
xlabel('t (year)','FontName','TimesNewRoman','FontSize',12);# _7 f! K% o4 E
ylabel('统计量','FontName','TimesNewRoman','Fontsize',12);
1 e0 P  [& P' u% N%grid on3 X/ I4 ]2 Y7 T2 g/ B" _
hold on
3 i. {$ F; Y- E: D  Z5 Gplot(x,0*ones(N,1),'-.','linewidth',1);; q0 ?0 O; v) \" N5 f
plot(x,1.96*ones(N,1),':','linewidth',1);* K4 y  ]; f9 P8 C8 j7 a
plot(x,-1.96*ones(N,1),':','linewidth',1);  C. Y- K  M* v8 [
$ P, W2 `" [1 u/ W2 m# v; S/ h

6 c6 n0 ]9 O) j/ d$ O5 e! a* [2 U* `* w6 Z6 g

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 01:45 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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