Ich habe versucht, ein eingebautes geometrisches Mittel zu finden, konnte es aber nicht.
(Offensichtlich spart mir ein eingebautes System keine Zeit, während ich in der Shell arbeite, und ich vermute auch nicht, dass es einen Unterschied in der Genauigkeit gibt. Bei Skripten versuche ich, eingebaute Elemente so oft wie möglich zu verwenden, wobei die (kumulativen) Leistungssteigerung ist oft spürbar.
Für den Fall, dass es keinen gibt (was ich bezweifle, ist der Fall), hier ist meiner.
gm_mean = function(a){prod(a)^(1/length(a))}
Antworten:
Hier ist eine vektorisierte, null- und NA-tolerante Funktion zur Berechnung des geometrischen Mittelwerts in R. Die ausführliche
mean
Berechnunglength(x)
ist für die Fälle erforderlich, in denenx
nicht positive Werte enthalten sind.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 Entfernenlength(x)
anders behandeln möchtenNA
, ist das Folgende eine etwas längere Alternative zu der obigen Funktion.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.quelle
na.rm
als Argument durchzugehen (dh den Benutzer entscheiden zu lassen, ob er NA-tolerant sein möchte oder nicht, um die Konsistenz mit anderen R-Zusammenfassungsfunktionen zu gewährleisten)? Ich bin nervös, Nullen automatisch auszuschließen - ich würde das auch zu einer Option machen.na.rm
wenn Sie als Option bestehen. Ich werde meine Antwort aktualisieren. Was das Ausschließen von Nullen betrifft, ist das geometrische Mittel für nicht positive Werte, einschließlich Nullen, undefiniert. Das Obige ist eine übliche Korrektur für das geometrische Mittel, bei der Nullen (oder in diesem Fall alle Nicht-Nullen) einen Dummy-Wert von 1 erhalten, der keine Auswirkung auf das Produkt hat (oder äquivalent Null in der logarithmischen Summe).na.rm
Pass-Through funktioniert nicht wie codiert ... siehegm_mean(c(1:3, NA), na.rm = T)
. Sie müssen das& !is.na(x)
aus der Vektor-Teilmenge entfernen , und da das erste Argument vonsum
ist...
, müssen Sie denna.rm = na.rm
Namen übergeben und Sie müssen auch0
's undNA
' s aus dem Vektor imlength
Aufruf ausschließen.x
nur Null (en) enthält, wiex <- 0
,exp(sum(log(x[x>0]), na.rm = TRUE)/length(x))
gibt1
für das geometrische Mittel, die keinen Sinn machen.Nein, aber es gibt einige Leute, die eine geschrieben haben, wie hier .
Eine andere Möglichkeit ist, dies zu verwenden:
quelle
Wir können das psych-Paket verwenden und die Funktion geometric.mean aufrufen .
quelle
psych::geometric.mean()
Das
funktioniert nur, wenn x eine 0 enthält. In diesem Fall erzeugt das Protokoll -Inf (-Infinite), was immer zu einem geometrischen Mittelwert von 0 führt.
Eine Lösung besteht darin, den -Inf-Wert vor der Berechnung des Mittelwerts zu entfernen:
Sie können dazu einen Einzeiler verwenden, dies bedeutet jedoch, dass das Protokoll zweimal berechnet wird, was ineffizient ist.
quelle
sum(x) / length(x)
falsch ist, wenn Sie x filtern und dann an übergebenmean
.Ich benutze genau das, was Mark sagt. Auf diese Weise können Sie auch mit tapply die integrierte
mean
Funktion verwenden, ohne Ihre definieren zu müssen! Zum Beispiel, um geometrische Mittelwerte für Daten pro Gruppe zu berechnen $ value:quelle
Diese Version bietet mehr Optionen als die anderen Antworten.
Der Benutzer kann zwischen Ergebnissen, die keine (reellen) Zahlen sind, und Ergebnissen, die nicht verfügbar sind, unterscheiden. Wenn negative Zahlen vorhanden sind, ist die Antwort keine reelle Zahl und
NaN
wird zurückgegeben. Wenn es sich nur umNA
Werte handelt, kehrt die Funktion zurück,NA_real_
um anzuzeigen, dass ein realer Wert buchstäblich nicht verfügbar ist. Dies ist ein subtiler Unterschied, der jedoch zu (geringfügig) robusteren Ergebnissen führen kann.Der erste optionale Parameter
zero.rm
soll es dem Benutzer ermöglichen, dass Nullen die Ausgabe beeinflussen, ohne sie auf Null zu setzen. Wennzero.rm
aufFALSE
undeta
aufNA_real_
(sein Standardwert) gesetzt ist, haben Nullen den Effekt, dass das Ergebnis auf eins verkleinert wird. Ich habe keine theoretische Rechtfertigung dafür - es scheint nur sinnvoller zu sein, die Nullen nicht zu ignorieren, sondern "etwas zu tun", bei dem das Ergebnis nicht automatisch auf Null gesetzt wird.eta
ist eine Methode zum Umgang mit Nullen, die von der folgenden Diskussion inspiriert wurde: https://support.bioconductor.org/p/64014/quelle
dplyr
für ein solches Dienstprogramm hinzufügen, es sei denn, dies ist erforderlich ...)case_when
s waren ein wenig albern, also habe ich sie und die Abhängigkeit zugunsten vonif
s entfernt. Ich habe auch einige Ausarbeitungen gemacht.nan.rm
aufTRUE
auszurichten alle drei `` `.rm`` Parameter.ifelse
ist für die Vektorisierung ausgelegt. Mit einer einzigen zu überprüfenden Bedingung wäre die Verwendung idiomatischervalue.count <- if(zero.rm) sum(x[!is.na(x)] > 0) else sum(!is.na(x))
ifelse
. Geändert. Vielen Dank!Das EnvStats-Paket verfügt über eine Funktion für geoMean und geoSd .
quelle
Falls in Ihren Daten Werte fehlen, ist dies kein seltener Fall. Sie müssen ein weiteres Argument hinzufügen.
Sie können folgenden Code versuchen:
quelle
quelle