r - 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 的向量编写了一个解决方法,所以我不明白为什么会发生这种情况。
解决方案
这是一个很难回答的问题,因为您没有提供示例数据。这就是我将如何调试它。使用循环而不是 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"]] } )
推荐阅读
- c# - 为什么对象不像引用类型
- r - 编辑数据框 R 中的一行
- swift - Swift MacOS,转换为 NSFilePromiseReceiver 后如何复制原始文件 URL?
- flutter - CircularProgressIndicator 未及时触发
- r - igraph - 将节点颜色设置为分类顶点属性
- python - 时间窗口中相同 ID 的值总和 - Python
- java - IntelliJ - 无法在 GUI 设计器中加载 FormPreviewFrame.class
- python - 如何使用 Python3 从 CSV 中提取特定的数据行?
- reactjs - React js重定向不会重定向到新的url
- php - 递归PHP函数在多维数组内的数组中查找第一次出现的键