Aquí es una vectorizado, la función cero y NA-tolerante para el cálculo de la media geométrica en R. El verbosa mean
cálculo que implica length(x)
es necesaria para los casos en los que 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 para destacar la na.rm
de paso y @Gregor de 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 los mismos, pero por supuesto esto no es verdad en general. Por lo tanto, si desea incluir la propagación opcional de ceros y tratar el length(x)
de manera diferente en el caso de la eliminación NA
, la siguiente es una alternativa ligeramente más larga que 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))
}
}
Nota que también comprueba para cualquier valores negativos, y devuelve una más informativo y apropiado NaN
respetando que media geométrica no está definida para valores negativos (pero es para ceros). Gracias a los comentaristas que se quedaron en mi caso sobre esto.
Tenga cuidado con los números negativos y los desbordamientos. prod (a) se subutilizará o desbordará muy rápidamente. Traté de cronometrar esto usando una gran lista y obtuve Inf rápidamente usando su método vs 1.4 con exp (mean (log (x))); el problema de redondeo puede ser bastante severo. – Tristan
acabo de escribir la función de arriba rápidamente porque estaba seguro de que 5 minutos después de publicar esta Q, alguien me diría que R está incorporado para gm. Entonces no tiene incorporado, por lo que vale la pena tomarse el tiempo para volver a codificar a la luz de sus comentarios. + 1 de mi parte – doug