如果您想使用boot
包的多功能性,我发现这篇博客文章很有用(下面的代码受到其启发)
library(dplyr)
library(tidyr)
library(purrr)
library(boot)
set.seed(321)
mtcars %>%
group_by(vs) %>%
nest() %>%
mutate(boot_res = map(data,
~ boot(data = .$mpg,
statistic = function(x, i) mean(x[i]),
R = 1000)),
boot_res_ci = map(boot_res, boot.ci, type = "perc"),
mean = map(boot_res_ci, ~ .$t0),
lower_ci = map(boot_res_ci, ~ .$percent[[4]]),
upper_ci = map(boot_res_ci, ~ .$percent[[5]]),
n = map(data, nrow)) %>%
select(-data, -boot_res, -boot_res_ci) %>%
unnest(cols = c(n, mean, lower_ci, upper_ci)) %>%
ungroup()
本文档由reprex package (v0.3.0)于2020-01-22创建
代码解释:
当使用nest()
时,默认会创建一个名为data
的列表列,其中包含两个数据框,分别是mtcars
按vs
分组后的两个子集(包含2个唯一值0和1)。
然后,使用mutate()
和map()
,通过将boot()
函数从boot
包应用到列表列data
,创建列表列boot_res
。然后,通过将boot.ci()
函数应用于boot_res
列表列,创建boot_res_ci
列表列等等。
使用select()
删除不再需要的列表列,然后展开结果。
很遗憾,这段代码不易阅读,但它可以作为另一个示例。
使用 broom::tidy()
刚刚意识到包broom
有一个方法来处理boot()
输出,如此处所示。这使得代码不那么冗长,输出甚至更加完整,包括统计量(这里是平均值)的偏差和标准误:
library(dplyr)
library(tidyr)
library(purrr)
library(broom)
library(boot)
set.seed(321)
mtcars %>%
group_by(vs) %>%
nest() %>%
mutate(boot_res = map(data,
~ boot(data = .$mpg,
statistic = function(x, i) mean(x[i]),
R = 1000)),
boot_tidy = map(boot_res, tidy, conf.int = TRUE, conf.method = "perc"),
n = map(data, nrow)) %>%
select(-data, -boot_res) %>%
unnest(cols = -vs) %>%
ungroup()
2020年01月22日由reprex package (v0.3.0)创建
data.table
简洁语法
请注意,我使用data.table
包而不是dplyr
包,获得了更加简洁的语法:
library(data.table)
library(magrittr)
library(boot)
library(broom)
mtcars <- mtcars %>% copy %>% setDT
set.seed(321)
mtcars[, c(n = .N,
boot(data = mpg,
statistic = function(x, i) mean(x[i]),
R = 1000) %>%
tidy(conf.int = TRUE, conf.method = "perc")),
by = vs]
本文由reprex包 (v0.3.0)于2020-01-23创建
使用data.table一次处理多个变量
library(data.table)
library(magrittr)
library(boot)
library(broom)
mtcars <- mtcars %>% copy %>% setDT
variables <- c("mpg", "disp")
get_ci <- function(varb, ...){
boot(data = varb,
statistic = function(x, i) mean(x[i]),
R = 1000) %>%
tidy(conf.int = TRUE, ...)
}
set.seed(321)
mtcars[, c(n = .N,
lapply(.SD, get_ci) %>%
rbindlist(idcol = "varb")),
by = vs, .SDcols = variables]
这段内容是由reprex package (v0.3.0)在2020年1月23日创建的。
nobs <- function(x) length(x[!is.na(x)])
并用nobs(procras)
替换n()
。 - sboysel