1

長さxのベクトルを置換してサンプリングする修正されたブートストラップの開発に興味がありますが、サンプリングを停止する前に、いくつかの基準を満たす必要があります。人口増加率のラムダ、10000回の反復の信頼区間を計算しようとしていますが、一部の個人のグループ、たとえばベクトル13では、グループから成長する個人はほとんどありません。典型的なブートストラップは、このベクトルの成長が起こらず、したがってモデルが崩壊するかなりの数のインスタンスにつながります。各ベクトルは、特定の数の1、2、および3で構成されます。ここで、1はグループ内にとどまり、2はグループから成長し、3は死亡を表します。これが私がこれまで修正せずに持っていたものであり、時間的には最善のアプローチではない可能性がありますが、私はRに不慣れです。

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
stagestay <- vector()
stagemoved <- vector()
stagedead <- vector()
for(i in 1:n){
      index <- sample(stage, replace=T)
      stay <- ((length(index[index==1]))/(length(index)))
      moved <- ((length(index[index==2]))/(length(index)))
      stagestay <- rbind(stagestay,stay)
      stagemoved <- rbind(stagemoved,moved)
}

現在、このサンプル私の質問は次のとおりです。「インデックス」の長さが少なくともst13と同じになるまで、また2のインスタンスが少なくとも1つ存在するまで、これらの数値のサンプリングを続行するようにサンプル関数を変更するにはどうすればよいですか。索引"?

どうもありがとう、ミシシッピオックスフォードのクリストファーヘニングマスターズ学生大学、MS、38677

4

2 に答える 2

1

更新: @lselzer からの回答は、サンプルの長さが少なくともst13. 上記の私のコードは、2. @lselzer のコードは、サンプルに2. sample()を取得するまで何度も呼び出す必要があるため、これは非常に非効率的です22サンプルで a が返される前に、コードが長時間繰り返される可能性があります。では、もっとうまくやれるでしょうか?

1 つの方法は、 への 1 回の呼び出しを使用して置換を使用して大きなサンプルを抽出することsample()です。どちらが2s であるかを確認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ます。

于 2011-04-01T16:07:03.510 に答える
0

まず、st13 の長さに一致させるために使用できる引数がありますsample。質問の 2 番目の部分は、ループsizeを使用して解決できます。while

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
    stagestay <- vector()
    stagemoved <- vector()
    stagedead <- vector()
    for(i in 1:n){
          index <- sample(stage, length(stage), replace=T)
          while(!any(index == 2)) {
            index <- c(index, sample(stage, 1, replace = T))
          }
          stay <- ((length(index[index==1]))/(length(index)))
          moved <- ((length(index[index==2]))/(length(index)))
          stagestay[i] <- stay
          stagemoved[i] <- moved
    }

私がこの記事を書いているときに、Gavin が私の回答に似た回答を投稿しましたが、サイズの引数を追加して、インデックスが少なくとも st13 の長さであることを確認しました。

于 2011-04-01T16:25:52.517 に答える