Ho 计算几何平均值作为每单位努力变量的捕获量

问题描述 投票:0回答:1

我正在尝试计算各种不同物种的渔获量数据的算术和几何平均值。因此,我试图获得表示每网捕获的鱼数的方法。

我的问题是,并非所有物种在每次捕获事件中都被捕获,并且没有记录有关物种缺失的数据。因此,我想确保算术和几何平均值反映所有事件,而不仅仅是捕获它们的事件。

总而言之,我希望计算每个物种捕获的鱼数的算术平均值和几何平均值。这是一些示例代码:

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")
data <- data.frame(fishCount = fish_count, netSet = net_set, Species = species)```

The arithmetic mean is simple to compute but I keep getting geometric means larger than arithmetic means which I realise is an issue. 
r dplyr count mean data-manipulation
1个回答
0
投票

好像你首先要做的是把所有没有出现的物种和网都加0,但是出现了其他物种和网,然后计算每个物种的均值

解决第一个问题的一种方法是将您的数据集转换为宽格式,并将所有缺失值填充为 0。这是有效的,因为每个网络都会得到一行,每个物种都会得到一列,所以如果行/ column没有值,可以用0填充。然后把数据转回long格式,我们可以保留这些填充的值。

但是,由于一个组中可能有多个物种,因此物种网组合会有重复,因此我们必须删除这些重复项。

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")
data <- data.frame(fishCount = count, netSet = net_set, Species = species)

library(tidyverse)
data_cleaned <- data %>% 
  mutate(temp = row_number()) %>% 
  pivot_wider(
    id_cols = c(netSet, temp), 
    values_from = fishCount, 
    names_from = Species,
    values_fill = 0
  ) %>% 
  select(-temp) %>% 
  pivot_longer(-c(netSet), names_to = 'Species', values_to = 'fishCount')  

不过,上面的代码将计算重复项。例如B,1有3个值:0、0、15。为了清理这些,我们要删除值为0,但总和大于0的组。

data_cleaned <- data_cleaned %>%
  distinct %>%
  group_by(Species, netSet) %>% 
  filter(!(fishCount == 0 & sum(fishCount) > 0))

data_cleaned
#> # A tibble: 14 × 3
#> # Groups:   Species, netSet [12]
#>    netSet Species fishCount
#>     <dbl> <chr>       <dbl>
#>  1      1 A              10
#>  2      1 C               0
#>  3      1 A              13
#>  4      1 B              15
#>  5      2 A              18
#>  6      2 B               2
#>  7      2 C               5
#>  8      2 C              10
#>  9      3 A               4
#> 10      3 B               0
#> 11      3 C              23
#> 12      4 A               0
#> 13      4 B              13
#> 14      4 C               0

下一步是计算每个物种的平均值,我们可以使用方便的函数

group_by()
,然后是
summarise()

data_cleaned %>% 
  group_by(Species) %>% 
  summarise(avg = mean(fishCount),
            geo_mean = exp(mean(log(fishCount[fishCount > 0])))
)
#> # A tibble: 3 × 3
#>   Species   avg geo_mean
#>   <chr>   <dbl>    <dbl>
#> 1 A         9       9.84
#> 2 B         7.5     7.31
#> 3 C         7.6    10.5

我不太了解几何均值,但几何均值较大的原因是因为我们排除了 0,因为我认为我们无法计算 0 值的几何均值,而如果我们对两种均值都排除 0,则平均值大于几何平均值:

data_cleaned %>% 
  group_by(Species) %>% 
  summarise(avg = mean(fishCount[fishCount>0]),
            geo_mean = exp(mean(log(fishCount[fishCount > 0])))
  )
#> # A tibble: 3 × 3
#>   Species   avg geo_mean
#>   <chr>   <dbl>    <dbl>
#> 1 A        11.2     9.84
#> 2 B        10       7.31
#> 3 C        12.7    10.5
© www.soinside.com 2019 - 2024. All rights reserved.