นี่คือฟังก์ชัน vectorized, zero- และ NA-tolerant สำหรับการคำนวณค่าเฉลี่ยทางเรขาคณิตใน 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
เนื่องจากค่าเฉลี่ยทางเรขาคณิตไม่ได้กำหนดไว้สำหรับค่าลบ (แต่เป็นค่าศูนย์) ขอบคุณผู้แสดงความคิดเห็นที่ติดตามคดีของฉันเกี่ยวกับเรื่องนี้