Aquí hay una función vectorizada, tolerante a cero y NA para calcular la media geométrica en R. El mean
cálculo detallado que involucra length(x)
es necesario para los casos donde x
contiene valores no positivos.
gm_mean = function(x, na.rm=TRUE){
exp(sum(log(x[x > 0]), na.rm=na.rm) / length(x))
}
Gracias a @ ben-bolker por señalar la na.rm
transferencia y a @Gregor por asegurarse de que funciona correctamente.
Creo que algunos de los comentarios están relacionados con una falsa equivalencia de NA
valores en los datos y ceros. En la aplicación que tenía en mente, son iguales, pero por supuesto, esto no es cierto en general. Por lo tanto, si desea incluir la propagación opcional de ceros y tratar la length(x)
diferencia de manera diferente en el caso de la NA
eliminación, la siguiente es una alternativa un poco más larga a la función anterior.
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))
}
}
Tenga en cuenta que también comprueba los valores negativos y devuelve un valor más informativo y apropiado NaN
respetando que la media geométrica no está definida para valores negativos (pero sí para ceros). Gracias a los comentaristas que se quedaron en mi caso sobre esto.