R-重新采样数据集,但模拟数据必须遵守原始数据集指定的条件

时间:2018-09-14 14:51:12

标签: r random sample resampling

我有一个列表(“输入”),列表中的每个元素都是一串ID,代表一堆较大的个体的子组:

>head(input)
[[1]]
[1] "A"  "C"

[[2]]
[1] "D"  "E" "A"

[[3]]
[1] "A" "B" "J" "E"

[[4]]
[1] "B"

[[5]]
[1] "C" "F" "A"

[[6]]
[1] "H"

#the population
ids = c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J")

要创建原始数据集,我运行了一个短循环:

input = list()

for (i in 1:1000) {

    id.count = sample(1:4,1)
    id.subgroup = sample(ids, id.count, replace = FALSE)

    input[[i]] = id.subgroup

}

我想随机模拟一个新的数据集,使原始数据集的以下内容保持不变:

(a)每个ID的出现次数(在上面的示例中,“ A”显示4次,“ H”显示1次,等等)

(b)子组大小的分布(在上面的示例中,有一组4,两组3,一组2和一组1)

到目前为止,我浏览了原始列表(输入),标识了每个索引的长度,并从原始数据中随机抽取了许多ID。我使用这些样本来创建新的模拟数据集。

但是,我不只是想对每个元素进行采样而无需替换;我也不想在任何给定的子组中重复这些值或ID。下面的代码不仅在子组中多次以相同的ID结尾,而且也无法在数据集中保持相同的出现次数。

all.ids = unlist(input)

simulated = list()

for (i in 1:length(input)) {

    temp.length = length(input[[i]])
    temp.sample = sample(all.ids, temp.length, FALSE)

    simulated[[i]] = temp.sample

}

也许我不应该使用“采样”功能,因为我真正想做的是伪随机采样(没有两个ID相同)。而且,每次我从“ all.ids”采样时,我都想从“ all.ids”中删除该ID,以便每个ID的总外观保持不变。本质上,我想通过循环在每次迭代中从剩余的ID中随机抽样,但是要确保在每个子组中没有ID出现多次。

成功解决该问题的方法如下:

>head(simulated)
[[1]]
[1] "F"  "A"

[[2]]
[1] "A"  "E" "C"

[[3]]
[1] "D" "B" "H" "E"

[[4]]
[1] "A"

[[5]]
[1] "C" "A" "B"

[[6]]
[1] "J"

0 个答案:

没有答案