我有分组为块或群集的数据。我想使用此数据生成许多引导程序样本,以进行模型评估,其中对块/集群进行替换采样。但是,在分析部分,这让我陷入了两难境地,因为我重复了块/集群标识符。
例如,说我的数据如下:
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的重复视为单一区块。因此,它不是给我3个大小为5的块,而是给我一个大小为15的块。这会对分析产生深远的影响,更不用说对任何结果的解释了。
我有一个问题:如何在随机采样的数据集中分配一个 new 唯一块ID?这样,在我进行替换采样后,每个块的每个样本都具有唯一的标识符,以便在我的最终分析中将它们视为单独的块,而不是单个较大的块?我可以想到执行此操作的临时方法(例如,如果每个块具有相同数量的观察值),但没有简单或可概括的方法。
答案 0 :(得分:1)
我认为最好的方法是使用基于键的索引创建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)