|
本人长期以来使用的几个函数。
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
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-23 00:21
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社