2016-02-04 2 views
0

Je tente de calculer une fonction d'écart-type simple à partir d'un objet brique raster à l'aide de la fonction calc() du package raster. J'ai des valeurs manquantes et je veux qu'elles soient exclues. Je pense que je devrais être en mesure de les exclure en incluant le na.rm = argument de vrai, mais quand je le fais, je reçois une erreur:La fonction d'écart-type déclenche une erreur lorsque na.rm = TRUE lors de l'utilisation de calc() dans le package raster

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

Ci-dessous j'ai créé un exemple trivial de démontrer (note: Je l'ai écrit ma propre fonction de l'écart-type pour une population que la fonction intégrée SD est l'écart type de l'échantillon. Cependant, il jette la même erreur)

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) 

une couche de trame complète de 2,624 doit être retourné. Des pensées?

Répondre

2

C'est parce que votre fonction ne prend pas l'argument na.rm. Le fichier d'aide pour calc indique na.rm s'il est pris en charge par 'fun'. La fonction suivante corrige ceci:

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) 

La déclaration if fait en sorte que la longueur de x utilisé est correct pour le réglage, Décapage également NA valeurs.

Vous pouvez également transmettre des arguments supplémentaires aux fonctions en utilisant la notation .... Donc, vous pourriez avoir

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

Dans ce cas depuis var retours NA s'il y a des NA valeurs qui ne sont pas dépouillées la nécessité de vérifier la même condition pour la longueur est pas nécessaire.

+0

Ca l'a fait, merci! – jlab