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
为什么我的 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