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

如何在R中针对多参数组合批量运行种群估算函数

批量计算不同调查期、河段、鱼类物种的种群估计值

我正在自学R语言,需要编写代码估算不同调查期(Survey)、河段(Site)下不同鱼类物种的种群数量。目前代码仅能针对单一参数组合(如Survey=3、Site=b、Species=scul)运行removal()函数得到种群估计值(PE)及置信区间(UCI、LCI),无法自动遍历所有参数组合完成批量计算并生成统一结果表。尝试过循环和自定义函数但未成功,对列表、向量等数据结构的协同处理存在困惑,寻求可行的批量实现方案。

现有代码:

library(tidyverse)
library(FSA)

set.seed(1)     

#random sample dataframe
df <- data.frame(
  Survey = rep(c(1,2,3), each = 45),
  Site = rep(c("a","b","c","d","e"), times = 3, each = 9),
  Run = rep (c(1,2,3), 15, each = 3),
  Species = rep(c("brt", "rbt", "scul"), times = 45),
  Count = sample(1:15))


# get number of species caught at each run per survey per site
count_summary <- df %>% 
  group_by(Survey, Site, Run, Species) %>%
  summarise(n = sum(Count))%>%
  rename("Count" = "n") %>%
  ungroup

# SPECIFY catch data 
sp_count <- count_summary %>%
  filter(Species == "scul", Survey == 3, Site =="b")

# Make catch a vector so removal() will run
catch <- as.vector(sp_count$Count) 

# Calculate population estimate
pop_est <- removal(catch)

#pulls the relevant list, transforms to a dataframe, transposes, 
#transforms to a dataframe again
df_pop_est <- as.data.frame(t(as.data.frame(pop_est$est)))

# keeps only the relevant numbers (pop estimate, lower CI, upper CI)
pe_ci <- df_pop_est %>%
  select(No, No.UCI, No.LCI)%>%
  rename(PE = No, LCI = No.LCI, UCI = No.UCI)

pe_ci

期望输出格式:

Survey  Site  Species  PE      UCI       LCI
3       b     scul     55      142.1708  -32.17078
3       a     scul     x       y         z
2       a     rbt      x       y         z
1       e     brt      x       y         z
1       d     scul     x       y         z

批量实现方案

可以利用tidyverse的分组嵌套(nest())+ 映射(map())功能,批量处理每个参数组合:

library(tidyverse)
library(FSA)

set.seed(1)     

# 生成示例数据(和原代码一致)
df <- data.frame(
  Survey = rep(c(1,2,3), each = 45),
  Site = rep(c("a","b","c","d","e"), times = 3, each = 9),
  Run = rep (c(1,2,3), 15, each = 3),
  Species = rep(c("brt", "rbt", "scul"), times = 45),
  Count = sample(1:15))

# 按调查期、河段、采样轮次、物种汇总捕获量
count_summary <- df %>% 
  group_by(Survey, Site, Run, Species) %>%
  summarise(Count = sum(Count), .groups = "drop")

# 定义处理单个分组的函数:输入捕获量向量,返回PE、UCI、LCI的 dataframe
calc_pop_est <- function(catch_vec) {
  pop_est <- removal(catch_vec)
  as.data.frame(t(as.data.frame(pop_est$est))) %>%
    select(No, No.UCI, No.LCI) %>%
    rename(PE = No, LCI = No.LCI, UCI = No.UCI)
}

# 分组嵌套并批量计算
final_results <- count_summary %>%
  # 按Survey、Site、Species分组,嵌套Run和Count数据
  nest(data = c(Run, Count)) %>%
  # 对每个分组的捕获量向量应用计算函数
  mutate(pop_stats = map(data, ~calc_pop_est(.x$Count))) %>%
  # 展开统计结果,同时丢弃嵌套的原始数据
  unnest(pop_stats) %>%
  select(-data)

# 查看结果
head(final_results)

代码说明:

  1. nest():将每个Survey-Site-Species组合对应的Run和Count数据嵌套成列表列,方便后续批量处理。
  2. 自定义函数calc_pop_est():封装原代码中从捕获量向量到提取PE、置信区间的逻辑,避免重复代码。
  3. map():遍历每个嵌套的分组数据,调用calc_pop_est()生成统计结果。
  4. unnest():将嵌套的统计结果展开为常规列,最终得到统一的结果表。

运行上述代码后,final_results就是你需要的包含所有参数组合的种群估计值及置信区间的表格。

内容的提问来源于stack exchange,提问作者Ray

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 00:45:05