[在看到joran_关于make_strata()函数的评论后,我向rsample提交了一个http://github.com/tidymodels/rsample/issues/86。]
我试图从数据帧中提取分层的引导样本。我希望在每个层中分别采集引导样本,这样得到的引导样本在每个层中的观测量与原始数据帧相同。但是,在使用bootstraps() rsample包的函数时,并不总是会发生这种情况。当我运行这段代码时:
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。
怎样才能获得我想要的分层引导样本的类型?
发布于 2019-03-01 22:54:52
这并不使用rsample::bootstraps,而是显式地构造引导示例。
library("dplyr")
splits <- mydf %>%
crossing(id = seq(2)) %>%
group_by(id, B) %>%
sample_n(n(), replace = TRUE) %>%
ungroup()lboots$splits[[id]]$data是原始数据的副本。
发布于 2019-03-01 22:41:33
当我查看lboot对象的"B“组件时,我看到了抽样部分的一致性。
但是:这显然不是乔兰指出的设计。这是一个早期开发的包,因为文档与代码不同步:
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 发布于 2019-03-01 23:21:03
这看起来不像是在做引导样例,因为您没有估计统计数据的抽样分布。在我看来,您试图做的是使用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%。
https://stackoverflow.com/questions/54952860
复制相似问题