多年栅格数据(Mann-Kendall)趋势检验法在matlab上的实现

Mann-Kendall是一种非参数统计检验方法,最初由Mann在1945年提出,后由Kendall和Sneyers进一步完善,其优点是不需要测量值服从正态分布,也不要求趋势是线性的,并且不受缺失值和异常值的影响,在长时间序列数据的趋势显著检验中得到了十分广泛的应用。
定义标准化检验统计量 Z:当Z 的绝对值大于1.65、1.96和2.58时,表示趋势分别通过了信度为90%、95%和99%的显著性检验。
具体代码如下:

clear
[a,R]=geotiffread('D:\GIS\yearmax\1982.tif'); %先导入投影信息
info=geotiffinfo('D:\GIS\yearmax\1982.tif');%先导入投影信息
[m,n]=size(a);
cd=34;       %34年,时间跨度  
datasum=zeros(m*n,cd)+NaN; 
p=1;
for year=1982:2015      %起始年份
     filename=['D:\qixiang\年全国8kmPET\china',int2str(year),'pet.tif'];
    data=importdata(filename);
    data=reshape(data,m*n,1);
    datasum(:,p)=data;         %
    p=p+1;
end
sresult=zeros(m,n)+NaN;

for i=1:size(datasum,1)        %
    data=datasum(i,:);
    if min(data)>0       % 有效格点判定,我这里有效值在0以上
        sgnsum=[];  
        for k=2:cd
            for j=1:(k-1)
                sgn=data(k)-data(j);
                if sgn>0
                    sgn=1;
                else
                    if sgn<0
                        sgn=-1;
                    else
                        sgn=0;
                    end
                end
                sgnsum=[sgnsum;sgn];
            end
        end  
        add=sum(sgnsum);
        sresult(i)=add; 
    end
end
vars=cd*(cd-1)*(2*cd+5)/18;
zc=zeros(m,n)+NaN;
sy=find(sresult==0);
zc(sy)=0;
sy=find(sresult>0);
zc(sy)=(sresult(sy)-1)./sqrt(vars);
sy=find(sresult<0);
zc(sy)=(sresult(sy)+1)./sqrt(vars);
geotiffwrite('C:\MATLAB\MK检验结果.tif',zc,R,'GeoKeyDirectoryTag',info.GeoTIFFTags.GeoKeyDirectoryTag); %注意修改路径
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容