在光栅包中使用 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.rm
。 calc
的帮助文件显示 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
值没有被剥离,则需要检查长度的相同条件是没必要。
我正在尝试使用栅格包中的 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.rm
。 calc
的帮助文件显示 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
值没有被剥离,则需要检查长度的相同条件是没必要。