欢迎光临散文网 会员登陆 & 注册

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

2023-02-07 21:05 作者:闪电利刃  | 我要投稿

有些童鞋在处理完数据以后会发现有些地区显著性不明显,不通过显著性分析又不能直接作为结论使用,所以我把代码稍微优化了一下,变成了下面这样:


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中进行重分类获得,希望能够帮到各位的论文。

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

分享到微博请遵守国家法律