GEE | 以NDVI为例进行性回归分析、Sen's slope分析、Mann-Kendall检验、FORMA趋势分析

文摘   2024-07-15 00:00   山西  

LXX

读完需要

1
分钟

速读仅需 1 分钟

前言:

在遥感领域,NDVI 时间序列分析是一种重要的方法,用于监测植被动态、评估生态变化等。其中,Sen+MK 分析法因其高效性和准确性而备受青睐,同时还有线性回归、FORMA 趋势分析方法能够进行 NDVI 的变化趋势分享。因此,本文分享在 GEE 中进行以下四种方法的尝试。


希望各位同学点个关注,点个小赞,这将是更新的动力,不胜感激❥(^_-)


1

   

四种分析方法介绍

(1)线性回归分析 (linear_reg)

线性回归分析是一种统计方法,用于评估两个变量之间的线性关系。在 NDVI 趋势分析中,我们使用线性回归来评估 NDVI 随时间的变化趋势。

  • 原理:线性回归尝试找到一条最能描述两个变量关系的直线,通常用公式y=mx+by = mx + by=mx+b 表示,其中yyy 是因变量(NDVI),xxx 是自变量(时间),mmm 是斜率,bbb 是截距。

  • 目的:通过斜率mmm 的正负值来判断NDVI随时间是上升、下降还是保持不变。

  • 实现:在代码中,使用 ee.Reducer.linearFit() 计算线性回归模型,并选择其“scale”分量作为结果。

var linear_reg = modis_time.select('system:time_start','NDVI')  .reduce(ee.Reducer.linearFit()).select('scale');


(2) Sen's slope分析 (sen_slope)

Sen's slope是一种非参数趋势分析方法,用于计算时间序列数据中的趋势。

  • 原理:Sen's slope计算所有可能时间间隔的斜率,然后取中位数作为最终斜率。这种方法对异常值不敏感,适用于非正态分布的数据。

  • 目的:评估NDVI随时间的总体变化趋势,判断其上升或下降趋势的强度。

  • 实现:在代码中,使用 ee.Reducer.sensSlope() 计算Sen's slope,并选择其“slope”分量作为结果。

var sen_slope = modis_time.select('system:time_start','NDVI')  .reduce(ee.Reducer.sensSlope()).select('slope');


(3)Mann-Kendall检验 (mannkendall)

Mann-Kendall检验是一种非参数统计检验方法,用于检测时间序列数据中的趋势。

  • 原理:Mann-Kendall检验通过计算所有数据点对之间的差异符号,来判断数据序列中是否存在单调趋势(即上升或下降趋势)。

  • 目的:检测NDVI时间序列中是否存在显著的趋势。

  • 实现:在代码中,使用 ee.Reducer.kendallsCorrelation() 计算Mann-Kendall检验,并选择其结果中的 NDVI_tau 作为最终的趋势值。

var mannkendall = modis_time.select('NDVI')  .reduce(ee.Reducer.kendallsCorrelation());


(4)FORMA趋势分析 (forma)

FORMA(Forest Monitoring for Action)是一种用于森林变化检测的分析方法,但也可以用于其他类型的时间序列分析。

  • 原理:FORMA趋势分析通过监测时间序列数据中的变化模式,检测显著的趋势或突变。

  • 目的:检测NDVI时间序列中的显著变化,评估植被覆盖的长期变化趋势。

  • 实现:在代码中,使用 formaTrend() 函数计算FORMA趋势,并将其结果添加到地图中。

var forma = modis_time.select('NDVI')  .formaTrend();


2

   

实现方法

上述四种分析方法各有特点,适用于不同类型的趋势检测任务:

线性回归:适用于数据分布较为线性且无明显异常值的情况。

Sen's slope:适用于含有异常值或非正态分布的数据,稳健性较好。

Mann-Kendall 检验:适用于检测单调趋势,无需数据满足正态分布。

FORMA 趋势分析:适用于检测显著变化或突变,尤其适用于森林监测等应用。

实现代码如下:

// 定义研究区var geometry = ee.FeatureCollection("users/geestudy2/yibin");
// 将研究区范围添加到地图并居中显示Map.addLayer(geometry, {}, 'Research Area');Map.centerObject(geometry, 8);
// 获取MODIS NDVI数据var modis = ee.ImageCollection("MODIS/061/MOD13A2") .select('NDVI') .filterDate('2001','2021');
// 添加时间波段function ndvi_time(img){ var time = img.metadata('system:time_start').divide(1e9); return img.addBands(time) .copyProperties(img, img.propertyNames());}
var modis_time = modis.map(ndvi_time);
// 线性回归分析var linear_reg = modis_time.select('system:time_start','NDVI') .reduce(ee.Reducer.linearFit()).select('scale');
Map.addLayer(linear_reg.clip(geometry), {palette: ['red', 'black', 'green']}, 'Linear Regression', true);
// Sen's slope分析var sen_slope = modis_time.select('system:time_start','NDVI') .reduce(ee.Reducer.sensSlope()).select('slope');
Map.addLayer(sen_slope.clip(geometry), {palette: ['red', 'black', 'green']}, 'Sen\'s Slope', true);
// 导出Sen's slope结果到Google DriveExport.image.toDrive({ image: sen_slope.clip(geometry), description: 'sen_slope', scale: 1000, region: geometry, maxPixels: 1e13, crs: 'EPSG:4326'});
// Mann-Kendall检验var mannkendall = modis_time.select('NDVI') .reduce(ee.Reducer.kendallsCorrelation());
Map.addLayer(mannkendall.select('NDVI_tau').clip(geometry), {palette: ['red', 'black', 'green']}, 'Mann-Kendall', true);
// FORMA趋势分析var forma = modis_time.select('NDVI') .formaTrend();
Map.addLayer(forma.clip(geometry), {}, 'FORMA Trend', true);

遥感小屋
分享遥感相关文章、代码,大家一起交流,互帮互助
 最新文章