【问题标题】:R - Bootstrap by several column criteriaR - 通过几个列标准引导
【发布时间】:2015-07-01 16:10:20
【问题描述】:

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

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

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 值,但我可以事先将它们删除。

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

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

【问题讨论】:

    标签: r statistics-bootstrap


    【解决方案1】:

    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)))))
    

    【讨论】:

    • 看起来第二个脚本完全符合我的要求。比我预期的要容易。很抱歉不清楚年龄。关于 ifelse 函数。所以在这里你基本上为每个 2 岁以上的年龄创建了一个正常的平均值,并引导了年轻的年龄。我对吗?非常感谢!
    • 你好@Troy。我现在突然对脚本有问题。它返回:Error in if (length(x) == 1L &amp;&amp; is.numeric(x) &amp;&amp; x &gt;= 1) { : missing value where TRUE/FALSE needed 你能猜出错误可能在代码的哪一部分吗?
    【解决方案2】:

    由于您没有提供足够的代码,因此我很难(懒惰)对其进行正确测试。您应该使用以下代码迈出第一步。如果你把它包装成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 并产生警告和/或跳过迭代。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-22
      • 1970-01-01
      相关资源
      最近更新 更多