Aqui está uma função vetorial, tolerante a zero e NA, para calcular a média geométrica em R. O mean
cálculo detalhado length(x)
é necessário para os casos em que x
contém valores não positivos.
gm_mean = function(x, na.rm=TRUE){
exp(sum(log(x[x > 0]), na.rm=na.rm) / length(x))
}
Obrigado a @ben-bolker por observar a na.rm
passagem e a @Gregor por ter certeza de que funciona corretamente.
Acho que alguns dos comentários estão relacionados a uma falsa equivalência de NA
valores nos dados e zeros. No aplicativo que eu tinha em mente, eles são iguais, mas é claro que isso geralmente não é verdade. Portanto, se você deseja incluir a propagação opcional de zeros e tratar de forma length(x)
diferente no caso de NA
remoção, a seguinte alternativa é um pouco mais longa para a função acima.
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))
}
}
Observe que ele também verifica se há valores negativos e retorna uma informação mais informativa e apropriada, NaN
respeitando que a média geométrica não é definida para valores negativos (mas é para zeros). Agradeço aos comentaristas que permaneceram no meu caso sobre isso.