在进行栅格数据长时间序列分析的时候,常常涉及到转折点部分,前后的趋势发生了很大的变化,如何进行提取呢?本文采用分段线性回归模型来进行提取。基本思路是对前后两个序列进行拟合,以残差平方和最小的点作为潜在的转折点,同时评估转折点前后的趋势是否通过显著性检验,如果两边都通过检验,则该潜在转折点为实际转折点,否则不是实际转折点。具体代码如下:
@author yinlichang3064@163.com
[a,R]=geotiffread('F:\校级课题项目\data\屏障带\2002降水.tif');%先导入投影信息
info=geotiffinfo('F:\校级课题项目\data\屏障带\2002降水.tif');
[m,n]=size(a);
begin_year=2000;
end_year=2018;
cd=end_year-begin_year+1;
presum=zeros(m*n,cd);
kk=1;
for year=begin_year:end_year
filename=strcat('F:\校级课题项目\data\屏障带\',int2str(year),'降水.tif');
data=importdata(filename);
data=reshape(data,m*n,1);
presum(:,kk)=data;
kk=kk+1;
end
xlcd=5;% 假设最短的趋势年份为5年
BPsum=zeros(m,n);
slope1=zeros(m,n);
slope2=zeros(m,n);
for i=1:m*n
pre=presum(i,:);
if min(pre)>0
res_sum=[];
p=[];
slopesum=[];
for k=xlcd:cd-xlcd
pre1=pre(1:k)';
pre2=pre(k:cd)';
%
x1=[ones(size(pre1,1),1),[1:k]'];
[b1,~,r1,~,stats1] = regress(pre1,x1);
x2=[ones(size(pre2,1),1),[k:cd]'];
[b2,~,r2,~,stats2] = regress(pre2,x2);
res=sumsqr(r1)+sumsqr(r2);
res_sum=[res_sum;res];
pz=[stats1(3),stats2(3)];
p=[p;pz];
slopesum=[slopesum;[b1(2),b2(2)]];
end
BP=find(res_sum==min(res_sum));% 找到拟合残差平方和最小的点
% 进一步检验前后是否通过了显著性检验
pz=p(BP,:);
slope=slopesum(BP,:);
if pz(1)<0.1 && pz(2)<0.1 %以前后显著性p0.1来判断
BPsum(i)=BP+begin_year+xlcd-2;
slope1(i)=slope(1);
slope2(i)=slope(2);
end
end
end
result_mulu='D:\';
filename1=[result_mulu,'转折点年份.tif'];
geotiffwrite(filename1,BPsum,R,'GeoKeyDirectoryTag',info.GeoTIFFTags.GeoKeyDirectoryTag);
filename2=[result_mulu,'第一阶段的趋势值.tif'];
geotiffwrite(filename2,slope1,R,'GeoKeyDirectoryTag',info.GeoTIFFTags.GeoKeyDirectoryTag);
filename3=[result_mulu,'第二阶段的趋势值.tif'];
geotiffwrite(filename3,slope2,R,'GeoKeyDirectoryTag',info.GeoTIFFTags.GeoKeyDirectoryTag);
在matlab中运行上述代码即可得到最终的结果,更多需求,请查看个人介绍,后期有许多内容分享在公众号,欢迎大家捧场关注一波
网友评论