Berikut adalah fungsi vectorized, zero- dan NA-tolerant untuk menghitung rata-rata geometris di R. mean
Perhitungan verbose yang melibatkan length(x)
diperlukan untuk kasus-kasus di mana x
mengandung nilai-nilai non-positif.
gm_mean = function(x, na.rm=TRUE){
exp(sum(log(x[x > 0]), na.rm=na.rm) / length(x))
}
Terima kasih kepada @ ben-bolker karena telah mencatat na.rm
pass-through dan @Gregor untuk memastikannya berfungsi dengan benar.
Saya pikir beberapa komentar terkait dengan kesetaraan NA
nilai palsu dalam data dan nol. Dalam penerapan yang saya pikirkan, mereka sama, tetapi tentu saja ini tidak benar secara umum. Jadi, jika Anda ingin menyertakan penyebaran opsional dari nol, dan memperlakukan secara length(x)
berbeda dalam kasus NA
penghapusan, berikut ini adalah alternatif yang sedikit lebih panjang untuk fungsi di atas.
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))
}
}
Perhatikan bahwa ini juga memeriksa nilai negatif apa pun, dan mengembalikan nilai yang lebih informatif dan tepat NaN
sehubungan dengan rata-rata geometris tidak ditentukan untuk nilai negatif (tetapi untuk nol). Terima kasih kepada pemberi komentar yang tetap menangani kasus saya tentang ini.