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