如何计算鱼类CPUE的算术与几何均值并解决均值异常问题
解决鱼类CPUE算术与几何均值计算问题
第一步:补全捕捞事件数据
要让均值反映所有捕捞事件,首先得把所有netSet(捕捞事件)和Species(物种)的组合补全,未捕获的物种对应捕捞量填0。
修正后的示例代码:
count <- c(10,13,15,18, 2,5,10,4,23,13) net_set <- c(1,1,1,2,2,2,2,3,3,4) species <- c("A", "A", "B", "A", "B", "C", "C", "A", "C", "B") # 修正变量名错误,将未定义的fish_count改为count data <- data.frame(fishCount = count, netSet = net_set, Species = species) # 生成所有捕捞事件与物种的完整组合 full_data <- expand.grid( netSet = unique(data$netSet), Species = unique(data$Species) ) # 合并原始数据,缺失的捕捞量补0 full_data <- merge(full_data, data, by = c("netSet", "Species"), all.x = TRUE) full_data$fishCount[is.na(full_data$fishCount)] <- 0
第二步:计算算术均值
按物种分组直接求均值即可:
library(dplyr) arithmetic_mean <- full_data %>% group_by(Species) %>% summarise(arithmetic_mean = mean(fishCount))
第三步:计算几何均值(修正异常问题)
你之前几何均值大于算术均值,核心原因是没纳入未捕获的0值事件,导致样本偏倚。但几何均值无法直接处理0,行业常用以下两种修正方式:
方法1:加1修正法(最常用)
给每个捕捞量加1避免0值,计算后再还原:
geometric_mean <- full_data %>% group_by(Species) %>% summarise( geometric_mean = exp(mean(log(fishCount + 1))) - 1 )
方法2:加权非零几何均值(需业务场景支持)
若不想用加1的方式,可计算非零值的几何均值,再乘以该物种被捕获事件的占比:
geometric_mean_weighted <- full_data %>% group_by(Species) %>% summarise( non_zero_events = sum(fishCount > 0), total_events = n(), geo_mean_non_zero = exp(mean(log(fishCount[fishCount > 0]))), geometric_mean_weighted = geo_mean_non_zero * (non_zero_events / total_events) ) %>% select(Species, geometric_mean_weighted)
关键说明
- 补全0值后,算术均值能准确反映所有捕捞事件的平均捕获水平。
- 加1修正后的几何均值符合统计学规律(算术均值≥几何均值),同时保留了数据的相对趋势。
内容的提问来源于stack exchange,提问作者Kevin Short
相关产品推荐
相关产品推荐

