R-块采样:采样后生成新的唯一ID

  • 本文关键字:采样 唯一 ID 后生 r
  • 更新时间 :
  • 英文 :


我有分组为块或集群的数据。我想用这些数据生成一些引导样本用于模型评估,其中块/簇是通过替换进行采样的。然而,当涉及到分析部分时,这让我有点进退两难,因为我有块/集群标识符的重复。

例如,假设我的数据如下:

set.seed(1)
test <- data.frame(block = rep(1:10, each = 5), matrix(rnorm(150), ncol = 3))

在实践中,我将执行许多引导样本,但出于教学目的,假设我只想要一个新的数据集,其中我从原始数据集中随机选择了替换ID,如上所示:

test <- as.data.table(test)
setkey(test, 'block')
random.block <- sample(unique(test$block), size=10, replace=TRUE)
random.sample <- test[J(random.block), allow.cartesian=TRUE]

这按预期工作:它创建了一个与原始数据集大小相同的新数据集,但其中的块是随机采样的,并进行了替换。

问题是:在原始数据集中,每个块只有5个观测值(在我的真实数据集中,块的观测值数量是可变的,记录在案(。在新的数据集中,虽然每个区块只有5个观测值,但由于我已经进行了替换采样,我现在有多个具有相同ID号的区块。

在新的数据集中,如果我试图运行任何类型的分层或取决于块标识号的分析(例如,像每个块的X个变量的平均值这样简单的分析,或者更复杂的分析,比如对块具有随机影响的混合模型(,它会将块ID的重复视为单个块。因此,它给了我一个15号的块,而不是3个5号的不同块。这可能会对分析产生深远影响,更不用说对任何结果的解释了。

我的问题是:如何在随机采样的数据集中分配新的唯一块ID?这样,在我进行替换采样后,每个区块的每个样本都有一个唯一的标识符,所以在我的最终分析中,它们将被视为单独的区块,而不是单个更大的区块?我可以想出一些特殊的方法来做到这一点(例如,如果每个块都有相同数量的观测值(,但没有简单或可推广的方法。

我认为最好的方法是创建一个带有基于键的索引的data.table。然后您可以根据密钥进行合并:

set.seed(1)
test <- data.frame(block = rep(1:10, each = 5), matrix(rnorm(150), ncol = 3))
test
test <- as.data.table(test)
setkey(test, 'block')
random.block <- sample(unique(test$block), size=10, replace=TRUE)
random.sample.orig <- test[J(random.block), allow.cartesian=TRUE]

因此,不只是使用向量,而是创建一个索引id为的表

rand.tab <- data.table(block=random.block,id=1:length(random.block))

然后与测试合并,并将id称为块(如果需要的话(:

random.sample <- test[J(rand.tab), allow.cartesian=TRUE]
random.sample[,block := id]
random.sample[,id := NULL]

为了证明它与您的原始版本相同:

all(random.sample$X1 == random.sample.orig$X1 & 
random.sample$X2 == random.sample.orig$X2 & 
random.sample$X3 == random.sample.orig$X3)

最新更新