[看到下面有关make_strata()
函数的 joran 评论后,我在Github上向 rsample 提交了issue。 ]
我正在尝试从数据帧中获取分层的引导程序样本。我希望在每个层中获取单独的引导程序样本,以使生成的引导程序样本在每个层中的观察次数与原始数据帧相同。但是,当使用 rsample 包的bootstraps()
函数时,这并不总是发生。当我运行此代码时:
library(rsample)
mydf <- data.frame(A=1:58, B=rep(1:4, c(6, 6, 23, 23)))
lboots <- bootstraps(mydf, times=3, strata="B")$splits
lbootsdf <- lapply(lboots, as.data.frame)
with(mydf, table(B))
lapply(lbootsdf, function(df) table(df$B))
这些是我得到的结果:
B
1 2 3 4
6 6 23 23
$`1`
1 2 3 4
10 5 20 23
$`2`
1 2 3 4
3 8 24 23
$`3`
1 2 3 4
4 5 24 25
我希望在三个引导程序样本中分别看到6 1、6 2、23 3和23 4。
如何获取所需的分层引导程序样本?
答案 0 :(得分:3)
这不使用rsample::bootstraps
,而是显式构造引导程序样本。
library("dplyr")
splits <- mydf %>%
crossing(id = seq(2)) %>%
group_by(id, B) %>%
sample_n(n(), replace = TRUE) %>%
ungroup()
lboots$splits[[id]]$data
是原始数据的副本。
答案 1 :(得分:0)
当我查看lboots对象的“ B”组件(在没有子集拆分的情况下制作而成)时,我看到采样派系的一致性。
但是,显然不是joran所指出的。由于文档与代码不同步,因此这似乎是早期开发中的软件包。maintainer("rsample")
[1] "Max Kuhn <max@rstudio.com>"
lboots <- bootstraps(mydf, times=3, strata="B")
str(lboots)
table(lboots$splits[['1']]$data$B)
1 2 3 4
6 6 23 23
> table(lboots$splits[['2']]$data$B)
1 2 3 4
6 6 23 23
> table(lboots$splits[['3']]$data$B)
1 2 3 4
6 6 23 23
答案 2 :(得分:0)
由于您没有估计统计信息的抽样分布,因此看起来好像在进行引导抽样。在我看来,您想要做的是使用mydf$A
作为分层的mydf$B
中存储的数据的分层样本(即,而不是简单的随机样本)。
软件包dplyr
具有为此情况专门构建的功能sample_frac
:
library(dplyr)
mydf <- data.frame(A=1:58, B=rep(1:4, c(6, 6, 23, 23)))
data_grouped_by_stratum <- mydf %>% group_by(mydf$B)
data_sampled_by_stratum <- data_grouped_by_stratum %>% sample_frac(size=1, replace=T)
# Now, a bit of cleanup on the resulting tibble object
df_of_data_sampled_by_stratum <- data_sampled_by_stratum %>% dplyr::ungroup %>% dplyr::select(-`mydf$B`) %>% as.data.frame
在对sample_frac
的调用中,size=1
表示每个组中要采样的行的分数为1;即该组行的100%。