library(tidyverse)
library(modelr)
ci_boot <- function(df, x, fun = mean, B = 100, alpha = .05) {
x_expr <- enquo(x)
fun_expr <- enquo(fun)
x_name <- paste(quo_name(fun_expr), quo_name(x_expr), sep = "_")
x_name_min <- paste0(x_name, "_min")
x_name_max <- paste0(x_name, "_max")
summ <- df %>% select(!!x_expr) %>% pull() %>% fun()
ci <- df %>%
bootstrap(B) %>%
mutate(b = map_dbl(strap, ~as_tibble(.) %>%
select(!!x_expr) %>%
pull() %>%
fun())) %>%
summarise(!!x_name_min := quantile(b, alpha / 2),
!!x_name_max := quantile(b, 1 - alpha / 2))
tibble(!!x_name := summ) %>% bind_cols(ci)
}
# mean for one group of data
mtcars %>% ci_boot(mpg)
## # A tibble: 1 x 3
## mean_mpg mean_mpg_min mean_mpg_max
## <dbl> <dbl> <dbl>
## 1 20.09062 18.17219 21.83008
# standard deviation for several groups
mtcars %>%
group_by(cyl) %>%
nest() %>%
mutate(temp = map(data, ~ci_boot(., mpg, fun = sd))) %>%
unnest(temp) %>%
select(-data)
## # A tibble: 3 x 4
## cyl sd_mpg sd_mpg_min sd_mpg_max
## <dbl> <dbl> <dbl> <dbl>
## 1 6 1.453567 0.7655649 1.735361
## 2 4 4.509828 3.1092842 5.485399
## 3 8 2.560048 1.5471192 3.260992