ブートストラップ関数を高速化したいのですが、それ自体は完全に正常に機能します。R 2.14 から というパッケージがあると読みましたが、parallel
sb では非常に難しいと思います。実際に実装するには、コンピュータ サイエンスの知識がほとんどありません。多分誰かが助けることができます。
したがって、ここにブートストラップがあります。
n<-1000
boot<-1000
x<-rnorm(n,0,1)
y<-rnorm(n,1+2*x,2)
data<-data.frame(x,y)
boot_b<-numeric()
for(i in 1:boot){
bootstrap_data<-data[sample(nrow(data),nrow(data),replace=T),]
boot_b[i]<-lm(y~x,bootstrap_data)$coef[2]
print(paste('Run',i,sep=" "))
}
目標は、並列処理を使用し、PC の複数のコアを活用することです。WindowsでRを実行しています。ありがとう!
編集(ノアからの返信後)
テストには次の構文を使用できます。
library(foreach)
library(parallel)
library(doParallel)
registerDoParallel(cores=detectCores(all.tests=TRUE))
n<-1000
boot<-1000
x<-rnorm(n,0,1)
y<-rnorm(n,1+2*x,2)
data<-data.frame(x,y)
start1<-Sys.time()
boot_b <- foreach(i=1:boot, .combine=c) %dopar% {
bootstrap_data<-data[sample(nrow(data),nrow(data),replace=T),]
unname(lm(y~x,bootstrap_data)$coef[2])
}
end1<-Sys.time()
boot_b<-numeric()
start2<-Sys.time()
for(i in 1:boot){
bootstrap_data<-data[sample(nrow(data),nrow(data),replace=T),]
boot_b[i]<-lm(y~x,bootstrap_data)$coef[2]
}
end2<-Sys.time()
start1-end1
start2-end2
as.numeric(start1-end1)/as.numeric(start2-end2)
ただし、私のマシンでは、単純な R コードの方が高速です。これは、並列処理の既知の副作用の 1 つですか。つまり、このような「単純なタスク」の時間を追加するプロセスをフォークするオーバーヘッドが発生しますか?
編集: 私のマシンでは、parallel
コードは「単純な」コードよりも約 5 倍長くかかります。boot
この要素は、タスクの複雑さを増しても (または の増加など)変化しないようn
です。コードまたはマシンに問題がある可能性があります (Windows ベースの処理?)。