Вот векторизованная, допускающая ноль и 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
сквозной переход, и @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
учитывая, что среднее геометрическое не определено для отрицательных значений (а предназначено для нулей). Спасибо комментаторам, которые остались в моем случае по этому поводу.