Reputation: 71
To follow the exact methodology presented in an article I would like to calculate the Logarithmic mean of a data vector. I did not find any functions for this in R, or any previous discussions. The case for 2 numbers is clear, but I could not work out the most efficient method to calculate the log mean for a large vector of numbers. Any suggestions?
# 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)
UPDATE with calculation that strips out 0 values (BUT, as pointed out below is this valid?):
# 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
Upvotes: 1
Views: 3905
Reputation: 2455
Followed by wiki (generalized to (n+1) values):
http://en.wikipedia.org/wiki/Divided_difference#Expanded_form
http://en.wikipedia.org/wiki/Logarithmic_mean#Mean_value_theorem_of_differential_calculus_2
ddlog <- function(x){
d <- rep(0, length(x))
for (i in 1:length(x)){
d[i] <- prod(x[i] - x[-i])
}
sum(log(x)/d)
}
# ddlog is to get divided difference of the logarithm.
lmv <- function(x){
n <- length(x) - 1
((-1)^(n+1)*n*ddlog(x))^(-1/n)
}
R > a <- c(0.008845299, 0.040554701, 0.047645299, 0.036654701, 0.017345299, 0.018754701, 0.032954701, 0.043145299, 0.026845299, 0.033054701, 0.025554701)
R >
R > lmv(a)
[1] 0.0277
Upvotes: 4
Reputation: 61164
Try this:
> -diff(dat.n)/-diff(log(dat.n))
[1] 0.02082356 0.04400483 0.04191009 0.02580711 0.01804083 0.02519117 0.03782146 0.03435320 0.02984241
[10] 0.02914404
Upvotes: 2