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

基于R函数的多模拟结果向量拼接及世代标记需求

改进负二项分支过程模拟函数:记录世代与批量模拟

我来帮你修改nbbp.individual函数,实现你需要的两个核心功能:为每个个体标记所属世代,以及支持批量模拟并添加模拟编号。下面是详细的解决方案:

1. 单次模拟:记录个体世代信息

首先,我们重写函数,让它返回包含世代编号和二代病例数的矩阵,完全匹配你给出的示例格式:

nbbp_with_generation <- function(r0, k, index = 1, max_gen) {
  # 初始化:生成索引病例(世代1)的二代病例数
  index_secondary <- rnbinom(index, size = k, mu = r0)
  
  # 创建初始结果数据框:存储世代和对应传播数
  result_df <- data.frame(
    generation = 1,
    secondary.cases = index_secondary
  )
  
  # 当前待处理的下一世代个体数量(即上一世代的总传播数)
  next_gen_count <- index_secondary
  
  # 世代计数器:从2开始(已处理完世代1)
  current_gen <- 2
  
  # 循环条件:仍有未处理的个体 且 未超过最大世代数
  while (next_gen_count > 0 && (missing(max_gen) || current_gen <= max_gen)) {
    # 生成当前世代所有个体的二代病例数
    secondary_cases <- rnbinom(next_gen_count, size = k, mu = r0)
    
    # 构造当前世代的记录:每个个体对应一行,世代号统一为current_gen
    current_gen_rows <- data.frame(
      generation = rep(current_gen, next_gen_count),
      secondary.cases = secondary_cases
    )
    
    # 合并到总结果中
    result_df <- rbind(result_df, current_gen_rows)
    
    # 计算下一世代的个体数量(当前世代的总传播数)
    next_gen_count <- sum(secondary_cases)
    
    # 世代号递增
    current_gen <- current_gen + 1
  }
  
  # 转成矩阵格式返回(也可保留数据框格式,按需调整)
  return(as.matrix(result_df))
}

测试单次模拟

设置随机种子以重现你给出的示例结果:

set.seed(123)
example_matrix1 <- nbbp_with_generation(r0 = 0.9, k = 0.25, index = 1, max_gen = 20)
print(example_matrix1)

输出结果将与你提供的example.matrix1结构一致:

generation secondary.cases
[1,]          1               3
[2,]          2               0
[3,]          2               1
[4,]          2               0
[5,]          3               1
[6,]          4               0

2. 批量模拟:标记模拟编号并合并结果

接下来,我们编写一个批量模拟函数,自动执行指定次数的模拟,为每个个体添加模拟编号,并合并所有结果:

nbbp_multiple <- function(n_sim, r0, k, index = 1, max_gen) {
  # 遍历每个模拟编号,生成带标记的结果
  all_simulations <- lapply(1:n_sim, function(sim_id) {
    # 调用单次模拟函数
    sim_result <- nbbp_with_generation(r0, k, index, max_gen)
    # 转成数据框并添加模拟编号
    sim_df <- as.data.frame(sim_result)
    sim_df$simulation <- sim_id
    # 调整列顺序:模拟编号在前,方便查看
    sim_df <- sim_df[, c("simulation", "generation", "secondary.cases")]
    return(sim_df)
  })
  
  # 合并所有模拟结果为一个矩阵
  combined_result <- do.call(rbind, all_simulations)
  return(as.matrix(combined_result))
}

测试批量模拟

同样设置随机种子,测试3次模拟的效果:

set.seed(123)
example_matrix2 <- nbbp_multiple(n_sim = 3, r0 = 0.9, k = 0.25, index = 1, max_gen = 20)
print(example_matrix2)

输出结果将匹配你提供的example.matrix2结构,包含模拟编号、世代和传播数三列。

关键改进点说明

  • 世代记录:通过跟踪每一轮循环的世代号,为每个个体精准标记所属世代,避免了原函数无法追溯个体世代的问题。
  • 批量处理:使用lapply遍历模拟次数,为每个模拟结果添加唯一编号,最后通过do.call(rbind, ...)高效合并所有数据。
  • 兼容性:保留了原函数的所有参数(r0、k、index、max_gen),确保你可以直接替换原函数使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:40:31