r语言 - rsample::bootstrap存储数据而不仅仅是行索引吗?



我试图理解为什么rsample::bootstraps函数显然存储了每个引导样本的整个数据集。我期望该函数只存储一次数据集,以及每个样本的bootstrap索引。在下面的示例中,您可以看到每个示例重复的基本结构:

> set.seed(1)
> test <- rsample::bootstraps(mtcars[, 1:3], times = 2)
> str(test)
bootstraps [2 × 2] (S3: bootstraps/rset/tbl_df/tbl/data.frame)
$ splits:List of 2
..$ :List of 4
.. ..$ data  :'data.frame':   32 obs. of  3 variables:
.. .. ..$ mpg : num [1:32] 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
.. .. ..$ cyl : num [1:32] 6 6 4 6 8 6 8 4 4 6 ...
.. .. ..$ disp: num [1:32] 160 160 108 258 360 ...
.. ..$ in_id : int [1:32] 25 4 7 1 2 29 23 11 14 18 ...
.. ..$ out_id: logi NA
.. ..$ id    : tibble [1 × 1] (S3: tbl_df/tbl/data.frame)
.. .. ..$ id: chr "Bootstrap1"
.. ..- attr(*, "class")= chr [1:2] "rsplit" "boot_split"
..$ :List of 4
.. ..$ data  :'data.frame':   32 obs. of  3 variables:
.. .. ..$ mpg : num [1:32] 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
.. .. ..$ cyl : num [1:32] 6 6 4 6 8 6 8 4 4 6 ...
.. .. ..$ disp: num [1:32] 160 160 108 258 360 ...
.. ..$ in_id : int [1:32] 25 12 15 1 20 3 6 10 10 6 ...
.. ..$ out_id: logi NA
.. ..$ id    : tibble [1 × 1] (S3: tbl_df/tbl/data.frame)
.. .. ..$ id: chr "Bootstrap2"
.. ..- attr(*, "class")= chr [1:2] "rsplit" "boot_split"
$ id    : chr [1:2] "Bootstrap1" "Bootstrap2"
- attr(*, "times")= num 2
- attr(*, "apparent")= logi FALSE
- attr(*, "strata")= logi FALSEbootstraps [1 × 2] (S3: 

$data项在额外的样品中出现重复,而变化的样品指标存储在in_id中。明显的代价是对象的大小与数据大小乘以样本数量成比例地增长。来自object.size(test)的单个采样的大小为7800字节。对于200个样本,它是1236824字节。

每个样本的数据不是每次都重复;您可以在rsample包的README中看到一个示例。原始数据未被修改;R不做拷贝

每个样本的一些RAM开销,mtcars有点小,以便能够很好地理解这一点,所以让我们看一个更大的数据集,例如Ames住房数据集(查看README以获得不同的示例):

library(rsample)
library(lobstr)
data(ames, package = "modeldata")
obj_size(ames)
#> 1,042,736 B
set.seed(123)
boots <- bootstraps(ames, times = 50)
obj_size(boots)
#> 1,670,760 B
## what is the object size per resample?
obj_size(boots)/nrow(boots)
#> 33,415.2 B
## what is the relative size of the bootstrap object compared to the original?
as.numeric(obj_size(boots)/obj_size(ames))
#> [1] 1.602285

由reprex包(v1.0.0)创建于2021-02-17

远远小于50!bootstrap对象的内存比原始数据集大不到50倍。

注意,我使用lobstr而不是object.size()来比较大小。原因是object.size()不完全包括对象中所有环境的大小,总体上不太准确。如果您曾经尝试使用object.size()来测量R中对象的RAM,并且对为什么它与您的操作系统所说的不匹配感到困惑,那么这可能就是原因。使用lobstr::obj_size()可以解决这个问题。

相关内容

最新更新