R infer 和 group_by - 只生成一个汇总统计信息用于没有任何级别的引导

R infer and group_by - generate only one summary statistic for bootstrapping without any levels

为什么我的 group_by 似乎无法使用推断包?我正在尝试使用引导生成置信区间。

这段代码工作正常:

library(infer)

mtcars %>%
  specify(response = wt) %>%
  generate(reps = 1000, type = 'bootstrap') %>%
  calculate(stat = 'mean') %>%
  get_ci(level = 0.95)
  

lower_ci
<dbl>
upper_ci
<dbl>
2.897742    3.535187    

但是当我将 mtcars 组合成一个长数据框然后尝试使用 group_by 进行推断时,我只得到一组摘要行(没有分组)。

remove(mtcars)

mtcars <- mtcars %>%
  mutate(am = as_factor(am), cyl = as_factor(cyl), gear = as_factor(gear), vs = as_factor(vs),  carb = as_factor(carb))

mtcars_long_numeric <- mtcars %>%
  select_if(is.numeric) %>%
  pivot_longer(everything(), names_to = 'names', values_to = 'values')

mtcars_long_numeric %>%
  group_by(names) %>%
  specify(response = values) %>%
  generate(reps = 1000, type = 'bootstrap') %>%
  calculate(stat = 'mean') %>%
  get_ci(level = 0.95)


lower_ci
<dbl>
upper_ci
<dbl>
56.24676    84.73951    

作为最后的小测试,我通过名称 == wt 过滤我的新数据框并获得与第一个 运行 相同的值。所以看起来除了 group_by 不工作之外没有任何明显的错误?

mtcars_long_numeric_filtered <- mtcars_long_numeric %>%
  filter(names == "wt")

mtcars_long_numeric_filtered %>%
  specify(response = values) %>%
  generate(reps = 1000, type = 'bootstrap') %>%
  calculate(stat = 'mean') %>%
  get_ci(level = 0.95)

lower_ci
<dbl>
upper_ci
<dbl>
2.91292 3.542712            

我很惊讶这给我带来了麻烦——我认为推断是使用这些 dplyr 类型 verbs/syntax 设计的,我认为我这里的例子可能在其他情况下通常有用,虽然也许我我遗漏了一些明显的东西。

我认为 infer 包中的函数无法识别 tibbles 的分组属性。您可以将数据集拆分为较小数据集的列表,应用该函数并合并结果。

library(tidyverse)
library(infer)

mtcars_long_numeric %>%
  split(.$names) %>%
  map_df(~.x %>% 
  specify(response = values) %>%
  generate(reps = 1000, type = 'bootstrap') %>%
  calculate(stat = 'mean') %>%
  get_ci(level = 0.95), .id = 'name')

#  name  lower_ci upper_ci
#  <chr>    <dbl>    <dbl>
#1 disp    190.     274.  
#2 drat      3.42     3.79
#3 hp      123.     172.  
#4 mpg      18.0     22.3 
#5 qsec     17.2     18.5 
#6 wt        2.88     3.57