如何在R中为栅格堆栈拟合62天周期的时间序列移动平均
问题原因
focal()函数默认针对栅格的空间邻域做运算,无法处理栅格堆栈的时间维度滑动计算,因此不符合你的需求。
可用解决方案
方法1:使用greenbrown包自带的SlideFUN函数(适配你当前的加载包环境)
SlideFUN是greenbrown包专门为栅格时间序列设计的滑动计算函数,直接指定窗口参数即可:
library(greenbrown) library(raster) data("ndvimap") # w参数设置为你需要的窗口长度62 filt <- SlideFUN(ndvimap, FUN = mean, w = 62, na.rm = TRUE)
参数说明:
w:滑动窗口的时间步长,直接填你需要的62即可- 如果你的栅格总层数刚好是62,该运算等价于每个像素的全时间序列均值,输出为单波段栅格
- 如果需要非中心对齐的滑动窗口,可添加
align = "left"/align = "right"参数
方法2:使用terra包实现(运算效率更高,适配大栅格数据)
如果你的数据量较大,推荐用terra包处理,性能远高于raster包:
library(terra) # 将栅格堆栈转为terra支持的SpatRaster格式 ndvi_terra <- rast(ndvimap) # 自定义62天滑动平均函数 roll_mean_62 <- function(x, na.rm = TRUE) { n <- length(x) # 中心滑动窗口逻辑,可根据需求调整起止位置 sapply(1:n, function(i) { win_start <- max(1, i - 31) win_end <- min(n, i + 31) mean(x[win_start:win_end], na.rm = na.rm) }) } # 对每个像素的时间序列应用滑动平均 filt_terra <- app(ndvi_terra, roll_mean_62)
内容的提问来源于stack exchange,提问作者tibi
相关产品推荐
相关产品推荐

