Hier ist eine vektorisierte, null- und NA-tolerante Funktion zur Berechnung des geometrischen Mittelwerts in R. Die ausführliche mean
Berechnung length(x)
ist für die Fälle erforderlich, in denen x
nicht positive Werte enthalten sind.
gm_mean = function(x, na.rm=TRUE){
exp(sum(log(x[x > 0]), na.rm=na.rm) / length(x))
}
Vielen Dank an @ ben-bolker für das Notieren des na.rm
Durchgangs und an @Gregor für das Sicherstellen, dass es korrekt funktioniert.
Ich denke, einige der Kommentare beziehen sich auf eine falsche Äquivalenz von NA
Werten in den Daten und Nullen. In der Anwendung, an die ich gedacht hatte, sind sie gleich, aber das ist natürlich im Allgemeinen nicht wahr. Wenn Sie also die optionale Weitergabe von Nullen einschließen und diese beim Entfernen length(x)
anders behandeln möchten NA
, ist das Folgende eine etwas längere Alternative zu der 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 auch nach negativen Werten gesucht wird und eine aussagekräftigere und angemessenere Rückgabe erfolgt NaN
, wobei zu berücksichtigen ist, dass das geometrische Mittel nicht für negative Werte definiert ist (sondern für Nullen). Vielen Dank an die Kommentatoren, die diesbezüglich in meinem Fall geblieben sind.