Aqui está uma função vetorial, tolerante a zero e NA, para calcular a média geométrica em R. O meancálculo detalhado length(x)é necessário para os casos em que xconté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.rmpassagem 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 NAvalores 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 NAremoçã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, NaNrespeitando 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.