0

だから私が持っているのは、さまざまな年齢のタラの体重のデータです。このデータは、時間の経過とともにいくつかの場所で取得されます。

私が作成したいのは「年齢別体重」で、基本的には特定の年齢での体重の平均値です。毎年、場所ごとにこれを行いたいと思います。ただし、年齢は同じ方法でサンプリングされていないため (捕獲されたすべての古い魚が測定され、若い魚はサブサンプリングされます)、通常の平均を作成することはできません。サンプルをブートストラップしたいと思います。

ブートストラップは、年齢ごとの体重の 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ええ、基本的にはわかりません。

私が得ることができるどんな助けにも感謝します!

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

NULL年/年齢/場所の欠落した組み合わせを処理するために、 /をチェックNAして警告を生成したり、反復をスキップしたりする if ステートメントを追加できます。

于 2013-11-27T08:44:47.083 に答える