基于Matlab的栅格数据一元线性回归及显著性检验(slope趋势分析)

有些童鞋在处理完数据以后会发现有些地区显著性不明显,不通过显著性分析又不能直接作为结论使用,所以我把代码稍微优化了一下,变成了下面这样:
clc
clear
[a,R]=geotiffread('G:\毕业论文材料\裁剪数据\2000-2020年归一化数据按月份、季度排序\十二月\NDVI1.tif');%先导入某个图像的投影信息,为后续图像输出做准确
info=geotiffinfo('G:\毕业论文材料\裁剪数据\2000-2020年归一化数据按月份、季度排序\十二月\NDVI1.tif');
[m,n]=size(a);
years=21; %表示有多少年份需要做回归
data=zeros(m*n,years);
k=1;
for year=1:21 %起始年份
file=['G:\毕业论文材料\裁剪数据\2000-2020年归一化数据按月份、季度排序\十二月\','NDVI',int2str(year),'.tif'];%注意自己的名字形式,这里使用的名字是年prec2000.tif,根据这个可修改
bz=importdata(file);
bz=reshape(bz,m*n,1);
data(:,k)=bz;
k=k+1;
end
xielv=zeros(m,n);
p=zeros(m,n);
for i=1:length(data)
bz=data(i,:);
if max(bz)>0 %注意这是进行判断有效值范围,如果有效范围是-1到1,则改成max(bz)>-1即可
bz=bz';
X=[ones(size(bz)) bz];
X(:,2)=[1:years]';
[b,bint,r,rint,stats] = regress(bz,X);
pz=stats(3);
p(i)=pz;
xielv(i)=b(2);
end
end
trend=reshape(xielv,m*n,1);
p=reshape(p,m*n,1);
for f=1:size(trend,1)
if trend(f)>0
if p(f)<=0.05
trend(f)=1;
elseif p(f)>0.05
trend(f)=2;
end
elseif trend(f)<0
if p(f)<=0.05
trend(f)=3;
elseif p(f)>0.05
trend(f)=4;
end
else trend(f)=0;
trend(f)=0;
end
end
trend=reshape(trend,m,n);
geotiffwrite('G:\毕业论文材料\裁剪数据\2000-2020年重分类预处理数据按月份、季度排序\NDVI\12月\12月NDVItread.tif',trend,R,'GeoKeyDirectoryTag',info.GeoTIFFTags.GeoKeyDirectoryTag)
增加了一个小循环,使得输出结果变成5种值,分别是0、1、2、3、4,他们分别代表基本稳定、显著增长、不显著增长、显著减少和不显著减少,后面的结果需要在arcgis中进行重分类获得,希望能够帮到各位的论文。