我有人口中的年龄分布。
例如,你可以想象这样的事情:
<24 岁:15%
25-49 岁:40%
50-60 岁:20%
年龄 >60:25%
我没有数据中每个阶层/年龄组的平均值和标准差。我正在尝试生成 1000 个人的样本群体,其中生成的数据与上面显示的年龄分布相匹配。
我有人口中的年龄分布。
例如,你可以想象这样的事情:
<24 岁:15%
25-49 岁:40%
50-60 岁:20%
年龄 >60:25%
我没有数据中每个阶层/年龄组的平均值和标准差。我正在尝试生成 1000 个人的样本群体,其中生成的数据与上面显示的年龄分布相匹配。
让我们以更友好的格式放置这些数据:
(dat <- data.frame(min=c(0, 25, 50, 60), max=c(25, 50, 60, 100), prop=c(0.15, 0.40, 0.20, 0.25)))
# min max prop
# 1 0 25 0.15
# 2 25 50 0.40
# 3 50 60 0.20
# 4 60 100 0.25
我们可以使用 sample 函数轻松地对表的 1000 行进行采样:
set.seed(144) # For reproducibility
rows <- sample(nrow(dat), 1000, replace=TRUE, prob=dat$prop)
table(rows)
# rows
# 1 2 3 4
# 139 425 198 238
要对实际年龄进行抽样,您需要定义每行代表的年龄分布。一个简单的将是均匀分布的年龄:
age <- round(dat$min[rows] + runif(1000) * (dat$max[rows] - dat$min[rows]))
table(age)
# age
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
# 2 5 5 3 7 7 9 6 7 6 1 7 7 5 5 6 2 4 6 7 4 11 8 2 3 10 11 13
# 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
# 19 16 20 16 18 21 16 19 14 20 15 13 18 15 24 20 16 16 29 16 11 12 18 17 17 26 27 21
# 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
# 17 26 11 13 20 3 8 9 6 4 3 3 5 4 3 3 5 8 3 13 5 6 4 7 9 9 6 4
# 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
# 5 5 9 9 5 6 8 9 5 4 6 5 9 6 8 4 1
当然,如果在您的应用程序中对每个范围内的年龄进行统一采样不合适,那么您需要选择其他一些函数来从存储桶中获取年龄。
这并不完全符合您的要求,但确实有助于截止。希望能帮助到你!
install.packages("truncnorm")
library(truncnorm)
set.seed(123)
pop <- 1000
ages <- rtruncnorm(n=pop, a=0, b=100, mean=40, sd=25) # ---> You can set your own mean and sd
summary(ages)