Voici une fonction vectorisée, tolérante à zéro et NA pour le calcul de la moyenne géométrique en R. Le meancalcul détaillé impliquant length(x)est nécessaire pour les cas où xcontient des valeurs non positives.
gm_mean = function(x, na.rm=TRUE){
exp(sum(log(x[x > 0]), na.rm=na.rm) / length(x))
}
Merci à @ ben-bolker pour avoir noté le na.rmpassage et @Gregor pour s'assurer qu'il fonctionne correctement.
Je pense que certains des commentaires sont liés à une fausse équivalence des NAvaleurs dans les données et des zéros. Dans l'application que j'avais en tête, ce sont les mêmes, mais bien sûr ce n'est généralement pas vrai. Ainsi, si vous souhaitez inclure la propagation facultative des zéros, et traiter length(x)différemment en cas de NAsuppression, voici une alternative légèrement plus longue à la fonction ci-dessus.
gm_mean = function(x, na.rm=TRUE, zero.propagate = FALSE){
if(any(x < 0, na.rm = TRUE)){
return(NaN)
}
if(zero.propagate){
if(any(x == 0, na.rm = TRUE)){
return(0)
}
exp(mean(log(x), na.rm = na.rm))
} else {
exp(sum(log(x[x > 0]), na.rm=na.rm) / length(x))
}
}
Notez qu'il vérifie également les valeurs négatives et renvoie une valeur plus informative et plus appropriée en NaNce qui concerne le fait que la moyenne géométrique n'est pas définie pour les valeurs négatives (mais pour les zéros). Merci aux commentateurs qui sont restés sur mon cas à ce sujet.