我正在尝试计算各种不同物种的渔获量数据的算术和几何平均值。因此,我试图获得表示每网捕获的鱼数的方法。
我的问题是,并非所有物种在每次捕获事件中都被捕获,并且没有记录有关物种缺失的数据。因此,我想确保算术和几何平均值反映所有事件,而不仅仅是捕获它们的事件。
总而言之,我希望计算每个物种捕获的鱼数的算术平均值和几何平均值。这是一些示例代码:
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.
好像你首先要做的是把所有没有出现的物种和网都加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