Voici une fonction vectorisée, tolérante à zéro et NA pour le calcul de la moyenne géométrique en R. Le mean
calcul détaillé impliquant length(x)
est nécessaire pour les cas où x
contient 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.rm
passage et @Gregor pour s'assurer qu'il fonctionne correctement.
Je pense que certains des commentaires sont liés à une fausse équivalence des NA
valeurs 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 NA
suppression, 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 NaN
ce 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.