【发布时间】:2013-03-04 01:10:48
【问题描述】:
为了遵循文章中介绍的确切方法,我想计算数据向量的对数平均值。我在 R 中或之前的任何讨论中都没有找到任何功能。 2 个数字的情况很清楚,但我无法找出最有效的方法来计算大量数字的对数均值。有什么建议吗?
# Calculating different types of means
# some data
dat <- c(0.008845299, 0.040554701)
# arithmetic mean
arith.m <- mean(dat)
# logarithmic mean
# http://en.wikipedia.org/wiki/Logarithmic_mean
log.m <- (dat[1] - dat[2])/(log(dat[1])-log(dat[2]))
# geometric mean
# http://stackoverflow.com/questions/2602583/geometric-mean-is-there-a-built-in
geo_mean <- function(data) {
log_data <- log(data)
gm <- exp(mean(log_data[is.finite(log_data)]))
return(gm)
}
geo.m <- geo_mean(dat)
# show arithmetic > logarithmic > geometric
arith.m; log.m; geo.m
# how to calculate logarithmic mean for a vector?
dat.n <- c(0.008845299, 0.040554701, 0.047645299, 0.036654701, 0.017345299, 0.018754701, 0.032954701, 0.043145299, 0.026845299, 0.033054701, 0.025554701)
使用去除 0 值的计算进行更新(但是,如下所述,这是有效的吗?):
# add a very low number (generally considered zero in R)
nzero <- 1.940656e-324
dat.n <- c(dat.n, nzero)
# arithmetic mean
arith.m <- mean(dat.n)
geo_mean <- function(data) {
log_data <- log(data)
gm <- exp(mean(log_data[is.finite(log_data)]))
return(gm)
}
geo.m <- geo_mean(dat.n)
lmv <- function(x){
ddlog <- function(x){
d <- rep(0, length(x))
for (i in 1:length(x)){
d[i] <- prod(x[i] - x[-i])
}
sum(log(x)[is.finite(log(x))]/d[is.finite(log(x))])
}
n <- length(x[which(x>0)]) - 1
((-1)^(n+1)*n*ddlog(x))^(-1/n)
}
log.m <- lmv(dat.n)
# show arithmetic > logarithmic > geometric
arith.m; log.m; geo.m
【问题讨论】:
-
它没有任何功能,因为它很简单:
diff(dat.n)/diff(log(dat.n)). -
@JoshuaUlrich:这不是只有两个数字的情况吗?
-
@EdwardP.Morris:当你有两个以上的数字时,这是如何定义的?您链接到的维基百科页面仅讨论该案例。您是否在考虑与几何平均值相同的对数平均值? en.wikipedia.org/wiki/Geometric_mean#Log-average
-
只漏掉零或接近零的值是非常有问题的。例如,
c(1e-1000,1,1)的几何平均值是多少?应该是10^(-998/3)。 -
@BenBolker 有趣!