加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Mann-Kendall 突变分析MATLAB程序

(2017-10-19 12:20:57)
分类: MATLAB
看了很多书和论文,结合网上的资源,自己编写的Mann-Kendall 突变分析程序

特别要注意MK突变分析中的ESk和varSk在很多国内教材和中文论文中的公式是有问题的,包括很多网上所有到的MK代码也是没有注意到这个问题。

参考过的资料不再单独列出,特此申明!


function [UF,UB,U_Alpha] = MannKendallMutation(X,Alpha,OutIndex)
% 时间序列数据的Mann-Kendall突变分析
% Input
% X                             - 时间序列数据,向量,Time Series of Data
% Alpha                         - 显著性水平
% OutIndex                      - 画图指示,默认OutIndex=1
% Output
% UF                            - UF统计量序列,1*(N-1)
% UB                            - UB统计量序列,1*(N-1)
% U_Alpha                       - 显著性水平Alpha下的正态分布分位数
%  -----------------------------------------------------

if (nargin < 3) || (isempty(OutIndex)), OutIndex = 1; end
if (nargin < 2) || (isempty(Alpha)), Alpha = 0.05; end


N = length(X);

%%
% 在时间序列X为独立随机的假设下,UF服从标准正态分布
% 计算UF统计量
UF = zeros(1,N-1);                               % 时间序列X的UF统计量
riVec = zeros(1,N);
Sk = 0;
for ii = 2:N
    tX = X(1:ii);
    for jj = 1:(ii-1)
        if X(ii) > tX(jj)
            riVec(ii) = riVec(ii) + 1;
        end
    end
    % Sk = sum(riVec(1:ii));                       % 其实应为时间序列X的秩序列Sk(ii)
    Sk = Sk + riVec(ii);
    
    ESk = ii * (ii + 1) / 4;
    VarSk = ii * (ii - 1) * (2 * ii + 5) / 72;
    
    UF(ii-1) = (Sk - ESk) ./ sqrt(VarSk);
end

%%
% 在时间序列X为独立随机的假设下,UB服从标准正态分布
% 计算UB统计量
Y = X(N:-1:1);                                   % 取时间序列X的逆序

UB = zeros(1,N-1);                               % 时间序列X的UB统计量
riVec = zeros(1,N);
Sk = 0;
for ii = 2:N
    tY = Y(1:ii);
    for jj = 1:(ii-1)
        if Y(ii) > tY(jj)
            riVec(ii) = riVec(ii) + 1;
        end
    end
    % Sk = sum(riVec(1:ii));                       % 其实应为时间序列X的秩序列Sk(ii)
    Sk = Sk + riVec(ii);
    
    ESk = ii * (ii + 1) / 4;
    VarSk = ii * (ii - 1) * (2 * ii + 5) / 72;
    
    UB(ii-1) = -(Sk - ESk) ./ sqrt(VarSk);
end

%%
% 若UF > U_Alpha, 表明序列存在明显的趋势变化
U_Alpha = norminv(1 - Alpha / 2);


if OutIndex == 1
    YearID = 2:N;
    figure
    plot(YearID,UF,'r-');
    hold on
    plot(YearID,UB,'b-');
    legend('UF统计量','UB统计量');
    xlabel('t(year)','FontName','TimesNewRoman');
    ylabel('统计量UF和UB','FontName','TimesNewRoman');
    hold on
    plot(YearID,U_Alpha*ones(1,N-1),'-.');
    plot(YearID,-U_Alpha*ones(1,N-1),'-.');
    plot(YearID,zeros(1,N-1),'-.');
end

% end of function MannKendallMutation
%%

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有