0

所以我有的是不同年龄的鳕鱼重量数据。随着时间的推移,这些数据是在几个位置获取的。

我想创建的是“年龄体重”,基本上是某个年龄体重的平均值。我想在每年的每个位置都这样做。但是,年龄的采样方式不同(所有捕获的老鱼都被测量,而年轻的鱼被子采样),所以我不能只创建一个正常的平均值,我想引导样本。

bootstrap 应该在一个年龄取出 5 个随机的体重值,创建一个平均值并重复 1000 次,然后创建平均值。这些值应该能够再次使用(替换)。这应该在每年的每个地区代码中针对每个年龄进行。相关因素:年份-地点-年龄。

所以这里有一个我的数据可能是什么样子的例子。

df <- data.frame( Year= rep(c(2000:2008),2), AreaCode = c("39G4", "38G5","40G5"), Age = c(0:8), IndWgt = c(rnorm(18, mean=5, sd=3)))
> df
   Year AreaCode Age       IndWgt
1  2000     39G4   0  7.317489899
2  2001     38G5   1  7.846606144
3  2002     40G5   2  0.009212455
4  2003     39G4   3  6.498688035
5  2004     38G5   4  3.121134937
6  2005     40G5   5 11.283096043
7  2006     39G4   6  0.258404136
8  2007     38G5   7  6.689780137
9  2008     40G5   8 10.180511929
10 2000     39G4   0  5.972879108
11 2001     38G5   1  1.872273650
12 2002     40G5   2  5.552962065
13 2003     39G4   3  4.897882549
14 2004     38G5   4  5.649438631
15 2005     40G5   5  4.525012587
16 2006     39G4   6  2.985615831
17 2007     38G5   7  8.042884181
18 2008     40G5   8  5.847629941

AreaCode 包含不同的位置,实际上我有 85 个不同的级别。时间序列从 1991 年到 2013 年,年龄 0-15 岁。IndWgt 包含权重。我的整个数据框的行长为 185726。

此外,并非每个地点和每年都存在每个年龄。不知道这是否会成为问题,只是脚本不是基于对某些行号的引用。权重列中有一些 NA 值,但我可以事先将它们删除。

我在想我可能应该使用replicate, andapply或其他plyr功能。我试图理解这个boot函数,但我真的不知道我是否会在 下写我的论点statistics,在这种情况下如何写。所以,是的,基本上我不知道。

如果我能得到任何帮助,我将不胜感激!

4

2 回答 2

2

这个怎么样plyr。我认为从您只想引导“年轻”鱼的重量并为较旧的鱼使用实际方法的问题。如果不是,只需将ifelse()语句替换为其最后一个参数。

require(plyr)
#cod<-read.csv("cod.csv",header=T) #I loaded your data from csv

bootstrap<-function(Age,IndWgt){
  ifelse(Age>2,      # treat differently for old/young fish
         res<-mean(IndWgt),           # old fish mean
         res<-mean(replicate(1000,sample(IndWgt,5,replace = TRUE))) # young fish bootstrap
         )
  return(res)
}

ddply(cod,.(Year,AreaCode,Age),summarize,boot_mean=bootstrap(Age,IndWgt))

  Year AreaCode Age boot_mean
1 2000     39G4   0  6.650294
2 2001     38G5   1  4.863024
3 2002     40G5   2  2.724541
4 2003     39G4   3  5.698285
5 2004     38G5   4  4.385287
6 2005     40G5   5  7.904054
7 2006     39G4   6  1.622010
8 2007     38G5   7  7.366332
9 2008     40G5   8  8.014071

PS:如果你想以相同的方式对所有年龄段进行采样,则不需要该功能,只需:

ddply(cod,.(Year,AreaCode,Age),
      summarize,
      boot_mean=mean(replicate(1000,mean(sample(IndWgt,5,replace = TRUE)))))
于 2013-11-27T08:58:22.183 回答
0

由于您没有提供足够的代码,因此我很难(懒惰)对其进行正确测试。您应该使用以下代码迈出第一步。如果你把它包装成replicate,你应该得到你可以平均的最终结果。

part.result <- aggregate(IndWgt ~ Year + AreaCode + Age, data = data, FUN = function(x) {
  rws <- length(x)
  get.em <- sample(x, size = 5, replace = TRUE)
  out <- mean(get.em)
  out
})

要处理任何缺少的年份/年龄/位置组合,您可能会添加一个 if 语句检查NULL/NA并产生警告和/或跳过迭代。

于 2013-11-27T08:44:47.083 回答