Вот векторизованная, нулевая и NA-толерантная функция для вычисления среднего геометрического в R. Подробное mean
вычисление, включающее length(x)
, необходимо для случаев, когда x
содержит неположительные значения.
gm_mean = function(x, na.rm=TRUE){
exp(sum(log(x[x > 0]), na.rm=na.rm) / length(x))
}
Спасибо @ ben-bolker за отметку na.rm
pass-through и @Gregor за то, что он работает правильно.
Я думаю, что некоторые комментарии связаны с ложной эквивалентностьюNA
значений в данных и нулях.В приложении, которое я имел в виду, они одинаковы, но, конечно, это не совсем так.Таким образом, если вы хотите включить необязательное распространение нулей и трактовать length(x)
по-разному в случае удаления NA
, ниже приведена несколько более длинная альтернатива указанной выше функции.
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
, учитывая, что геометрическое среднее не определено для отрицательных значений (но для нулей).Спасибо комментаторам, которые остались в моем случае по этому поводу.