时间序列的栅格数据Sen+MK分析(R语言)源自徐洋——NDVI时间序列分析之Sen+MK分析全过程梳理

一、代码运行文件夹内为年数据或月数据,
得三个数据:

MKtest(用于检验,不用于制图)

slope(趋势)

Z(显著度)

#install.packages("sp")
#install.packages("raster")
#install.packages("rgdal")
#install.packages("trend")
#install.packages("terra")
#dir.create("D:/rfiles")
#setwd("D:/rfiles")
#getwd()


#pkgbuild::find_rtools(debug = TRUE)


library(sp)
library(raster)
library(rgdal)
library(trend)
library(terra)
setwd("J:/PTJPL ET8218/驱动因子/EVI/year") #输入一个文件夹内的单波段TIFF数据,在这里是历年的NDVI年最大值
fl <- list.files(pattern='*tif$')
firs<-raster(fl[1])
for (i in 2:37) {
  r <- raster(fl[i])
  firs <- stack(firs, r)
}
fun <- function(y){
  if(length(na.omit(y)) < 37) return(c(NA, NA, NA))   #删除数据不连续含有NA的像元
  MK_estimate <- sens.slope(ts(na.omit(y), start = 1982, end = 2018, frequency = 1), conf.level = 0.95) #Sen斜率估计
  slope <- MK_estimate$estimate
  MK_test <- MK_estimate$p.value
  Zs <- MK_estimate$statistic
  return(c(Zs, slope, MK_test))
}

e <- calc(firs, fun)     #栅格计算
e_Zs <- subset(e,1)      #提取Z值
e_slope <- subset(e,2)   #提取sen斜率
e_MKtest <- subset(e,3)  #提取p值

plot(e_Zs)
plot(e_slope)
plot(e_MKtest)

writeRaster(e_Zs, "J:/PTJPL ET8218/驱动因子/senEVI/EVI1982_2018_Zs.tif", format="GTiff", overwrite=T)
writeRaster(e_slope, "J:/PTJPL ET8218/驱动因子/senEVI/EVI1982_2018_slope.tif", format="GTiff", overwrite=T)
writeRaster(e_MKtest, "J:/PTJPL ET8218/驱动因子/senEVI/EVI1982_2018_MKtest.tif", format="GTiff", overwrite=T)

二、充分类 变化趋势划分

结合SNDVI和Z统计量划分NDVI变化趋势:

  • slope

    • -0.0005~0.0005稳定区域

    • 大于或等于0.0005植被改善区域

    • 小于-0.0005为植被退化区域

  • Z统计量

    Slope划分

    • 置信水平0.05

    • Z绝对值大于1.96显著

    • Z绝对值小于等于1.96不显著

  • Slope被划分为三级:

    • SNDVI≤−0.0005 植被退化

    • −0.0005≥SNDVI≥0.0005 植被生长稳定

    • SNDVI≥0.0005 植被改善

  • 使用重分类(Reclassify)对slope进行划分

    • 由于slope.tif文件研究区范围外的值非空,所以在这里先裁剪了一下

    • 裁剪所用矢量和栅格数据坐标系需要一致,否则范围容易出错

    • 统一使用了WGS84地理坐标系作为空间参考

    • 使用Model builder构建地理处理流

Slope划分过程

  • 重分类结果:

    • -1退化

    • 0稳定

    • 1改善

Z值划分

  • 对Z值进行重分类,确定显著性

    • |Zs|≤1.96 未通过95%置信度检验,不显著

    • |Zs|≥1.96 通过95%置信度检验,显著

Z值重分类

  • 重分类结果:

    • 1不显著

    • 2显著

三、变化趋势计算

使用栅格计算器将Slope和Z值计算结果相乘,最后得到趋势变化划分

  • -2严重退化

  • -1轻微退化

  • 0稳定不变

  • 1轻微改善

  • 2明显改善

### 时间序列 TS 检验方法和 Mann-Kendall (MK) 分析的应用 #### 什么是时间序列 TS 检验? 时间序列检验(Time Series Test, 简称 TS 检验)是一种用于分析时间序列数据特性的统计学方法。它主要用于判断时间序列是否存在显著的趋势、周期性或突变点等问题。常见的 TS 检验方法包括但不限于 Pettitt 方法、CUSUM 方法以及基于回归模型的时间序列建模。 一种典型的例子是 Pettitt 方法,该方法通过无参数的方式检测时间序列中的突变点位置[^2]。其核心原理在于利用两个子序列之间的差异最小化原则找到最可能的突变年份。这种方法无需假设数据服从特定分布,因此非常适合处理具有复杂背景噪声的实际观测数据。 --- #### Mann-Kendall (MK) 趋势检验的核心概念 Mann-Kendall 趋势检验是一种非参数统计测试技术,广泛应用于环境科学领域中评估变量随时间的变化趋势。此方法不依赖于任何关于数据分布的具体假设,因而特别适合用来研究水文、气象等领域内的非正态分布数据集[^1]。 具体而言,在执行 MK 测试过程中会构建一个 S 统计量来衡量整个时间段内两两比较的结果总和;如果最终得到的大规模正值或者负值,则表明存在上升/下降倾向的可能性较大。此外还定义了一个标准化版本 Z 来进一步量化这种可能性水平,并据此判定是否有足够的证据支持原假设被拒绝——即认为确实观察到了某种单调变化模式的存在[^3]。 以下是实现 Python 中基本形式的 MK 检验代码片段: ```python import numpy as np from scipy.stats import norm def mann_kendall_test(x): n = len(x) s = 0 for k in range(n-1): for j in range(k+1,n): s += np.sign(x[j]-x[k]) var_s = (n*(n-1)*(2*n+5))/18 if s>0: z = (s - 1)/np.sqrt(var_s) elif s<0: z = (s + 1)/np.sqrt(var_s) else : z=0 p_value_two_tailed = 2 * (1-norm.cdf(abs(z))) trend="no trend" if(p_value_two_tailed<=0.05 and z<0):trend="decreasing" if(p_value_two_tailed<=0.05 and z>0):trend="increasing" return {"z":z,"p-value":p_value_two_tailed,"Trend":trend} ``` 上述脚本实现了标准版单侧及双侧 P 值计算功能的同时也提供了定性结论输出选项以便快速理解结果含义。 --- #### 应用场景对比 | 特性 | Time Sequence Tests (e.g., Pettitt Method) | Mann-Kendall Trend Analysis | |--------------------|-------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------| | **主要用途** | 主要关注的是时间序列中的结构改变(如均值漂移),寻找潜在断点的位置 | 更侧重于识别长期趋势的方向及其强度 | | **适用范围** | 广泛运用于生态遥感监测指标比如 NDVI 的间歇性波动特征提取 | 多见于降水量、河流流量等自然现象的历史记录分析 | | **算法特点** | 非参量性质允许忽略原始信号的确切概率密度函数描述 | 同样具备较强的鲁棒性和适应能力面对各种类型的输入源 | 尽管两者都属于重要的工具箱成员之一,但在实际操作层面往往需要结合具体情况灵活选用甚至联合部署才能达到最佳效果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值