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