首页 > 解决方案 > R 栅格中的自定义函数因 zyp 包中的回归而失败

问题描述

很抱歉,我无法使这个可重现,我尝试了很多次,但我无法弹出相同的错误。

这是我的问题,我在 R 中有一个堆叠的栅格,它本质上是一个 3D 矩阵。此堆叠栅格的形状为 (500, 500, 15)。我想通过堆栈中的每个像素运行泰尔森回归,因此是 500 个回归,每个向量中有 15 个元素。可能存在 NaN 值。

这是我的代码示例:

libarary(raster)
library(zyp)

tsfun = function(x, na.rm){
     #if all Nan return NaN
     if all(is.na(x))){return(NaN)}
     #if less than three values are not NaN return NaN
     if length(na.omit(x)) < 3){return(NaN}
     #otherwise run the regression
     return(zyp.trend.vector(x)[["trend"]]
}

result = calc(input_stack, fun = tsfun, na.rm=TRUE)

但这会返回:

Error in Kendall(t.prime[dmap.prime], ytnm) : length(x)<3 
Called from Kendall(t.prime[dmap.prime], ytnm)

当我被提示探索错误时,它失败的向量是:

[1] 1 2

我已经为长度小于 3 的向量编写了一个解决方法,所以我不明白为什么会发生这种情况。

标签: rr-raster

解决方案


这是一个很难回答的问题,因为您没有提供示例数据。这就是我将如何调试它。使用循环而不是 calc,这样您就可以找出它(首先)失败的地方。检查发生了什么,修复并重tsfun试(可能从 i 的最后一个值开始)。

result <- raster(input_stack)

j <- 1
for (i in j:ncell(input_stack)) {
    result[i] <- tsfun(input_stack[i], na.rm=TRUE)
}

j <- i
input_stack[i]
tsfun(input_stack[i])

修复并重tsfun试,从失败的地方重新开始

for (i in j:ncell(input_stack)) {
    result[i] <- tsfun(input_stack[i])
}

我注意到您的函数tsfun有一个na.rm未使用的参数,并且它在第二个之后缺少括号return(NaN。回归可能更合适NA。此外,鉴于第二行代码,第一行代码是多余的。在我看来,它也可以处理大部分或全部的向量,NA所以你不需要任何这些。所以可以改写为:

tsfun2 <- function(x) {
     if length(na.omit(x)) < 3) { return(NA) }
     return(zyp.trend.vector(x)[["trend"]]
}

或者做

result = calc(input_stack, fun=function(x) { zyp.trend.vector(x)[["trend"]] } )

例如:

library(raster)
library(zyp)
s <- stack(system.file("external/rlogo.grd", package="raster")) 
ss <- stack(s, sqrt(s))
result <- calc(ss, fun=function(x) { zyp.trend.vector(x)[["trend"]] } )

推荐阅读