0

データセットからランダムに抽出された 2 つのサンプルを取得し、関数を適用して、手順を特定の回数繰り返すことができるコードがいくつかあります (関連する質問の以下のコードを参照してください: How to bootstrap a function with replacement and return the output )。

サンプルデータ:

> dput(a)
structure(list(index = 1:30, val = c(14L, 22L, 1L, 25L, 3L, 34L, 
35L, 36L, 24L, 35L, 33L, 31L, 30L, 30L, 29L, 28L, 26L, 12L, 41L, 
36L, 32L, 37L, 56L, 34L, 23L, 24L, 28L, 22L, 10L, 19L), id = c(1L, 
2L, 2L, 3L, 3L, 4L, 5L, 6L, 7L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 
14L, 15L, 16L, 16L, 17L, 18L, 19L, 20L, 21L, 21L, 22L, 23L, 24L, 
25L)), .Names = c("index", "val", "id"), class = "data.frame", row.names = c(NA, 
-30L))

コード:

   library(plyr)
    extractDiff <- function(P){
      subA <- P[sample(nrow(P), 15, replace=TRUE), ] # takes a random sample of 15 rows
      subB <- P[sample(nrow(P), 15, replace=TRUE), ] # takes a second random sample of 15 rows
      meanA <- mean(subA$val)
      meanB <- mean(subB$val)
      diff <- abs(meanA-meanB)
      outdf <- c(mA = meanA, mB= meanB, diffAB = diff)
      return(outdf)
    }

    set.seed(42)
    fin <- do.call(rbind, replicate(10, extractDiff(a), simplify=FALSE))

サイズ 15 のランダムに抽出されたサンプルを 2 つ取得するのではなく、サイズ 15 のランダムに抽出されたサンプルを 1 つ取得し、最初のランダムな抽出が行われた後にデータセットの残りの 15 行を抽出します (つまりsubA、最初のランダムに抽出されたサンプルに等しくなります)。 15 個の obssubBのうち、subA が取得された後の残りの 15 個の obs に等しくなります)。これを行う方法が本当にわかりません。どんな助けでも本当に感謝しています。ありがとう!

4

2 に答える 2

1

コードに小さな変更を加えることで、これを行うことができると思います。

extractDiff <- function(P){
  sampleset = sample(nrow(P), 15, replace=FALSE) #select the first 15 rows, note replace=FALSE
  subA <- P[sampleset, ] # takes the 15 selected rows
  subB <- P[-sampleset, ] # takes the remaining rows in the set
  meanA <- mean(subA$val)
  meanB <- mean(subB$val)
  diff <- abs(meanA-meanB)
  outdf <- c(mA = meanA, mB= meanB, diffAB = diff)
  return(outdf)
}

ただし、ブートストラップには交換が必要なため、これはブートストラップと互換性がないことに注意してください。一方、データ セットから置換を使用してサンプリングし、最初のサンプリングで選択されていないデータセットから置換を使用してサンプリングする場合は、次の手順を実行できます。

extractDiff <- function(P){
  sampleset1 = sample(nrow(P), 15, replace=TRUE) #select the first 15 rows, note replace=TRUE
  sampleset2 = sample((1:nrow(P))[-unique(sampleset1)],15,replace=TRUE) #selects only from rows not used in sampleset1
  subA <- P[sampleset1, ] # takes the 15 selected rows
  subB <- P[sampleset2, ] # takes the 15 selected rows in the remaining set set
  meanA <- mean(subA$val)
  meanB <- mean(subB$val)
  diff <- abs(meanA-meanB)
  outdf <- c(mA = meanA, mB= meanB, diffAB = diff)
  return(outdf)
}

ただし、アプリケーションによっては、2 番目のデータセットが最初のデータセットよりも値の複数のインスタンスを持つ可能性が高いため、これはまだ理想的ではない場合があります。セット全体のより少ない割合を選択していれば、問題ははるかに少なくなります。「シャッフル」を使用してセットを 2 つに分割し、両方の半分から置換してサンプリングして、2 つのセットがより均等になるようにする方がよい場合がありますが、これにより、最初のセットが再び真のブート ストラッピング セットになることを防ぐことができます。

于 2014-06-25T19:21:41.970 に答える