R中的随机子采样

时间:2013-08-22 15:41:54

标签: r resampling

我是R的新人,因此我的问题可能非常简单。 我有40个浮游动物丰富的地点。

我的数据看起来像这样(列是物种丰富,行是站点)

0   0   0   0   0   2   0   0   0   
0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   85  0
0   0   0   0   0   45  5   57  0
0   0   0   0   0   13  0   3   0
0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   7   0
0   3   0   0   12  8   0   57  0
0   0   0   0   0   0   0   1   0
0   0   0   0   0   59  0   0   0
0   0   0   0   4   0   0   0   0
0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0
0   105 0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0
0   0   0   0   1   0   0   100 0
0   35  0   55  0   0   0   0   0
1   4   0   0   0   0   0   0   0
0   0   0   0   0   34  21  0   0
0   0   0   0   0   9   17  0   0
0   54  0   0   0   27  5   0   0
0   1   0   0   0   1   0   0   0
0   17  0   0   0   54  3   0   0

我想要的是从每个站点取一个随机子样本(例如50个人)而不进行多次替换(bootstrap),以便随后计算新标准化丰度的多样性指数。

4 个答案:

答案 0 :(得分:1)

尝试这样的事情:

mysample <- mydata[sample(1:nrow(mydata), 50, replace=FALSE),]

答案 1 :(得分:1)

OP在这里寻找的是一种为Hill或Simpson多样性指数引导数据的方法,它提供了对被采样数据的一些假设:

  • 每一行都是一个站点,每列都是一个物种,每个值都是一个计数。
  • 个人正在为引导程序而不是计算器进行抽样。

为此,自举程序通常会将计数模型化为一系列个体。例如,如果我们有这样的记录:

a  b  c
2  3  4

该记录将建模为:

aabbbcccc

然后,通常从字符串中替换一个样本以根据模型集创建一个更大的集合。

引导网站:在R中,我们有办法实现这一点,实际上使用'sample'函数非常简单。如果从列编号中进行选择,则可以使用计数数据提供概率。

# Test data.
data <- data.frame(a=2, b=3, c=4)

# Sampling from first row of data.
row <- 1
N_samples <- 50

samples <- sample(1:ncol(data), N_samples, rep=TRUE, prob=data[row,])

将样本转换为原始表的格式:现在我们有一个样本数组,每个项目都指示样本所属的列号。我们可以通过多种方式转换回原始表格格式,但这是一个使用简单计数循环的相当简单的格式:

# Count the number of each entry and store in a list.
for (i in 1:ncol(data)){
    site_sample[[i]] <- sum(samples==i)
}

# Unlist the data to get an array that represents the bootstrap row.
site_sample <- unlist(site_sample)

答案 2 :(得分:0)

这应该有效。它比起初看起来要复杂一些,因为每个细胞都包含一个物种的数量。该解决方案使用 apply 函数将每行数据发送到用户定义的sample_species函数。然后我们生成 n 随机数并对它们进行排序。如果物种1中有15种,物种2中20种,物种3中20种,则1至15之间产生的随机数表示物种1,16和35表示物种2,而36-55表示物种3。

## Initially takes in a row of the data and the number of samples to take
sample_species <- function(counts,n) {
  num_species <- length(counts)
  total_count <- sum(counts)
  samples <- sample(1:total_count,n,replace=FALSE)
  samples <- samples[order(samples)]
  result <- array(0,num_species)
  total <- 0
  for (i in 1:num_species) {
    result[i] <- length(which(samples > total & samples <= total+counts[i]))
    total <- total+counts[i]
  }
  return(result)
}

A <- matrix(sample(0:100,10*40,replace=T), ncol=10) ## mock data
B <- t(apply(A,1,sample_species,50)) ## results

答案 3 :(得分:0)

偶然发现了这个主题,而素食主义者的包有一个名为&#39; rrarify&#39;这正是你正在做的事情(在同样的生态背景下)