【趋势分析方法二】MATLAB实现改进M-K趋势分析

原始M-K检验可参加另一篇博客-MATLAB实现Mann-Kendall趋势/突变检验。本文主要介绍修正M-K趋势检验。
原始M-K检验中的零假设是数据独立且随机排序,然而,数据中正自相关的存在增加了在实际不存在趋势时检测趋势的概率,反之亦然。

1 Modified Mann-Kendall检验

1.1 原理

1.2 MATLAB实现代码

函数代码:

2 案例

原始数据序列图形如下:
【趋势分析方法二】MATLAB实现改进M-K趋势分析_第1张图片
绘图代码如下:

clc
close all
clear
%% 导入数据
path1= '.\Figures\' ;
load('Data.mat');
V = Data;
N = length(V);

figure(1)
hold on;box on;
plot(1:N, V ,'b-','linewidth',1);
xlabel('Year','FontName','TimesNewRoman','FontSize',14);
ylabel( 'Y' ,'FontName','TimesNewRoman','FontSize',14);
set(gca, 'XTick', [2 :12*5 : N],'XTickLabel',{'1955','1960','1965','1970','1975','1980','1985','1990','1995','2000','2005','2010'}) ;
set(gca,'Layer','top','FontSize',14,'Fontname', 'Times New Roman');

Figure_name = '图1:时间序列X';
str= strcat(path1, Figure_name, '.jpg');
print(gcf, '-djpeg', '-r600', str);

2.1 M-K趋势检验

M-K趋势检验代码详见另一篇博客-MATLAB实现Mann-Kendall趋势/突变检验。

主函数代码如下:

%% M-K趋势检验
[ Zs ,beta ,UFk ,UBk ]= MKTest( V );

figure(2)
hold on;box on;
plot(1:N, 1.96*ones(N,1),'-','linewidth',0.2,'color',[70 130 180]/255);
plot(1:N,-1.96*ones(N,1),'-','linewidth',0.2,'color',[70 130 180]/255);
plot(1:N,UFk,'b-','linewidth',1.5);
plot(1:N,UBk,'b:','linewidth',1.5);
axis([1 N -4 4]);
xlabel('Year','FontName','TimesNewRoman','FontSize',14);
ylabel( 'UF' ,'FontName','TimesNewRoman','FontSize',14);
set(gca, 'XTick', [2 :12*5 : N],'XTickLabel',{'1955','1960','1965','1970','1975','1980','1985','1990','1995','2000','2005','2010'}) ;
set(gca,'Layer','top','FontSize',14,'Fontname', 'Times New Roman');

Figure_name = '图2:M-K趋势检验';
str= strcat(path1, Figure_name, '.jpg');
print(gcf, '-djpeg', '-r600', str);

突变检验图:
【趋势分析方法二】MATLAB实现改进M-K趋势分析_第2张图片

2.2 MMK趋势检验

代码如下:

2.3 Pettitt突变检验

Pettitt突变检验代码详见另一篇博客-MATLAB实现Pettitt突变检验/贝叶斯突变检测等。

主函数代码如下:

%% Pettitt突变检验
[Ut, kmax,changePoint , coef ] = PettittTest( V );

figure(3)
hold on;box on;
h(1) = plot(V,'k-','linewidth',1.5);   %  原数据
h(2) = plot( [changePoint,changePoint] , [V(changePoint)-V(changePoint)*15,V(changePoint)+V(changePoint)*15], 'r-','linewidth',1.5);
xlabel('Year','FontName','TimesNewRoman','FontSize',14);
ylabel( 'UF' ,'FontName','TimesNewRoman','FontSize',14);
set(gca, 'XTick', [2 :12*5 : N],'XTickLabel',{'1955','1960','1965','1970','1975','1980','1985','1990','1995','2000','2005','2010'}) ;
set(gca,'Layer','top','FontSize',14,'Fontname', 'Times New Roman');

Figure_name3 = '图3:Pettitt突变检验';
str= strcat(path1, Figure_name3, '.jpg');
print(gcf, '-djpeg', '-r600', str);

调用Pettitt函数代码如下:

function [Ut, kmax, changePoint , coef ] = PettittTest( X )
% 输入变量
% X   时间序列
% 输出变量
% changePoint     突变点
% coef    显著性水平Pt
n = length( X );
s = 0;
Ut =zeros(n-1,1);
for i=1:n-1
    for j=i+1:n
        s = s +sign( X(i) - X(j) );
    end
    Ut(i) = s;
end

kmax = max( abs(Ut) );                                % 找到最可能突变点
changePoint = find( abs(Ut) == kmax );      % 找出最大值对应的序列号
coef = 2*exp( -6*kmax^2/(n^3+n^2) );     % 检验其P值情况,统计学认为P<0.5采用统计意义

% 画图
figure(1)
hold on;box on;
h(1) = plot(Ut,'k-','linewidth',1.5);   % 整个曲线的变化趋势
h(2) = plot( [changePoint,changePoint] , [-kmax,kmax], 'r--','linewidth',1.5);
klim = kmax - kmax*0.1;
h(3) = plot([1,n],[-klim,-klim],'b-.','linewidth',1.5);
h(4) = plot([1,n],[klim,klim],'b-.','linewidth',1.5);
xlabel('Year','FontName','TimesNewRoman','FontSize',14);
ylabel( 'Ut' ,'FontName','TimesNewRoman','FontSize',14);
set(gca, 'XTick', [2 :12*5 : n],'XTickLabel',{'1955','1960','1965','1970','1975','1980','1985','1990','1995','2000','2005','2010'}) ;
set(gca,'Layer','top','FontSize',14,'Fontname', 'Times New Roman');

end

统计量示意图如下:(第520个值出发生突变,即1998年3月)
【趋势分析方法二】MATLAB实现改进M-K趋势分析_第3张图片
原数据示意图如下:
【趋势分析方法二】MATLAB实现改进M-K趋势分析_第4张图片

3 参考

1.参考文献:J1998-A modified Mann-Kendall trend test for autocorrelated data(论文下载地址)
自相关数据的修正Mann-Kendall趋势检验
2.参考文献:J2002-The influence of autocorrelation on the ability to detect trend in hydrological series(论文下载地址)
3.参考代码:Matlab社区-Mann-Kendall Modified test
界面如下:
【趋势分析方法二】MATLAB实现改进M-K趋势分析_第5张图片

3.1 各种修正M-K趋势检验

参考:MK趋势检验+Kendallstaub等级相关+稳健回归

1.原始mann-kendal检验 (原始_ 检验) :原始mann-kendal检验是非 参数检验,不考虑序列相关性或季节性影响。

2.hamed和rao修正的mk检验(hamed和rao修正的mk检验) :这个修正的mk检验由hamed和rao (1998)提出的解决序列自相关问题的方法。他们建议采用方差校正方法来改进趋势分析。用户可以通过在该函数中插入滞后数来考虑前n个显著滞后。默认情况下,它会考虑所有重要的延迟。
参考文献:J1998-A modified Mann-Kendall trend test for autocorrelated data(论文下载地址)

3.Yue和Wang修正的MK检验(Yue-Wang_ 修正的检验) :这也是Yue, S… &Wang, C.Y. (2004)提出的考虑序列自相关的方差修正方法。用户还可以为计算设置所需的有效n滞后。
参考文献:

4.使用预白化方法的修正mk检验(预白化方法的修正) : Yue和Wang (2002)建议在应用趋势检验之前使用预白化时间序列的检验。
参考文献:

5.使用无趋势预白化方法的修正mk试验(无趋势预白化试验) : Yue和Wang (2002) 也提出了在应用趋势试验之前去除趋势成分,然后对时间序列进行预白化的试验。
参考文献:

6.多变量mk检验(多变量检验):这是hirsch (1982) 提出的多参数mk检验。他用这种方法进行季节性mk检验,把每个月作为一个参数。
参考文献:

7.季节性MK检验(季节性检验) :对于季节性时间序列数据,Hirsch, R.M… Slack, J.R.和Smith, R.A. (1982) 提出了这个检验来计算季节性趋势。

8.区域mk检验(regional mk test) :基于Hirsch (1982) 提出的季节性mk检验,Helsel, D.R.和Frans, L.M.,. (2006) 建议采用区域mk检验来计算区域尺度的总体趋势。

9.相关多变量mk检验(相关多变量检验) : hipel (1994) 提出的参数相关的多变量mk检验。

10.相关季节性MK检验(相关季节性检验):当时间序列与前一个或多个月/季节显著相关时,使用Hipel (1994) 提出的方法。

11.部分mk检验(部分_检验):在实际事件中,许多因素都会影响研究的主要响应参数,从而使趋势结果产生偏差。为了克服这个问题,libiseller (2002) 提出了部分mk检验。它需要两个参数作为输入,一个是响应参数,另一个是独立参数。

12.泰尔-森斜率估计器(sen s-slope):泰尔(1950) 和森(1968)提出的估计单调趋势幅度的方法。

另:其它语言实现MMK

1.Python实现MMK
2.R语言实现MMK

你可能感兴趣的:(#,MATLAB实现各种基础方法,matlab)