Ось векторизована, нульова та NA-толерантна функція для обчислення геометричної середньої величини в Р. Дослідний 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
що середнє геометричне значення не визначене для негативних значень (а для нулів). Дякую коментаторам, які зупинилися на моєму випадку з цього приводу.