在 R 中模拟代表性数据集
Simulating a representative dataset in R
假设我有以下数据框:
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))
其中 "share" 是每个部门的就业份额。我想模拟(我想这是正确的词)以下数据框,它代表该经济体中十个人的样本:
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))
)
如果有内置功能,有什么有效的方法可以做到这一点and/or?
您可以使用 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
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
现在我们可以将此向量用于 select 个来自原始数据的个体:
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
这是一种方法,但看起来非常简单直接。
假设我有以下数据框:
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))
其中 "share" 是每个部门的就业份额。我想模拟(我想这是正确的词)以下数据框,它代表该经济体中十个人的样本:
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))
)
如果有内置功能,有什么有效的方法可以做到这一点and/or?
您可以使用 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
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
现在我们可以将此向量用于 select 个来自原始数据的个体:
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
这是一种方法,但看起来非常简单直接。