在光栅包中使用 calc() 时,标准偏差函数在 na.rm=TRUE 时抛出错误

standard deviation function throws error when na.rm=TRUE while using calc() in raster package

我正在尝试使用栅格包中的 calc() 函数从栅格砖块对象计算简单的标准差函数。我有缺失值并希望将它们排除在外。我想我应该能够通过包含 na.rm=TRUE 参数来排除它们,但是当我这样做时我收到一个错误:

Error in .calcTest(x[1:5], fun, na.rm, forcefun, forceapply) :
cannot use this function. Perhaps add '...' or 'na.rm' to the function arguments? 

下面我创建了一个简单的示例来演示(注意:我已经为总体编写了自己的标准差函数,因为内置的 sd 函数用于样本标准差。但是,它会抛出相同的错误)

r <- raster(nrow=10, ncol=10)
r1 <- setValues(r, 5)
r2 <- setValues(r, 10)
r3 <- setValues(r, 11)
r4 <- setValues(r, NA)
s <- stack(r1, r2,r3,r4)

pop.sd=function(x)(sqrt(var(x)*(length(x)-1)/length(x)))

stdv<-calc(s, fun=pop.sd, na.rm=T)

应返回一个充满 2.624 的栅格图层。有什么想法吗?

这是因为你的函数没有接受参数na.rmcalc 的帮助文件显示 na.rm 如果 'fun' 支持。以下函数解决了这个问题:

pop.sd=function(x, na.rm){
  v = var(x,na.rm = na.rm)
  l = if(na.rm) sum(!is.na(x)) else length(x)
  sqrt(v*(l-1)/l)
}

stdv<-calc(s, fun=pop.sd, na.rm=TRUE)

if 语句确保所使用的 x 的长度对于调整来说是正确的,同时也去除了 NA 值。

您还可以使用 ... 符号将附加参数传递给函数。所以你可以

pop.sd=function(x, ...){
  v = var(x,...)
  l = sum(!is.na(x))
  sqrt(v*(l-1)/l)
}

在这种情况下,因为 var returns NA 如果有 NA 值没有被剥离,则需要检查长度的相同条件是没必要。