通过群集替换重新取样

时间:2017-05-09 19:46:10

标签: r bootstrapping resampling

我想用数据集中的替换来绘制聚类(由变量id定义),与之前回答的问题相比,我想要选择K次的聚类使每次观察重复K次。也就是说,我正在进行集群引导。

例如,以下示例id=1两次,但在新数据集id=1中仅重复一次s的观察。我希望id=1的所有观察结果都出现两次。

f = data.frame( id=c(1,1,2,2,2,3,3), X = rnorm(7) )
set.seed(451); new.ids = sample( unique(f$id), replace=TRUE )
s = f[ f$id %in% new.ids, ]

2 个答案:

答案 0 :(得分:2)

一个选项是lapply超过每个new.id并将其保存在列表中。然后你可以将它们叠加在一起:

  library(data.table)
  rbindlist(lapply(new.ids, function(x) f[f$id %in% x,]))
#  id           X
#1:  1  1.20118333
#2:  1 -0.01280538
#3:  1  1.20118333
#4:  1 -0.01280538
#5:  3 -0.07302158
#6:  3 -1.26409125

答案 1 :(得分:1)

以防万一,需要有一个与索引号相对应的“ new_id”(即样本顺序)-(我需要有“ new_id”,以便我可以运行混合效果模型而不必具有多个群集被视为一个群集,因为它们共享相同的ID):

library(data.table)
f = data.frame( id=c(1,1,2,2,2,3,3), X = rnorm(7) )
set.seed(451); new.ids = sample( unique(f$id), replace=TRUE )
## ss has unique valued `new_id` for each cluster
ss = rbindlist(mapply(function(x, index) cbind(f[f$id %in% x,], new_id=index),
                      new.ids,
                      seq_along(new.ids),
                      SIMPLIFY=FALSE
))
ss

给出:

> ss
   id          X new_id
1:  1 -0.3491670      1
2:  1  1.3676636      1
3:  1 -0.3491670      2
4:  1  1.3676636      2
5:  3  0.9051575      3
6:  3 -0.5082386      3

请注意X的值不同,因为在rnorm()调用之前未设置set.seed,但是id与@Mike H的答案相同。

此链接对我构建以下答案非常有用:R lapply statement with index [duplicate]