LXX
读完需要
速读仅需 1 分钟
前言:
在遥感领域,NDVI 时间序列分析是一种重要的方法,用于监测植被动态、评估生态变化等。其中,Sen+MK 分析法因其高效性和准确性而备受青睐,同时还有线性回归、FORMA 趋势分析方法能够进行 NDVI 的变化趋势分享。因此,本文分享在 GEE 中进行以下四种方法的尝试。
希望各位同学点个关注,点个小赞,这将是更新的动力,不胜感激❥(^_-)
1
(1)线性回归分析 (linear_reg)
线性回归分析是一种统计方法,用于评估两个变量之间的线性关系。在 NDVI 趋势分析中,我们使用线性回归来评估 NDVI 随时间的变化趋势。
原理:线性回归尝试找到一条最能描述两个变量关系的直线,通常用公式
y=mx+b 表示,其中y = m x + b y = mx + b y 是因变量(NDVI),y y x 是自变量(时间),x x m 是斜率,m m b 是截距。b b 目的:通过斜率
m 的正负值来判断NDVI随时间是上升、下降还是保持不变。m m 实现:在代码中,使用
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 Drive
Export.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);