Hier ist ein vektorisiert, nullter und NA tolerante Funktion für die Einbeziehung length(x)
geometrisches Mittel in R. Die ausführliche mean
Berechnung der Berechnung für die Fälle erforderlich ist, wo x
kraft- Werte enthält.
gm_mean = function(x, na.rm=TRUE){
exp(sum(log(x[x > 0]), na.rm=na.rm)/length(x))
}
Dank @ ben-Bolker für unter Hinweis auf die na.rm
Passthrough und @Gregor für dafür, dass es korrekt funktioniert.
Ich denke, einige der Kommentare beziehen sich auf eine falsche Äquivalenz von NA
Werte in den Daten und Nullen. In der Anwendung, die ich mir vorgenommen habe, sind sie gleich, aber das stimmt natürlich nicht. Wenn Sie also die optionale Weitergabe von Nullen einbeziehen und die length(x)
beim Entfernen von NA
anders behandeln möchten, ist die folgende etwas längere Alternative zur obigen Funktion.
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))
}
}
Beachten Sie, dass es auch für etwaige negative Werte überprüft und gibt ein informativer und entsprechende NaN
respektieren, dass geometrische Mittel nicht für negative Werte definiert ist (aber ist für Nullen). Danke an die Kommentatoren, die über meinen Fall geblieben sind.
Vorsicht bei negativen Zahlen und Überläufen. prod (a) wird sehr schnell unter oder überlaufen. Ich habe versucht, das mit einer großen Liste zu takten und schnell Inf mit der Methode vs 1.4 mit exp (Mittelwert (log (x))); das Rundungsproblem kann ziemlich schwerwiegend sein. – Tristan
Ich schrieb die obige Funktion schnell, weil ich mir sicher war, dass 5 Minuten nach der Veröffentlichung dieses Q jemand mir sagen würde, dass R für GM integriert ist. Also kein eingebautes, also ist es sicher wert, die Zeit zu nehmen, um im Lichte Ihrer Anmerkungen neu zu kodieren. + 1 von mir. – doug