EDi hat geschrieben: ↑Do Mai 18, 2017 11:56 pm
Wieso t0 rausschreiben (ist doch immer gleich
).
Ich verstehe noch nicht ganz was gewollt ist... So ergibt das keinen Sinn für mich.
deshalb hielt ich auch meine Änderung am Algorithmus (
set.seed() nach außen) für angebracht.
Hier mal meine Interpretation und einpaar vorschläge (1) boot() kann man auch durch sample() ersetzen (2) mean ist langsam (3) Rcpp ist auch schnell (macht aber bei mean keinen unterschied). danach kann man immernoch versuchen zu parallelisieren.
Auch ich mache sonst immer Bootstrapping mit eigener Programmierung entsprechend Deiner Variante (1)
... deshalb habe ich auch keine Ahnung, was
boot() so alles anstellt.
Die Geschwindigkeitszuwächse schon bei Variante (1) sind beachtlich (statt in 56 Tagen ist die gleiche Arbeit jetzt in 2,5 Stunden erledigt). Die Ergebnisse des Profiling könnten schon den passenden Hinweis enthalten:
boot() betreibt (wenn ich das richtig verstehe) einen riesigen Aufwand, um das Parallelisieren zu organisieren und zu verwalten (zumindest riesig im Vergleich zu der dann anfallenden winzigen Aufgabe) - das mag in anderen Situatione völlig anders sein. Ob die Ergebnisse mit boot() besser, wenn man von der Parallelisierung keinen Gebrauch macht? Kann man boot() dazu bringen, keine zusätzlichen statistischen Kennzahlen zu berechnen, wenn man nur den Wert $t0 haben möchte?
Gruß, Jörg
p.s.: Danke für die Demonstration von
Rcpp: sowas habe ich bisher auch noch nicht gemacht!
Nachtrag:
Code: Alles auswählen
library("microbenchmark")
library(boot)
# originial ---------------------------------------------------------------
# Bootstrap Funktion
# Mittelwert bootstrappen
bt.fun <- function(x, d){
dat <- x[d]
mean(dat)
}
ori = function() {
# Matrix in der die Ergebnisse gespeichert werden
m <- matrix(rep(0,5*5), ncol = 5)
# verschachtelter For-Loop
for(i in 1:5){
for(j in 1:5){
set.seed(1)
# 100 Bootstrap-Samples, Parallel-Computing wird benutzt mit 4 Kernen
b <- boot::boot(mtcars$mpg, bt.fun, R = 100, parallel = "snow", ncpus = 4)
m[i,j] <- b$t0
}
}
}
# jogo --------------------------------------------------------------------
# Bootstrap Funktion
# Mittelwert bootstrappen
my.bt.fun <- function(x, d) mean(x[d])
jogo <- function() {
set.seed(1)
# 100 Bootstrap-Samples, Parallel-Computing wird benutzt mit 4 Kernen
m <- matrix(replicate(n=25, boot::boot(mtcars$mpg, my.bt.fun, R = 100, parallel = "snow", ncpus = 4)$t0), 5,5)
}
jogo2 <- function() {
set.seed(1)
# 100 Bootstrap-Samples, no Parallel
m <- matrix(replicate(n=25, boot::boot(mtcars$mpg, my.bt.fun, R = 100, parallel="no")$t0), 5,5)
}
jogo3 <- function() {
set.seed(1)
# 100 Bootstrap-Samples, no Parallel
m <- matrix(replicate(n=25, boot::boot(mtcars$mpg, my.bt.fun, R = 100, parallel="no", ncpus = 4)$t0), 5,5)
}
# edi ---------------------------------------------------------------------
# generate bootstrap samples
gen_samples <- function() sample(mtcars$mpg, replace = T)
# calc means of 100 bootstrap samples
boot_means <- function() {
replicate(100, mean(gen_samples()))
}
boot_means()
# repeat
myboot <- function() {
replicate(25, mean(boot_means()))
}
set.seed(123)
myboot()
# edi2 --------------------------------------------------------------------
gen_samples <- function() sample(mtcars$mpg, replace = T)
# calc means of 100 bootstrap samples
boot_means2 <- function() {
replicate(100, {x <- gen_samples(); sum(x) / length(x)})
}
# repeat
myboot2 <- function() {
replicate(25, {x <- boot_means2(); sum(x) / length(x)})
}
set.seed(123)
myboot2()
microbenchmark(times=1, unit="relative", jogo=jogo(), jogo2=jogo2(), jogo3=jogo3(), edi = myboot(), edi2 = myboot2())
und die Ergebnisse:
Code: Alles auswählen
Unit: relative
expr min lq mean median uq max neval
jogo 613.684526 613.684526 613.684526 613.684526 613.684526 613.684526 1
jogo2 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1
jogo3 1.132280 1.132280 1.132280 1.132280 1.132280 1.132280 1
edi 1.562846 1.562846 1.562846 1.562846 1.562846 1.562846 1
edi2 1.526096 1.526096 1.526096 1.526096 1.526096 1.526096 1