在tidyverse中,多个组的引导方法:rsample vs broom

9
这个SO问题中,通过使用broom::bootstrap函数并将by_group参数设置为TRUE,多组和子组的引导似乎很容易实现。

我想要的输出是一个嵌套的表格,其中包含n行数据列,每个引导调用生成的引导数据都包含在其中(每个组和子组具有与原始数据相同数量的情况)。

在中,我执行了以下操作:

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

由于 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 = .)
1个回答

1
令人烦恼的是,rsample::bootstraps()strata 参数只接受单个变量,但我们可以使用 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)
  )

抱歉回答晚了,我在旅行中。使用unitestrata参数的想法很好。然而,在你目前的方法中,每个引导迭代都包含相同的数据。如果你将结果分配给res,然后尝试res$data[[1]]res$data[[2]]。它们是相同的数据。在我的方法中,每次迭代是独特的。 - TimTeaFan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接