tidyverse 中多个群体的引导:rsample 与 broom

Tim*_*Fan 9 r resampling tidyverse

这个SO问题broom::bootstrap中,使用指定by_group参数的函数由多个组和子组引导似乎很容易TRUE

我想要的输出是一个包含 n 行的嵌套 tibble,其中数据列包含每个引导程序调用生成的引导数据(每个组和子组具有与原始数据相同数量的案例)。

broom我做了以下事情:

# packages
library(dplyr)
library(purrr)
library(tidyr)
library(tibble)
library(rsample)
library(broom)

# some data to bootstrap
set.seed(123)
data <- tibble(
  group=rep(c('group1','group2','group3','group4'), 25),
  subgroup=rep(c('subgroup1','subgroup2','subgroup3','subgroup4'), 25),
  v1=rnorm(100),
  v2=rnorm(100)
)

# the actual approach using broom::bootstrap
tibble(id = 1:100) %>% 
  mutate(data = map(id, ~ {data %>%
      group_by(group,subgroup) %>% 
      broom::bootstrap(100, by_group=TRUE)}))
Run Code Online (Sandbox Code Playgroud)

由于该broom::bootstrap函数已被弃用,因此我使用所需的输出重建了我的方法rsample::bootstraps。获得我想要的输出似乎要复杂得多。生成分组引导程序时,我是否做错了什么,或者在 tidyverse 中事情变得更加复杂?

data %>%
  dplyr::mutate(group2 = group,
                subgroup2 = subgroup) %>% 
  tidyr::nest(-group2, -subgroup2) %>% 
  dplyr::mutate(boot  = map(data, ~ rsample::bootstraps(., 100))) %>% 
  pull(boot) %>% 
  purrr::map(., "splits") %>% 
  transpose %>% 
  purrr::map(., ~ purrr::map_dfr(., rsample::analysis)) %>% 
  tibble(id = 1:length(.), data = .)
Run Code Online (Sandbox Code Playgroud)

小智 1

令人烦恼的是, 的strata参数rsample::bootstraps()只接受单个变量,但我们可以用tidyr::unite()它来解决这个问题。

我希望这能让你得到你想要的。

data %>%
  unite("final_group", group, subgroup, remove = FALSE) %>%
  rsample::bootstraps(100, strata = final_group) %>%
  transmute(
    id = 1:100,
    data = map(splits, rsample::analysis)
  )
Run Code Online (Sandbox Code Playgroud)