原始M-K检验可参加另一篇博客-MATLAB实现Mann-Kendall趋势/突变检验。本文主要介绍修正M-K趋势检验。
原始M-K检验中的零假设是数据独立且随机排序,然而,数据中正自相关的存在增加了在实际不存在趋势时检测趋势的概率,反之亦然。
函数代码:
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);
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);
代码如下:
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月)
原数据示意图如下:
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
界面如下:
参考: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)提出的估计单调趋势幅度的方法。
1.Python实现MMK
2.R语言实现MMK