R - Повторная выборка набора данных, но моделируемые данные должны соответствовать условиям, указанным в исходном наборе данных - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть список («вход»), и каждый элемент в списке представляет собой строку идентификаторов, которые представляют подгруппы большей популяции людей:

>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) количество появлений каждого идентификатора (в приведенном выше примере «A» отображается 4 раза, «H» один раз и т. Д.)

(b) распределение размеров подгрупп (в приведенном выше примере есть одна группа из 4, две группы из 3, одна группа из 2 и две группы из 1)

Пока что я бегу по исходному списку (входным данным), определяю длину каждого индекса и случайным образом выбираю столько идентификаторов из исходных данных. Я использую эти образцы для создания нового имитированного набора данных.

Однако я не хочу просто пробовать каждый элемент без замены; Я также не хочу повторять значения или идентификаторы в любой подгруппе. Приведенный ниже код не только заканчивается одним и тем же идентификатором несколько раз в подгруппе, но и не может поддерживать одинаковое количество появлений в наборе данных.

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

}

Может быть, мне не следует использовать функцию 'sample', поскольку я действительно хочу сделать псевдослучайную выборку (нет двух одинаковых идентификаторов). Но также каждый раз, когда я делаю выборку из «all.ids», я хочу удалить этот идентификатор из «all.ids», чтобы общее количество появлений каждого идентификатора оставалось неизменным. По сути, я хочу случайным образом выбирать из оставшихся идентификаторов каждую итерацию в цикле, но убедившись, что в каждой подгруппе ни один идентификатор не появляется более одного раза.

Удачное решение проблемы выглядело бы так:

>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"
...