Moyenne géomésortingque: y a-t-il un intégré?

J’ai essayé de trouver un moyen intégré pour la géomésortinge mais je ne pouvais pas.

(Évidemment, un intégré ne va pas me faire économiser du temps lorsque je travaille dans le shell, et je ne soupçonne pas non plus qu’il ya une différence de précision; pour les scripts, j’essaie d’utiliser le plus souvent possible des le gain de performance est souvent perceptible.

Au cas où il n’y en aurait pas (ce dont je doute), voici le mien.

gm_mean = function(a){prod(a)^(1/length(a))} 

Voici une fonction vectorisée, tolérante à zéro et à la NA pour calculer la moyenne géomésortingque dans R. Le calcul mean verbeux impliquant la 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 passage à travers na.rm et @Gregor pour vous assurer qu’il fonctionne correctement.

Je pense que certains des commentaires sont liés à une fausse équivalence des valeurs NA dans les données et les zéros. Dans l’application, je pensais qu’ils étaient les mêmes, mais ce n’est évidemment pas le cas. Ainsi, si vous voulez inclure la propagation facultative des zéros et traiter la length(x) différemment dans le cas de la suppression de NA , le texte suivant est 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 un NaN plus informatif et approprié, car cette moyenne géomésortingque 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.

Non, mais il y a quelques personnes qui en ont écrit un, comme ici .

Une autre possibilité est d’utiliser ceci:

 exp(mean(log(x))) 

le

 exp(mean(log(x))) 

fonctionnera sauf s’il y a un 0 dans x. Si c’est le cas, le journal produira -Inf (-Infinite), ce qui donnera toujours une moyenne géomésortingque de 0.

Une solution consiste à supprimer la valeur -Inf avant de calculer la moyenne:

 geo_mean <- function(data) { log_data <- log(data) gm <- exp(mean(log_data[is.finite(log_data)])) return(gm) } 

Vous pouvez utiliser une seule ligne pour faire cela, mais cela signifie calculer deux fois le journal, ce qui est inefficace.

 exp(mean(log(i[is.finite(log(i))]))) 

vous pouvez utiliser le paquet psych et appeler geomesortingc.mean fonction geomesortingc.mean .

J’utilise exactement ce que Mark dit. De cette façon, même avec tapply, vous pouvez utiliser la fonction intégrée, pas besoin de définir la vôtre! Par exemple, pour calculer les moyennes géomésortingques des données par groupe $ value:

 exp(tapply(log(data$value), data$group, mean)) 

S’il manque des valeurs dans vos données, ce n’est pas un cas rare. vous devez append un argument supplémentaire. Vous pouvez essayer les codes suivants.

 exp(mean(log(i[is.finite(log(i))]),na.rm=T)) 

Le package EnvStats a une fonction pour geoMean et geoSd