更新:
@lselzer からの回答は、サンプルの長さが少なくともst13
. 上記の私のコードは、2
. @lselzer のコードは、サンプルに2
. sample()
を取得するまで何度も呼び出す必要があるため、これは非常に非効率的です2
。2
サンプルで a が返される前に、コードが長時間繰り返される可能性があります。では、もっとうまくやれるでしょうか?
1 つの方法は、 への 1 回の呼び出しを使用して置換を使用して大きなサンプルを抽出することsample()
です。どちらが2
s であるかを確認2
し、最初のlength(st13)
エントリ内に a があるかどうかを確認します。2
存在する場合は、それらのエントリを返します。存在しない場合は、大きなサンプルの最初のエントリを見つけて、そのエントリを含む までのすべてのエントリを返します。sがない場合は2
、別の大きなサンプルを追加して繰り返します。ここにいくつかのコードがあります:
#runs
n <- 100 #00
stage <- st13
stagedead <- stagemoved <- stagestay <- Size <- vector()
sampSize <- 100 * (len <- length(stage)) ## sample size to try
for(i in seq_len(n)){
## take a large sample
samp <- sample(stage, size = sampSize, replace = TRUE)
## check if there are any `2`s and which they are
## and if no 2s expand the sample
while(length((twos <- which(samp == 2))) < 1) {
samp <- c(samp, sample(stage, size = sampSize, replace = TRUE))
}
## now we have a sample containing at least one 2
## so set index to the required set of elements
if((min.two <- min(twos)) <= len) {
index <- samp[seq_len(len)]
} else {
index <- samp[seq_len(min.two)]
}
stay <- length(index[index==1]) / length(index)
moved <- length(index[index==2]) / length(index)
stagestay[i] <- stay
stagemoved[i] <- moved
Size[i] <- length(index)
}
以下は、46 エントリに 2 が 1 つしかない本当に縮退したベクトルです。
R> st14 <- sample(c(rep(1, 45), 2))
R> st14
[1] 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[39] 1 1 1 1 1 1 1 1
ではなく上記のループを使用すると、100 回の実行ごとにst13
を取得するために必要な最小サンプル サイズは次のようになります。2
R> Size
[1] 65 46 46 46 75 46 46 57 46 106 46 46 46 66 46 46 46 46
[19] 46 46 46 46 46 279 52 46 63 70 46 46 90 107 46 46 46 87
[37] 130 46 46 46 46 46 46 60 46 167 46 46 46 71 77 46 46 84
[55] 58 90 112 52 46 53 85 46 59 302 108 46 46 46 46 46 174 46
[73] 165 103 46 110 46 80 46 166 46 46 46 65 46 46 46 286 71 46
[91] 131 61 46 46 141 46 46 53 47 83
sampSize
したがって、私が選択した ( ) はここでは少しやり過ぎであることが示唆さ100 * length(stage)
れますが、使用しているすべての演算子はベクトル化されているため、初期サンプル サイズが長すぎてもペナルティはあまり発生しません。余分なsample()
呼び出し。
原文:
あなたの理解が正しければ、問題は指標をまったくsample()
返さない可能性があることです。その場合は、制御フロー構造2
を使用して、サンプリングが完了するまでサンプリングを続けることができます。repeat
それに応じてコードを変更し、少し最適化しました。これは、あなたが行っていたようにオブジェクトをループ内で成長させることがないためです。これを改善する方法は他にもありますが、今のところループに固執します。説明は以下になります。
st13 <- c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,3,3)
#runs
n <- 10000
stage <- st13
stagedead <- stagemoved <- stagestay <- vector()
for(i in seq_len(n)){
repeat {
index <- sample(stage, replace = TRUE)
if(any(index == 2)) {
break
}
}
stay <- length(index[index==1]) / length(index)
moved <- length(index[index==2]) / length(index)
stagestay[i] <- stay
stagemoved[i] <- moved
}
これは、Q: に関連する主な変更点です。
repeat {
index <- sample(stage, replace = TRUE)
if(any(index == 2)) {
break
}
}
これが行うことは、a がトリガーされてループbreak
から抜け出すまで、中括弧に含まれるコードを繰り返すことです。repeat
つまり、ブートストラップ サンプルを取得し、サンプルのいずれかに index が含まれているかどうかを確認します2
。sがある場合は、2
抜け出して現在の for ループ反復の残りを続行します。サンプルに s が含まれていない場合2
、ブレークはトリガーされず、別のサンプルを取り直します。これは、 を含むサンプルを取得するまで発生し2
ます。