R - 按几个列标准引导

时间:2013-11-27 08:26:48

标签: r statistics-bootstrap

所以我所拥有的是不同年龄的鳕鱼重量数据。随着时间的推移,这些数据将在多个地点进行。

我想创造的是“年龄时的体重”,基本上是某个年龄的体重的平均值。我希望每年为每个地点做这件事。 然而,年龄不是以相同的方式采样(所有捕获的旧鱼都是测量的,而年幼的鱼是经过采样的),所以我不能只创建一个正常的平均值,我想引导样本。

引导程序应该在一个年龄取出5个随机的权重值,创建一个平均值并重复1000次,然后创建平均值。这些值应该能够再次使用(替换)。这应该针对每年每个AreaCode的每个年龄段进行。依赖因素:年份 - 年龄。

所以这是我的数据的样子。

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值,但我可以在手前删除它们。

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

我会感谢任何帮助!

2 个答案:

答案 0 :(得分: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)))))

答案 1 :(得分: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并生成警告和/或跳过迭代。