在R中模拟代表性数据集

问题描述 投票:1回答:2

假设我有以下数据框:

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))
                          )

关于有效方法和/或是否有内置功能的任何想法?

r dataframe random simulate
2个回答
0
投票

您可以使用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

0
投票

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

这是一种实现方法,但是看起来非常简单直接。

© www.soinside.com 2019 - 2024. All rights reserved.