几何平均值:是否有内置?
我试图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))