GEE:对NDVI的时间序列使用Sen+Mann-Kendall(MK)趋势检验


Sen+MK趋势分析

Sen 斜率估计用于计算趋势值,通常与MK非参数检验结合使用。即首先计算Sen趋势值,然后使用MK方法判断趋势显著性。
本文使用非参数 Mann-Kendall 检验检测图像中是否存在递增或递减趋势和 Sen 斜率以量化趋势的大小(如果存在)来检测图像中的单调趋势。
本文还展示了估计 Mann-Kendall 检验统计量的方差、用于检验是否存在任何趋势的 Z 统计量以及统计量的 P 值(假设为正态分布)。
需要注意的是,这里介绍的方法适用于评估离散数据(即非浮点数)中的单调趋势(即没有季节性的数据)。

算法详解博客1:https://www.jianshu.com/p/eae362946ea9
算法详解博客2:https://zhuanlan.zhihu.com/p/112703276

GEE源代码链接:https://code.earthengine.google.com/1149eef0974687085727c02e58152d6b?noload=true
参考资源:https://developers.google.com/earth-engine/tutorials/community/nonparametric-trends


结果展示

MK趋势 检验结果如下图所示:
在这里插入图片描述
斜率 结果如图所示:
在这里插入图片描述
截距 结果如下图所示:
在这里插入图片描述


Sen_slope

Sen_slope: Theil-Sen Median方法又被称为Sen 斜率估计,是一种稳健的非参数统计的趋势计算方法。该方法计算效率高,对于测量误差和离群数据不敏感,常被用于长时间序列数据的趋势分析中。

在这里插入图片描述
式中: xi和xj为时间序列数据。β大于0表示时间序列呈现上升趋势; β小于0表示时间序列呈现下降趋势。

Mann-Kendall是一种非参数统计检验方法,最初由Mann在1945年提出,后由Kendall和Sneyers进一步完善,其优点是不需要测量值服从正态分布,也不要求趋势是线性的,并且不受缺失值和异常值的影响,在长时间序列数据的趋势显著检验中得到了十分广泛的应用。其统计检验方法如下:

对于时间序列Xi,i=1, 2, …i, …j, …n。定义标准化检验统计量Z:
在这里插入图片描述
式中:xi和xj为时间序列数据,n为数据个数;当n≥8时,检验统计量S近似为正态分布,其均值和方差如下:在给定显著性水平α下,如果   ∣ Z ∣ > Z 1 − α 2 \ |Z|>Z_{1-\frac{α}{2}}  Z>Z12α则表明不存在趋势的假设被拒绝,时间序列数据存在明显的趋势变化。   Z 1 − α 2 \ Z_{1-\frac{α}{2}}  Z12α为在置信水平α下,标准正态函数分布表对应的值。当Z的绝对值大于1.65、1 .96和2.58时,表示趋势分别通过了信度为90%、95%和99%的显著性检验

Z值

z值 如图所示:
在这里插入图片描述


应用案例

在这里插入图片描述
此图来自论文(Establishing forest resilience indicators in the hilly red soil region of southern China from vegetation greenness and landscape metrics using dense Landsat time series
绿线是NDVI的时间序列曲线,可以看出NDVI是增加趋势,并且显著性大于1.96。(其他颜色的序列是其他指标,和本文关系不大)
在这里插入图片描述
d图表示NDVI比较稳定。

### 使用Matlab对多年NDVI时间序列数据执行Mann-Kendall趋势检验 #### 准备工作 为了在Matlab中进行Mann-Kendall趋势检验,首先需要准备NDVI时间序列数据。假设这些数据已经整理成一个向量形式的时间序列`ndvi_series`。 #### 实现步骤概述 可以利用Matlab中的函数来完成这一任务。虽然Matlab官方库未直接提供Mann-Kendall测试功能,但是可以通过编写自定义函数或使用社区贡献的工具箱来进行此操作。下面给出一种基于已有资源的方法: #### 自定义Mann-Kendall Test Function 如果希望不依赖额外包而实现基本的功能,则可以根据算法原理构建自己的函数。这里展示了一个简单的例子: ```matlab function [tau, pval] = mann_kendall(x) % 计算S统计量 n = length(x); S = 0; for i=1:n-1 for j=i+1:n if x(j)>x(i) S = S + 1; elseif x(j)<x(i) S = S - 1; end end end % 方差Var(S)计算 ties = unique(x); % 找到所有的不同值 g = numel(ties); VarS = (n*(n-1)*(2*n+5))/18; % 初始方差估计 tiecorrection = 0; for k=1:g tpk = sum(x==ties(k)); % 当前值得重复次数 if(tpk>1) tiecorrection = tiecorrection+(tpk*(tpk-1)*(2*tpk+5)); end end VarS = VarS-tiecorrection/18; % 正态近似得到Z分数 Z = sign(S)*((abs(S)-1)/sqrt(VarS)); % Kendall's Tau 和 P-value 的计算 tau = S/(n*(n-1)/2); pval = 2 * normcdf(-abs(Z), 0, 1); end ``` 上述代码实现了最基本的Mann-Kendall检验逻辑[^1]。通过调用该函数并传入NDVI时间序列作为输入参数即可获得Tau系数以及对应的P值。 #### 调用示例 假设有名为`ndvi_data.mat`的数据文件存储着多年的NDVI数值,在命令窗口中加载数据后可以直接调用上面编写的mann_kendall()函数: ```matlab load('ndvi_data.mat'); % 加载包含 NDVI 时间序列变量 ndvi_series 的 .mat 文件 [tau, pvalue] = mann_kendall(ndvi_series); disp(['Kendall''s Tau: ', num2str(tau)]); disp(['p-value: ', num2str(pvalue)]); ``` 这段脚本会读取预先保存好的NDVI数据集,并对其进行Mann-Kendall趋势分析,最后打印出结果。 #### 结果解释 - `tau`: 表征两个随机选取样本之间顺序关系的概率差异程度; - `pvalue`: 显示所观察到的趋势是否显著的小概率事件发生的可能性大小。通常情况下,当p<0.05时认为存在明显变化趋势
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值