经验分享 | SEN+Mk趋势分析(matlab代码分享)

代码分享

方法介绍:Sen 斜率估计用于计算趋势值,通常与MK非参数检验结合使用。即首先计算Sen趋势值,然后使用MK方法判断趋势显著性

示例:1984-2018NDVI年最大值趋势分析

注意:在对NDVI进行趋势分析时,绝对值0.1以下的NDVI值需要去除

代码1:MKTrend(代码2会用)

function MKResult = MKTrend(X,Alpha)
%tic
​
% 时间序列数据的Mann-Kendall趋势分析
%
% 原假设:H0  Beta == 0
% 当 |Z| <= pNorm ,表明在当前显著性水平Alpha下接受原假设(无显著变化)
% 当 Z > pNorm , 表明在当前显著性水平Alpha下认为有上升趋势:此时Beta > 0
% 当 Z < -pNorm ,表明在当前显著性水平Alpha下认为有下降趋势:此时Beta < 0
%
% MKResult = [Z,pNorm];    (统计量S的标准化)Z统计量,上侧分位数
%
% Input
% X                             - 时间序列数据,向量
% Alpha                         - 显著性水平
%
% Output
% Beta                          - 衡量趋势大小的倾斜度或斜率(整体变化趋势的速率)
% MKResult                      - MK趋势检验的Z统计量及Z分位数,[Z,pNorm]
% S_stdS                        - 统计量S及标准差,[S,sqrt(varS)];
% ConInterval                   - 置信区间
%  -----------------------------------------------------
​
if (nargin < 2) || (isempty(Alpha)), Alpha = 0.05; end
​
​
N = length(X);
if N < 8, error('Error:MannKendallTrend: 要求数据样本数目不小于8!'); end
% if N < 41, error('Error:MannKendallTrend: 要求数据样本数目不小于40!'); end
​
S = 0;                                           % 时间序列X的MK趋势检验的统计量S
for ii = 1:(N - 1)
for jj = ii:N
S = S + sign(X(jj) - X(ii));
end
end
​
% 计算方差
varS = ( N * ( N - 1 ) * ( 2 * N + 5 ) ) / 18;
​
% 计算 Z 统计量,该统计量服从标准正态分布
if S == 0
Z = 0;
elseif S > 0
Z = (S - 1) / sqrt(varS);
else
Z = (S + 1) / sqrt(varS);
end
​
% 原假设:H0  Beta == 0
% 当 |Z| <= pNorm ,表明在当前显著性水平Alpha下接受原假设
% 当 Z > pNorm , 表明在当前显著性水平Alpha下认为有上升趋势
% 当 Z < -pNorm ,表明在当前显著性水平Alpha下认为有下降趋势
pNorm = norminv(1 - Alpha / 2);
MKResult = [Z,pNorm];                            % MK趋势检验结果
​
%toc
% end of function MannKendallTrend
%%
end
 

代码2:调用代码1。MKTrendAnalysis(需要修改的地方已在代码中注释)

clc; clear;imgdir1 = 'D:\homework2\data\data\NDVI year\'; %%修改为所要处理的数据路径addpath(genpath(imgdir1));%% MK趋势分析filenames = dir([imgdir1 '*.tif']);for i = 1:numel(filenames)    data(:,:,i) = single(imread(filenames(i).name));  %% 原始数据 end%%[row,col, N]=size(data);timeslice = N;beg = 1984; %%数据起始年份last = 2018; %%数据结束年份NA = data(1,1,1);%MK_para=zeros(row,col,2);K=zeros(row,col)*NaN;Z=zeros(row,col)*NaN;X=zeros(1,timeslice)*NaN;t=beg:1:last;Alpha=0.05; %%置信区间for i=1:row    i    for j=1:col        if ismember(data(1,1,1),data(i,j,:))  % 当某位置的时间序列里有无效的数据时, assign NaN to Z and K            Z(i,j)=-9999;            K(i,j)=-9999;        else                MKResult=MKTrend(data(i,j,:),Alpha);             X=squeeze(data(i,j,:));             p=polyfit(t',X,1);             K(i,j)=p(1);   %% 变化量                          Z(i,j)=MKResult(1);  %% 显著性                  end            endend%%[~, R0] = readgeoraster('D:\homework2\data\data\NDVI year\ndvi_1984.tif'); %%输入一幅标准的栅格数据来获取属性信息info = geotiffinfo('D:\homework2\data\data\NDVI year\ndvi_1984.tif');  %%输入一幅标准的栅格数据来获取属性信息geoTags = info.GeoTIFFTags.GeoKeyDirectoryTag;outPath = 'D:\homework2\data\data\NDVI year\';  %%输出路径outName1 = [outPath, 'Z.tif'];  %%输出数据名称geotiffwrite(outName1,Z,R0,'GeoKeyDirectoryTag', info.GeoTIFFTags.GeoKeyDirectoryTag); %%若输出Slope值,将本行中的Z改为K即可

ARCGIS制图

首先将更改栅格图像Nodata值

在arcgis目录处找到需要处理的栅格数据 - 选中数据 - 单击右键 - 打开属性 - 点击编辑 - 将Nodata值改为-9999 - 计算 - 确定 - 应用

然后对Z值和Slope值分别进行重分类,重分类的结果用栅格计算器相乘,得到最终趋势变化图

其中分类标准如下:

对于Slope:-0.0005 - 0.0005为稳定区域,大于或等于0.0005为植被改善区域,小于-0.0005为植被退化区域

对于Z值:置信水平为0.05,-1.96 - 1.96之间为不显著,绝对值大于1.96为显著。

最终可以分为五类:严重退化、轻微退化、稳定不变、轻微改善、明显改善

结果图如下所示:

END

编辑 | 南波婉帆

审核 | 南波婉琳

  • 16
    点赞
  • 194
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 时序栅格SEN MK趋势分析代码是一种用于分析时间序列数据的算法。它基于SEN (Sen's slope)方法和MK (Mann-Kendall)检验,用于检测时间序列数据中的趋势SEN方法是一种非参数统计方法,用于估计时间序列数据的趋势。它计算了时间序列数据的斜率,以确定数据的线性趋势SEN MK趋势分析代码通过计算每个点的斜率,并基于这些斜率进行趋势分析MK检验是一种趋势检测方法,用于确定时间序列数据中的突变点。它通过比较每个数据点与其周围数据点的大小关系,来检测数据突变的存在与否。SEN MK趋势分析代码使用MK检验来判断时间序列数据中的突变点。 根据SEN MK趋势分析代码,首先需要输入时间序列数据。代码将根据这些数据计算每个数据点的斜率,然后将这些斜率与预设的阈值进行比较,以确定趋势的存在与否。 如果斜率超过阈值,则表示存在趋势代码将继续计算数据突变点的位置,并输出趋势的方向和突变点的位置。 最后,代码将绘制时间序列数据的趋势图和突变点图。这些图形可以帮助我们更好地理解数据的趋势和突变情况。 总之,时序栅格SEN MK趋势分析代码是一种用于分析时间序列数据的算法。它通过使用SEN方法和MK检验,来确定数据的趋势和突变点。该代码可以帮助我们更好地理解数据的变化趋势和突变情况,从而做出更准确的预测和决策。 ### 回答2: 时序栅格(Time Series Grid)是一种以栅格(Grid)形式呈现的时间序列数据分析方法。而SEN MK趋势分析则是时序栅格中的一种方法,用于探索时间序列数据的趋势变化。 SEN MK趋势分析代码主要包括以下几个步骤: 1. 数据准备:将时间序列数据按照一定时间间隔划分为多个时间段,生成相应的时间序列网格数据。 2. 计算r值:对每个时间段的时间序列数据进行线性回归分析,得到每个时间段中变量的斜率。 3. 计算s值:计算每个时间段中变量的标准差。 4. 计算E该值:根据时间段中数据的连续性,计算该时间段中所有数据的倾向盒连线。 5. 计算e值:计算每个时间段中变量值与其倾向线之间的偏差值。 6. 计算z值:计算每个时间段中变量值与其倾向线之间的偏差值的标准化值。 7. 检验显著性:使用经验方差和正态分布检验方法来确定z值的显著性水平。 8. 绘制趋势图:使用绘图工具将时间段、变量值及其倾向线绘制在同一张图中,以直观展示时间序列数据的趋势变化。 SEN MK趋势分析代码的使用可以帮助我们更好地理解时间序列数据的趋势变化,为后续的预测和决策提供依据。其中的各个步骤可以根据需要进行灵活调整和优化,以适应不同类型的时间序列数据分析任务。 ### 回答3: 时序栅格分析是一种常用的趋势分析方法,而SEN MK趋势分析代码则是针对时序栅格数据进行SENSen's slope estimator)和MK(Mann-Kendall test)趋势分析代码SEN MK趋势分析代码基本包括以下步骤: 1. 数据准备:将需要进行趋势分析的时序栅格数据进行处理,确保数据的格式和结构符合分析要求。 2. 计算Sen's slope estimator:利用SEN方法,计算出时序栅格数据在时间上的趋势坡度。SEN方法是一种基于时间序列的非参数估计方法,通过计算数据的斜率来判断数据的趋势方向。 3. 进行Mann-Kendall趋势检验:利用MK方法,对时序栅格数据的趋势进行统计检验。MK方法是一种常用的非参数检验方法,通过比较数据序列中各个值的大小关系,来判断数据是否存在趋势。 4. 进行趋势分析和结果输出:根据SENMK的计算结果,进行趋势分析,包括趋势的方向、强度和显著性等指标的提取。最后将分析结果以图表或报告的形式进行输出。 时序栅格SEN MK趋势分析代码的编写需要熟悉SENMK方法的原理,同时还需要掌握数据处理和统计分析的技巧。这类代码通常使用MATLAB、Python等编程语言进行编写,也可以基于相应的数据分析平台进行开发。 要编写高效可靠的时序栅格SEN MK趋势分析代码,需要对数据分析和数学统计方法有深入的理解,同时还需要考虑代码的可重复性、可扩展性和性能等方面的要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值