You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算鱼类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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 21:22:49