【趋势分析方法一】MATLAB实现Mann-Kendall趋势/突变检验
非参数Mann-Kendall检验
在时间序列趋势分析中,Mann-Kendall检验是世界气象组织推荐并已被广泛使用的非参数检验方法,最初由Mann和Kendall提出,现已被很多学者用来分析降雨、气温、径流和水质等要素时间序列的趋势变化。Mann-Kendall检验不需要样本遵从一定的分布,也不受少数异常值的干扰,适用于水文、气象等非正态分布的数据,计算简便。
1 单变量M-K方法
1.1 Mann-Kendall趋势检验
1.2 Mann-Kendall突变检验
1.3 MATLAB实现代码
MATLAB调用函数代码如下:
[~ ,~ ,UFk ,UBk ]= MKTest( X ,Length );
MATLAB实现MK趋势/突变分析的函数如下:
function [Zs ,beta ,UFk ,UBk2 ]= MKTest(Data,n)
% MKTest函数用于趋势和突变检验
% 输入参数
% Data 序列数据
% n 序列长度
% 输出参数
% Zs 统计量
% beta 斜率
% UFk 统计量UFk
% UBk2 逆序统计量%% 趋势分析线性:Mann-Kendall检验
Sgn=zeros(n-1,n-1); %初始化分配内存
for i=1:n-1for j=i+1:nif((Data(j)-Data(i))>0)Sgn(i,j)=1;elseif((Data(j)-Data(i))==0)Sgn(i,j)=0;elseif((Data(j)-Data(i))<0)Sgn(i,j)=-1;endendendend
end
Smk=sum(sum(Sgn));VarS=n*(n-1)*(2*n+5)/18;if n>10if Smk>0Zs=(Smk-1)/sqrt(VarS);elseif Smk==0Zs=0;elseif Smk<0Zs=(Smk+1)/sqrt(VarS);endendend
end%% beta 斜率 描述单调趋势
t=1;
for i=2:nfor j=1:(i-1)temp(t)=( Data(i)-Data(j) )/( i-j );t=t+1;end
end
beta=median( temp );%% 突变检验
Sk=zeros(n,1); % 定义累计量序列Sk
UFk=zeros(n,1); % 定义统计量UFk
s = 0;
% 正序列计算start---------------------------------
for i=2:nfor j=1:iif Data(i)>Data(j)s=s+1;elses=s+0;endendSk(i)=s;E=i*(i-1)/4; % Sk(i)的均值Var=i*(i-1)*(2*i+5)/72; % Sk(i)的方差UFk(i)=(Sk(i)-E)/sqrt(Var);
end
% 正序列计算end---------------------------------% 逆序列计算start---------------------------------
Sk2=zeros(n); % 定义逆序累计量序列Sk2
UBk=zeros(n,1);
s=0;
Data2=flipud(Data); % 按时间序列逆转样本y
for i=2:nfor j=1:iif Data2(i)>Data2(j)s=s+1;elses=s+0;endendSk2(i)=s;E=i*(i-1)/4; Var=i*(i-1)*(2*i+5)/72; UBk(i,1)=0-(Sk2(i)-E)/sqrt(Var);
end
% 逆序列计算end------------------------------
UBk2=flipud(UBk);
UFk=UFk';
UBk2=UBk2';
%{figure(3)%画图
plot(1:n,UFk,'r-','linewidth',1.5);
hold on
plot(1:n,UBk2,'b-.','linewidth',1.5);
plot(1:n,1.96*ones(n,1),':','linewidth',1);
% axis([1,n,-5,8]);
legend('UF统计量','UB统计量','0.05显著水平');
xlabel('t (year)','FontName','TimesNewRoman','FontSize',12);
ylabel('统计量','FontName','TimesNewRoman','Fontsize',12);
%grid on
hold on
plot(1:n,0*ones(n,1),'-.','linewidth',1);
plot(1:n,1.96*ones(n,1),':','linewidth',1);
plot(1:n,-1.96*ones(n,1),':','linewidth',1);
%}
end
根据计算结果绘图代码如下(仅举一子图为例):
subplot(4,1,4);
plot(1:Length_year,UFk_year{1,1}(4,:),'b-','linewidth',1.5);
hold on
plot(1:Length_year,UBk_year{1,1}(4,:),'b:','linewidth',1.5);
axis([1 Length_year -4 4]);
xlabel('Year','FontName','TimesNewRoman','FontSize',10);
ylabel( 'SRI_1_2' ,'FontName','TimesNewRoman','FontSize',10);
plot(1:Length_year,1.96*ones(Length_year,1),'-b','linewidth',0.1);
plot(1:Length_year,-1.96*ones(Length_year,1),'-b','linewidth',0.1);
set(gca, 'XTick', [2 :5 : 57],'XTickLabel',{'1955','1960','1965','1970','1975','1980','1985','1990','1995','2000','2005','2010'}) ;
图形如下所示:
2 多变量M-K方法
2.1 原理
2.2 MATLAB实现代码
3 参考
3.1 论文参考
1.参考文献:J1998-A modified Mann-Kendall trend test for autocorrelated data(论文下载地址)
2.参考文献:J2002-The influence of autocorrelation on the ability to detect trend in hydrological series(论文下载地址)
3.参考文献:J2013-The modified Mann-Kendall test: on the performance of three variance correction approaches(论文下载地址)
3.2 其它语言实现MK分析
1.Python
Mann-Kendall趋势分析
【趋势分析方法一】MATLAB实现Mann-Kendall趋势/突变检验相关推荐
- 【突变检验方法一】MATLAB实现Pettitt突变检验
MATLAB实现Pettitt突变检验 1 突变检验 2 Pettitt突变检验 2.1 原理 2.2 MATLAB相关代码 2.3 案例 参考 1 突变检验 突变分为如下主要的几种:均值突变(最常见 ...
- 在模仿中精进数据分析与可视化01——颗粒物浓度时空变化趋势(Mann–Kendall Test)
本文是在模仿中精进数据分析与可视化系列的第一期--颗粒物浓度时空变化趋势(Mann–Kendall Test),主要目的是参考其他作品模仿学习进而提高数据分析与可视化的能力,如果有问题和建议,欢迎在评 ...
- 导出oracle sequences,CSS_oracle导出序列方法分析,方法一:SELECT ' CREATE SEQUEN - phpStudy...
oracle导出序列方法分析 方法一: SELECT ' CREATE SEQUENCE '||SEQUENCE_NAME|| ' INCREMENT BY '|| INCREMENT_BY ||' ...
- JBOSS通过Apache负载均衡方法一:使用mod_jk
JBOSS通过Apache负载均衡方法一:使用mod_jk 本文第一.二节分别对Linux环境下前端使用Apache以及windows环境下前端使用IIS通过AJP协议和后端的JBOSS通信实现负 ...
- 分析:windows下cmd默认的编码是ASCII编码 ,windows的中文环境下编码是GBK 方法一:在保存输出流保存的时候做一个对文字GBK编码,在输出到文件 如下 [python] view
分析:windows下cmd默认的编码是ASCII编码 ,windows的中文环境下编码是GBK 方法一:在保存输出流保存的时候做一个对文字GBK编码,在输出到文件 如下 [python] view ...
- php excel header,【IT专家】PHP生成excel,方法一-header生成
本文由我司收集整编,推荐下载,如有疑问,请与我司联系 PHP生成excel,方法一:header生成 2018/02/09 444 public function export_order() { / ...
- P2386 放苹果 方法一
http://noi.openjudge.cn/ch0203/666/ /* 2.3基本算法之递归变递推_666放苹果 方法一 http://noi.openjudge.cn/ch0203/666/1 ...
- NOIP2016 复赛普及组第 1 题 买铅笔 方法一
/* NOIP2016 复赛普及组第 1 题 买铅笔 方法一 P1909 买铅笔 https://www.luogu.org/problem/P1909 */ #include<cstdio& ...
- python创建数据库字数不限制_textarea字数限制方法一例
function checkLen(obj) { var maxChars = 30;//最多字符数 if (obj.value.length > maxChars) obj.value = o ...
最新文章
- myeclise 安装
- 五个你绝不可忽视的HTML5特性
- python执行js文件
- python加密解密库openssl_OpenSSL和Python实现RSA Key公钥加密私钥解密
- java 锁旗标_Java多线程
- android显示3d模型_Creator3D:太厉害了!3D模型原来可以这样显示在2DUI上
- 通过MOXy实现使JAXB更加清洁
- Android 下拉式抽屉折叠动画
- python类的使用_python类的使用
- 如何用业余时间成为抢手的数据人才?
- Composition-based Multi-Relational Graph Convolutional Networks 多关系图神经网络 ICLR 2020
- 哈工大-操作系统的引导
- java插件化设计开发
- 关于防火墙以及其作用
- openjudge 1.5.21 角谷猜想
- LWIP协议栈[I/drv.emac] RxCpltCallback err = -3错误解决办法
- 广东省职称计算机职称考试试题及答案,职称计算机考试基础知识章节试题及答案一...
- 打计算机游戏用英语怎么说,打游戏用英语怎么说
- the mid-autumn festival
- Unity3d下载大型文件并显示进度