为什么不使用rsample引导程序来维护层样本大小?

时间:2019-03-01 21:59:21

标签: r

[看到下面有关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。

如何获取所需的分层引导程序样本?

3 个答案:

答案 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%。