sucksis的个人博客分享 http://blog.sciencenet.cn/u/sucksis

博文

EOF分析及Mann-Kendall检验相关的Matlab函数

已有 606 次阅读 2017-9-4 18:30 |系统分类:科研笔记

  本人长期以来使用的几个函数。

1) EOF(正交经验函数)分解的Matlab函数:


function [V,PC]=EOF(X)

%V eigen vector (空间函数), V必须是pXp的,p为变量个数

%PC 时间函数 Y=V'X

%X 原始变量,列对应原始变量类型,行对应样本  原始变量的值都需要标准化处理,即减去均值,除以std

%n=3904;

[V,D]=eig(X*X'); % V特征向量  D对角阵,即主成分

PC=(V'*X)';

end


2) Mann-Kendall趋势显著性检验:

function[H,p_value]=MKtest(V,alpha)

% Mann_Kendall test, V --the vector, alpha--the significance level

% 默认alpha=0.05

%与自己编的Python代码运行结果基本相同

   V=reshape(V,length(V),1);

   alpha = alpha/2; %

   n=length(V);

   S=0;

   for i=1:n-1

       S = S + sum(sign(V(i+1:n) - V(i)));

   end

   h=1;

   while ~isempty(V)

       g=find(V==V(1));

       tp=length(g);

       Sum(h)=tp*(tp-1)*(2*tp+5); %#ok<AGROW>

       V(g)= [];

       h=h+1;

   end

   VarS=((n*(n-1)*(2*n+5))-sum(Sum))/18;

   %Standard deviation

   De=sqrt(VarS);

   if S>=0;

       z= ((S-1)/De)*(S~=0);

   else

       z= ((S+1)/De);

   end

   p_value=2*(1-normcdf(abs(z),0,1)); % tail on both sides

   pz=norminv(1-alpha,0,1);

   H=abs(z)>pz;

   z,pz,p_value

return


3)Sen's Slope 常用Man-Kendall检验联用,用于计算变化趋势斜率,类似于回归斜率

function slope=SenSlope(data)

   n=length(data);

mlist=[];

for j=1:n

       for i=1:j-1

           mlen=length(mlist);

           mlist(mlen+1)=(data(j)-data(i))/(j-i);

       end

   end

   mlist=sort(mlist)

m=length(mlist);

result=mlist(floor(m/2+1));

if mod(m,2)==0

result=(mlist(m/2+1)+mlist(m/2))*1.0/2;

   end

   slope=result;

end





http://blog.sciencenet.cn/blog-758188-1074220.html

上一篇:几个气象格点资料插值的matlab函数
下一篇:做不了圣人是人之常情
收藏 分享 举报

1 陈昌春

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备14006957 )

GMT+8, 2017-11-20 02:04

Powered by ScienceNet.cn

Copyright © 2007-2017 中国科学报社

返回顶部