2014-09-11 26 views
10

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ı?

cevap

6

bootstrap işlevinde küçük bir hata olduğunu düşünüyorum. vars özniteliği, labels özniteliğinde data.frame sütun adıyla eşleşmelidir. Ancak, işlevde vars özniteliği "boot" olarak adlandırılır ve sütun adı replicate'dur. Bu küçük bir değişiklik yapmak, yani: Sonra

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(replicate)) # Change 
# attr(df, "vars") <- list(quote(boot)) # list(substitute(bootstrap(m))) 
    class(df) <- c("grouped_df", "tbl_df", "tbl", "data.frame") 

    df 
} 

o kadar beklenen işleri:

bootstrap(mtcars, 3) %>% do(data.frame(x=1:2)) 
# Source: local data frame [6 x 2] 
# Groups: replicate 

# replicate x 
# 1   1 1 
# 2   1 2 
# 3   2 1 
# 4   2 2 
# 5   3 1 
# 6   3 2 
İlgili konular