代码之家  ›  专栏  ›  技术社区  ›  Stefano Potter

R光栅中的自定义函数因zyp包中的回归而失败

  •  0
  • Stefano Potter  · 技术社区  · 6 年前

    很抱歉,我不能使这个重复,我已经尝试了很多次,但我不能得到相同的错误弹出。

    这是我的问题,在R中有一个堆叠的光栅,它本质上是一个三维矩阵。这个叠加光栅的形状是(500,500,15)。我想对栈中的每个像素进行泰尔森回归,因此每一个向量中有15个元素的500次回归。可能存在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的向量编写了一个变通方法,所以我不明白为什么会发生这种情况。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Robert Hijmans    6 年前

    这是一个很难回答的问题,因为您没有提供示例数据。这就是我调试它的方法。使用循环而不是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])
    

    修理 茨法恩 再试一次,从失败的地方重新开始

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

    我注意到你的功能 茨法恩 有一个 na.rm 未使用的参数,并且在第二个参数后缺少括号 return(NaN . 回来可能更合适 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"]] } )