Имитация репрезентативного набора данных в R - PullRequest
1 голос
/ 31 марта 2020

Предположим, у меня есть следующий фрейм данных:

sectoral_data <- data.frame(sector=c("a","b","c","d"),share=c(0.5,0.3,0.1,0.1),avg_wage=c(400,600,800,1000))

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

personal_data <- data.frame(individual=c(1:10),
                          wage=c(rep.int(400,5),rep.int(600,3),rep.int(800,1), rep.int(1000,1)),
                          sector=c(rep("a",5),rep("b",3), rep("c",1), rep("d",1))
                          )

Любая идея эффективного способа сделать это и / или если есть такое встроенная функция?

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

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

Вот пример. Мы говорим, что мы хотим взять 10 человек, и есть 4 класса этих людей с различными вероятностями:

inds <- rmultinom(10, 1, sectoral_data$share)
inds
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    1    1    1    0    0    0    1    0    0     1
[2,]    0    0    0    0    1    0    0    0    1     0
[3,]    0    0    0    0    0    0    0    0    0     0
[4,]    0    0    0    1    0    1    0    1    0     0

Результат - это матрица, где в каждом столбце указано, какой человек был выбран. Чтобы превратить это в фактические индексы (от 1 до 4), мы вызываем which.max() для каждого столбца:

inds <- apply(inds, 2, which.max)
inds
[1] 1 1 1 4 2 4 1 4 2 1

Теперь мы можем использовать этот вектор для выбора лиц из исходных данных:

data.frame(individual=1:10, sectoral_data[inds, c("sector", "avg_wage")])
    individual sector avg_wage
1            1      a      400
1.1          2      a      400
1.2          3      a      400
4            4      d     1000
2            5      b      600
4.1          6      d     1000
1.3          7      a      400
4.2          8      d     1000
2.1          9      b      600
1.4         10      a      400

Это один из способов сделать это, но кажется довольно простым и прямым.

0 голосов
/ 31 марта 2020

Вы можете использовать sample:

n <- 10

with(sectoral_data,
  data.frame(
    individual = seq_len(n),
    wage = sample(avg_wage, size = n, replace = TRUE, prob = share),
    sector = sample(sector, size = n, replace = TRUE, prob = share)
  ))
#   individual wage sector
#1           1  400      c
#2           2  600      c
#3           3  800      a
#4           4  800      b
#5           5  400      b
#6           6  400      a
#7           7  400      b
#8           8  600      c
#9           9  400      a
#10         10  400      c
...