生成具有R中特定分布的人口数据

时间:2015-06-25 23:18:41

标签: r distribution random-sample population

我在人口中分布了年龄。

例如,您可以想象这样的事情:

年龄<24:15%

年龄25-49岁:40%

年龄50-60:20%

年龄> 60:25%

我没有数据中每个阶层/年龄组的均值和标准差。我正在尝试生成1000个人的样本群,其中生成的数据与上面显示的年龄分布相匹配。

2 个答案:

答案 0 :(得分:2)

让我们以更友好的格式提供这些数据:

(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

我们可以使用示例函数轻松地对表格的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 

当然,如果在您的应用程序中对每个范围内的年龄进行统一抽样是不合适的,那么您需要选择一些其他函数来从桶中获取年龄。

答案 1 :(得分:0)

这并不能完全满足您的要求,但可以帮助您达到门槛。希望对您有帮助!

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)