首页 > 解决方案 > 从栅格堆栈 R 中删除线性趋势

问题描述

尝试从 1979 年至 2015 年期间美国的月降水栅格堆栈中移除线性趋势(去趋势)(https://www.northwestknowledge.net/metdata/data/monthly/pr_gridMET.nc)。这些数据足够大,以这些数据为例在这里会有点不守规矩,所以为了提高效率,我将使用栅格包中的数据。我目前的工作模型是在线性模型上使用 `raster"::calc` 并提取残差。我的理解是这些残差是去趋势系列,但我不能 100% 确定这是正确的。代码我正在使用如下:

library(raster)

fn <- raster(system.file("external/test.grd", package="raster"))
fn2 <- fn+1000
fn3 <- fn +500
fn4 <- fn +750
fn5 <- fn+100

fns <- stack(fn, fn2, fn3, fn4, fn5)

time <- 1:nlayers(fns)

# Get residuals to detrend the raw data
get_residuals <- function(x) {
  if (is.na(x[1])){ 
    rep(NA, length(x)) } 
  else {
    m <- lm(x~time)
    q <- residuals(m)
    return(q)
  }
}

detrended_fns <- calc(fns, get_residuals) # Create our residual (detrended) time series stack

我觉得我在这里遗漏了一些东西。任何人都可以确认我在正确的轨道上吗?如果我没有关于如何正确去除这些数据的任何建议会很有帮助!谢谢!

标签: rraster

解决方案


残差消除了斜率截距,你就会得到异常。也许您只想移除斜坡?在这种情况下,您可以将截距添加到残差中get_residuals

q <- residuals(m) + coefficients(m)[1]

或更好:

q <- residuals(m) + predict(m)[1]

这样您就可以使用第 1 年(而不是第 0 年)作为基础,如果时间是,它也可以工作,例如,2000:2004

您也可以将去年、年中或平均值作为基数。


推荐阅读