Đây là một vectorized, chức năng zero- và NA-khoan dung để tính trung bình hình học trong R. Các tiết mean
tính liên quan đến length(x)
là cần thiết cho các trường hợp x
chứa các giá trị không tích cực.
gm_mean = function(x, na.rm=TRUE){
exp(sum(log(x[x > 0]), na.rm=na.rm)/length(x))
}
Cảm ơn @ ben-bolker vì đã chú ý đến thông số na.rm
và @Gregor để đảm bảo nó hoạt động chính xác.
Tôi nghĩ rằng một số nhận xét có liên quan đến sự tương đương giả của các giá trị NA
trong dữ liệu và số không. Trong ứng dụng tôi có trong tâm trí họ là như nhau, nhưng tất nhiên điều này thường không đúng. Do đó, nếu bạn muốn bao gồm việc truyền bá số không bắt buộc, và xử lý length(x)
khác nhau trong trường hợp xóa NA
, sau đây là một thay thế hơi dài hơn đối với hàm ở trên.
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))
}
}
Lưu ý rằng nó cũng kiểm tra đối với bất kỳ giá trị âm, và trả về một thông tin mới hơn và phù hợp NaN
tôn trọng điều đó có nghĩa là hình học không được định nghĩa cho các giá trị tiêu cực (nhưng là dành cho số không). Cảm ơn những người bình luận đã ở lại trường hợp của tôi về việc này.
Nguồn
2014-08-28 17:55:51
Cẩn thận về số âm và tràn. prod (a) sẽ bị tràn hoặc tràn rất nhanh. Tôi đã cố gắng để thời gian này bằng cách sử dụng một danh sách lớn và nhanh chóng có Inf bằng cách sử dụng phương pháp của bạn vs 1,4 với điểm kinh nghiệm (có nghĩa là (log (x))); vấn đề làm tròn có thể khá nghiêm trọng. – Tristan
tôi vừa viết chức năng ở trên nhanh chóng vì tôi đã chắc chắn rằng 5 phút sau khi đăng bài này Q, ai đó sẽ cho tôi biết R được xây dựng trong cho gm. Vì vậy, không có sẵn để nó là giá trị nhất định dành thời gian để tái mã trong ánh sáng của nhận xét của bạn. + 1 từ tôi. – doug