几何平均值:是否有内置?

我试图find一个内置的几何意义,但不能。

(很显然,在shell中工作时,内置函数不会节省我的时间,也不会怀疑精度有任何差别;对于脚本,我尽可能经常使用内置函数,性能增益往往是显而易见的。

如果没有一个(我怀疑是这种情况),这是我的。

gm_mean = function(a){prod(a)^(1/length(a))} 

这里是一个vector化的,零和NA容忍函数,用于计算R中的几何平均值。涉及length(x)的详细mean计算对于x包含非正值的情况是必要的。

 gm_mean = function(x, na.rm=TRUE){ exp(sum(log(x[x > 0]), na.rm=na.rm) / length(x)) } 

感谢@ ben-bolker注意到na.rm传递和@Gregor确保它正常工作。

我认为一些评论与数据和零中NA值的假等价关系有关。 在我的应用程序中,我想他们是一样的,但当然这不是一般的事实。 因此,如果要包括零的可选传播,并且在NA去除的情况下以不同的方式处理length(x) ,则以下是对上述函数稍微长一点的替代scheme。

 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)) } } 

请注意,它也检查任何负值,并返回一个更多的信息和适当的NaN尊重几何均值没有定义为负值(但是为零)。 感谢留在我这个案子的评论者。

不,但是有几个人写了一个,比如这里 。

另一种可能性是使用这个:

 exp(mean(log(x))) 

你可以使用psych包,并调用geometric.mean函数。

 exp(mean(log(x))) 

将工作,除非有一个0 x。 如果是这样的话,日志将产生-Inf(-Infinite),这总是导致几何平均值为0。

一种解决scheme是在计算均值之前删除-Inf值:

 geo_mean <- function(data) { log_data <- log(data) gm <- exp(mean(log_data[is.finite(log_data)])) return(gm) } 

你可以使用一行代码来做到这一点,但这意味着计算两次logging是低效率的。

 exp(mean(log(i[is.finite(log(i))]))) 

我正是用马克所说的。 这样,即使使用tapply,也可以使用内置的mean函数,无需定义你的! 例如,要计算每组数据几何平均数据$ value:

 exp(tapply(log(data$value), data$group, mean)) 

如果您的数据中缺less值,这不是一个罕见的情况。 你需要添加一个参数。 你可以尝试下面的代码。

 exp(mean(log(i[is.finite(log(i))]),na.rm=T))