所以我所拥有的是不同年龄的鳕鱼重量数据。随着时间的推移,这些数据将在多个地点进行。
我想创造的是“年龄时的体重”,基本上是某个年龄的体重的平均值。我希望每年为每个地点做这件事。 然而,年龄不是以相同的方式采样(所有捕获的旧鱼都是测量的,而年幼的鱼是经过采样的),所以我不能只创建一个正常的平均值,我想引导样本。
引导程序应该在一个年龄取出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值,但我可以在手前删除它们。
我在想我可能应该使用replicate
,apply
或其他plyr
功能。我试图理解boot
函数,但我真的不知道我是否会在statistics
下编写我的参数,在这种情况下是如何编写的。所以是的,基本上我不知道。
我会感谢任何帮助!
答案 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
并生成警告和/或跳过迭代。