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

在R中实现嵌套重抽样:如何保持试次行和N_K恒定?

解决固定行总和的重抽样问题

核心需求回顾

你的数据集是100行(试次)×60列(物种),每个单元格代表试次K中物种i的个体数N_iK。需要实现内外环重抽样:

  • 内环:对每个试次重抽样物种个体数,要求每行(试次)的总个体数N_K保持恒定
  • 外环:从内环生成的数据集里,有放回重抽样100个试次,重复1000次

解决方案

1. 生成模拟数据(修正随机种子)

set.seed(1234)
df <- matrix(sample(0:15, 6000, replace = T), ncol = 60)

2. 计算每个试次的总个体数N_K

N_K <- rowSums(df)

3. 定义内环重抽样函数(固定行总和)

利用多项式抽样实现:在固定总个体数的前提下,按原试次的物种比例重新分配个体数,保证行总和严格等于N_K。

resample_row <- function(row, total) {
  # 处理总个体数为0的特殊情况
  if (total == 0) {
    return(rep(0, length(row)))
  }
  # 计算各物种的抽样概率(基于原试次的比例)
  prob <- row / total
  prob[is.na(prob)] <- 0 # 避免除以0产生的NaN
  # 多项式抽样生成新的个体数分布
  new_row <- rmultinom(n = 1, size = total, prob = prob)[,1]
  return(new_row)
}

4. 完整的内外环重抽样实现

n_outer <- 1000  # 外环重抽样次数
n_tries <- nrow(df)  # 单次外环抽取的试次数

# 初始化结果矩阵:1000*100行 × 60列
complete <- matrix(NA, nrow = n_outer * n_tries, ncol = ncol(df))

for (r in 1:n_outer) {
  # 内环:生成所有试次的重抽样结果(保持N_K恒定)
  inner_df <- t(apply(cbind(df, N_K), 1, function(x) {
    resample_row(x[-length(x)], x[length(x)])
  }))
  
  # 外环:从内环数据集中有放回抽取100个试次
  sampled_indices <- sample(1:n_tries, n_tries, replace = TRUE)
  complete[(r-1)*n_tries + 1:n_tries, ] <- inner_df[sampled_indices, ]
}

关键说明

  • 多项式抽样是生态数据中保持总丰度不变的标准重抽样方法,既保留了原试次的物种组成比例,又满足行总和约束。
  • 如果需要允许原试次中个体数为0的物种被抽到,可以给概率项加平滑项,比如:
    prob <- (row + 1e-6) / (total + length(row)*1e-6)
    
  • 原代码中seed(1234)是错误的,R中设置随机种子需用set.seed()。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 02:24:52