[英]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
如果沒有刪除NA
值,則返回NA
,因此不必檢查相同的長度條件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.