【问题标题】:standard deviation function throws error when na.rm=TRUE while using calc() in raster package在 raster 包中使用 calc() 时,当 na.rm=TRUE 时,标准差函数会引发错误
【发布时间】:2016-05-14 03:58:41
【问题描述】:

我正在尝试使用 raster 包中的 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 的栅格图层。有什么想法吗?

【问题讨论】:

    标签: r raster na calc


    【解决方案1】:

    这是因为你的函数没有接受参数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 返回NA,如果有NA 值没有被剥离,则不需要检查相同的长度条件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 2013-04-08
      • 1970-01-01
      • 2023-03-28
      • 2014-08-21
      • 1970-01-01
      相关资源
      最近更新 更多