Oto wektoryzowana funkcja z tolerancją na zero i NA, służąca do obliczania średniej geometrycznej w R. Pełne mean
obliczenia z udziałem length(x)
są konieczne w przypadkach, w których x
zawiera wartości niedodatnie.
gm_mean = function(x, na.rm=TRUE){
exp(sum(log(x[x > 0]), na.rm=na.rm) / length(x))
}
Podziękowania dla @ ben-bolker za odnotowanie na.rm
przejścia i @Gregor za upewnienie się, że działa poprawnie.
Myślę, że niektóre komentarze dotyczą fałszywej równoważności NA
wartości w danych i zer. W aplikacji, o której myślałem, są takie same, ale oczywiście nie jest to generalnie prawda. Tak więc, jeśli chcesz uwzględnić opcjonalną propagację zer i traktować length(x)
inaczej w przypadku NA
usuwania, poniższa alternatywa jest nieco dłuższą alternatywą dla powyższej funkcji.
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))
}
}
Należy zauważyć, że sprawdza również wszelkie wartości ujemne i zwraca bardziej pouczające i odpowiednie informacje, biorąc pod uwagę, NaN
że średnia geometryczna nie jest zdefiniowana dla wartości ujemnych (ale jest dla zer). Dziękuję komentatorom, którzy pozostali przy mojej sprawie w tej sprawie.