2014-09-11 15 views
10

मुझे बूटस्ट्रैप प्रतिकृतियां बनाने के लिए dplyr का उपयोग करने में रूचि है (बार-बार विश्लेषण जहां डेटा को हर बार प्रतिस्थापन के साथ नमूना दिया जाता है)। हैडली विकहैम here एक कुशल तरीके से चलाया विश्लेषण को दोहराने के लिए कुछ कोड प्रदान करता है: इस समारोह summarise के लिए अच्छी तरह से कामबूटस्ट्रैप प्रतिकृतियां करने के लिए dplyr के डू का उपयोग

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)) 

है, यह do लिए काम नहीं करता जब do एक data.frame शामिल हैं। (अब कल्पना करें कि डेटा.फ्रेम में कुछ उपयोगी है जैसे विश्लेषण के परिणाम जैसे हम बूटस्ट्रैप करना चाहते हैं)।

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)) 

मैं दो do कदम और से एक समूह प्रदर्शन से इस के आसपास काम करने में सक्षम था:

bootstrap(mtcars, 10) %>% do(d=data.frame(x=1:2)) %>% group_by(replicate) %>% do(.$d[[1]]) 

लेकिन इस अतिरिक्त का एक बहुत आवश्यकता होती है लगता है , और कुछ हद तक बेकार, कदम (और एक चेतावनी भी मिलती है, Grouping rowwise data frame strips rowwise nature)। मैं भी पता है कि मैं डेटा दस अनुकरण में पहले कुछ के साथ की तरह

data.frame(boot=1:10) %>% group_by(boot) %>% do(sample_n(mtcars, nrow(mtcars), replace=TRUE)) 

दोहराने सकता हूँ, लेकिन अगर डेटा या बूटस्ट्रैप की संख्या प्रतिकृति बड़ी है इस स्मृति में बेहद अक्षम है।

क्या कोई तरीका है, शायद bootstrap सेटअप फ़ंक्शन को बदलकर, मैं इन प्रतिकृतियों को bootstrap(mtcars, 3) %>% do(data.frame(x = 1:2)) से कर सकता हूं?

उत्तर

6

मुझे लगता है कि यह bootstrap फ़ंक्शन में एक छोटी सी बग है। vars विशेषता labels विशेषता में data.frame में कॉलम नाम से मेल खाना चाहिए। लेकिन समारोह में, vars विशेषता "boot" कहा जाता है, और कॉलम का नाम replicate है। तो, अगर आप इस मामूली परिवर्तन कर:

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 
} 

तो यह के रूप में की उम्मीद काम करता है:

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 
संबंधित मुद्दे