【问题标题】:Efficient way to interpolate time series of raster bricks in R在R中插入光栅砖时间序列的有效方法
【发布时间】:2017-12-23 02:06:04
【问题描述】:

我有一些代表时间序列的大型栅格砖(每一层都是一个时间点)。我希望通过在层之间进行插值来提高时间分辨率(在下面的示例中,插值使用zoo::na.spline,尽管如果它们有帮助,我愿意接受其他插值方法)。我不能直接在砖块上使用na.spline - 它不是为此而设计的,只是提供Error in as.array.default(X) : 'dimnames' applied to non-array

目前我正在使用一系列循环来执行此操作(1 个循环生成具有更多时间层的砖块,第二个循环将原始砖块插入到正确的层中,第三个循环使用 na .spline 每个单元格)。然而,这在大砖块上速度非常慢,而且似乎是一种相当低效的方法。

一个最小的可重现示例。

首先让我们制作一个表示低时间分辨率数据的初始栅格砖。请注意,左上角的单元格始终为 NA,因为任何解决方案都必须对仅包含 NA 的单元格具有鲁棒性:

library(raster); library(rasterVis); library(zoo)
r1 = raster(matrix(c(NA, rep(1,8)), 3, 3))
r2 = raster(matrix(c(NA, rep(2,8)), 3, 3))
r3 = raster(matrix(c(NA, rep(3,8)), 3, 3))    
b1 = brick(list(r1,r2,r3))
levelplot(b1)

现在,让我们创建一个空的栅格砖,在其中插入值:

b2 = brick(lapply(1:9, function(x) raster(matrix(NA, 3, 3))))

接下来我们将b1 的层插入到b2 的适当层中。请注意,我什至在这里使用循环,因为subassignment of selected layers into raster bricks does not work

old.layers = c(1,4,7)
for (i in 1:nlayers(b1)) {
  b2[[old.layers[i]]] = b1[[i]]
} 
levelplot(b2, layout=c(9,1))

最后我们遍历每个单元格进行时间序列插值并将结果插入b2

for (cell in 1:ncell(b2)) {
  if (all(is.na(as.vector(b2[cell])))) {
    # na.spline wil fail if all are NA
    new.values = as.numeric(rep(NA, dim(b2)[3])) 
  } else {
    new.values = na.spline(as.vector(b2[cell]), na.rm = F) 
  }
  b2[cell][] = new.values
}
levelplot(b2, layout=c(9,1))

这可行,但似乎效率极低且不优雅。有没有更快(最好也更优雅)的方法来做到这一点?

【问题讨论】:

    标签: r raster zoo


    【解决方案1】:

    您可以将raster::calc 与这样的函数一起使用:

    yy <- rep(NA, 9)
    fun <- function(y) { 
      if (all(is.na(y)))  yy else na.spline((yy[c(1,4,7)] <- y), xout=1:9)
    }
    b2 <- calc(b1,  fun)
    

    作为参考,raster::approxNA 接近您想要的(但它不添加图层,并使用线性插值)。

    【讨论】:

    • 谢谢,这看起来是一个很好的解决方案,但我无法让它工作。我只得到一个所有值都等于 1 的栅格图层。注意我认为它应该是b2 &lt;- calc(b1, fun)。我在 ?calc 中看到“如果 fun 返回多个数字,则返回 RasterBrick”,但由于某种原因,我没有得到这种行为
    • 我稍微更改了代码以更稳健地处理 NA。原始版本似乎是由这些抛出的(因此在上面的评论中提到了问题)。再次感谢 - 我不知道 calc 可以返回砖块而不是单层,所以这是一个非常有用的学习练习。
    猜你喜欢
    • 2023-03-17
    • 2020-09-27
    • 1970-01-01
    • 2016-11-17
    • 2016-12-25
    • 1970-01-01
    • 2019-04-22
    • 2019-09-21
    • 2022-09-24
    相关资源
    最近更新 更多