在 R 中生成具有特定分布的人口数据
Generate population data with specific distribution in R
我有人口中的年龄分布。
例如,你可以想象这样的事情:
24 岁以下:15%
25-49 岁:40%
50-60 岁:20%
60 岁以上:25%
我没有数据中每个 stratum/age 组的均值和标准差。我正在尝试生成 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
我们可以使用示例函数轻松地对 table 的 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)
我有人口中的年龄分布。
例如,你可以想象这样的事情:
24 岁以下:15%
25-49 岁:40%
50-60 岁:20%
60 岁以上:25%
我没有数据中每个 stratum/age 组的均值和标准差。我正在尝试生成 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
我们可以使用示例函数轻松地对 table 的 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)