0

重複の可能性:
大規模なデータ セットをブートストラップする

複数の列変数と行変数を含む大規模な双方向データ セットをブートストラップしたいと考えています。行変数と列変数の両方を保持する必要があります。結果は、各行変数のすべての列変数のブートストラップを含むリストになります。質問に答えるために必要なコードを提供していますが、エレガントではないと思います。より良い、より速いコードをいただければ幸いです。以下は、双方向データセットの単純化された再作成です。

rm(list=ls())

data <- 1:72

二元行列データを作成します。

charDataDiff <- matrix(data, nrow=9,ncol=8)
varNames <- c("A", "B", "C","A", "B", "C","A", "B", "C")

文字列を charDataDiff マトリックスに追加します。

charDataDiff <- cbind(varNames ,data.frame(charDataDiff))

列名を追加します。

colnames(charDataDiff) <- c("patchId","s380","s390","s400","s410","s420","s430","s440","s450")

行変数「patchId」を基準にデータを区切ります。これにより、変数ごとに 1 つずつ、合計 3 つのリストが作成されます。

idColor <-  c("A", "B", "C")

(patchSpectrum <- lapply(idColor, function(idColor) charDataDiff[charDataDiff$patchId==idColor,]))

patchSpectrum をサンプリングする関数 sampleBoot を作成しました

sampleBoot <-  function(nbootstrap=2, patch=3){
    return(lapply(1:nbootstrap, function(i)
             {patchSpectrum[[patch]][sample(1:nrow(patchSpectrum[[patch]]),replace=TRUE),]}))}

リスト「k」が私の質問に答えます。ただし、大規模なデータ セットと大規模なブートストラップの場合、私のコードは遅いと思います。3 つの行変数に対して 10 回の反復のみをブートストラップしています。より速く、より洗練されたコードが評価されます。

numBoots <- 10
for (i in 1: numBoots)
        k <- lapply(1:3, function(n)
                    do.call(rbind, lapply(sampleBoot(i, n), function(x) apply(x[-1], 2, median))))
k
4

1 に答える 1

4

私が提供できるのは、コードをきれいに書き直したものです。

  1. 長い部分を適切な名前の関数に分割したので、読みやすくなりました。
  2. @KenWilliamsが前の質問で提案したようにvarNames、代わりにデータを分割するために使用される列を取り除きました。by
  3. replicateの代わりに を利用しましたlapply
  4. forコメントで指摘した不要なループを取り除きました。

その方が高速に実行されるはずです。そうでない場合は、プロファイリングを試すことをお勧めします。


charDataDiff <- matrix(1:72, nrow = 9, ncol = 8)
colnames(charDataDiff) <- c("s380", "s390", "s400", "s410",
                            "s420", "s430", "s440", "s450")

varNames      <- c("A", "B", "C", "A", "B", "C", "A", "B", "C")
patchSpectrum <- by(charDataDiff, varNames, data.frame)

sampleOne   <- function(x) x[sample(seq_len(nrow(x)), replace = TRUE), ]
sampleBoot  <- function(x, n) replicate(n, sampleOne(x), simplify = FALSE)
applyMedian <- function(l) do.call(rbind, lapply(l, apply, 2, median))

k <- lapply(lapply(patchSpectrum, sampleBoot, n = 10), applyMedian)
于 2012-10-28T15:08:09.233 に答える