Ben, bootstrap çoğaltmalarını oluşturmak için dplyr kullanmakla ilgileniyorum (verilerin her defasında değiştirilerek ilk kez örneklendiği yerlerde yinelenen analizler). Hadley Wickham here etkili bir şekilde bootstrapped analizlerin yenilenmesi konusunda bazı kodlar sağlamaktadır: Bu fonksiyon summarise
için iyi çalışırDplyr's kullanarak bootstrap çoğaltmalarını gerçekleştirmek için yapın
bootstrap <- function(df, m) {
n <- nrow(df)
attr(df, "indices") <- replicate(m, sample(n, replace = TRUE),
simplify = FALSE)
attr(df, "drop") <- TRUE
attr(df, "group_sizes") <- rep(n, m)
attr(df, "biggest_group_size") <- n
attr(df, "labels") <- data.frame(replicate = 1:m)
attr(df, "vars") <- list(quote(boot)) # list(substitute(bootstrap(m)))
class(df) <- c("grouped_df", "tbl_df", "tbl", "data.frame")
df
}
library(dplyr)
mboot <- bootstrap(mtcars, 10)
# Works
mboot %.% summarise(mean(cyl))
iken do
bir data.frame içerdiğinde, bu do
için çalışmaz. (Şu an için data.frame'in bootstrap yapmak istediğimiz analiz sonuçları gibi yararlı bir şeyler içerdiğini düşünün). traceback ile
bootstrap(mtcars, 3) %>% do(data.frame(x=1:2))
# Error: index out of bounds
11: stop(list(message = "index out of bounds", call = NULL, cppstack = NULL))
10: .Call("dplyr_grouped_df_impl", PACKAGE = "dplyr", data, symbols,
drop)
9: grouped_df_impl(data, unname(vars), drop)
8: grouped_df(cbind_list(labels, out), groups)
7: label_output_dataframe(labels, out, groups(.data))
6: do.grouped_df(`bootstrap(mtcars, 3)`, data.frame(x = 1:2))
5: do(`bootstrap(mtcars, 3)`, data.frame(x = 1:2))
4: eval(expr, envir, enclos)
3: eval(e, env)
2: withVisible(eval(e, env))
1: bootstrap(mtcars, 3) %>% do(data.frame(x = 1:2))
İki do
adımı ve bir grup tarafından gerçekleştirerek bu geçici bir çözüm başardı:
bootstrap(mtcars, 10) %>% do(d=data.frame(x=1:2)) %>% group_by(replicate) %>% do(.$d[[1]])
ama bu ekstra bir sürü gerektirecek gibi görünüyor ve biraz hantal, adımları (ve ayrıca bir uyarı alır, Grouping rowwise data frame strips rowwise nature
). Ben de
data.frame(boot=1:10) %>% group_by(boot) %>% do(sample_n(mtcars, nrow(mtcars), replace=TRUE))
gibi bir şeyle ilk on tekrarlamalı veri çoğaltmak olabilir farkındayım ancak veri veya bootstrap sayısı çoğaltır büyükse bu bellekte son derece verimsizdir.
bootstrap
kurulum işlevini değiştirerek, bu kopyaları bootstrap(mtcars, 3) %>% do(data.frame(x = 1:2))
ile uygulayabileceğim bir yol var mı?