2

我有人口中的年龄分布。

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

<24 岁:15%

25-49 岁:40%

50-60 岁:20%

年龄 >60:25%

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

4

2 回答 2

3

让我们以更友好的格式放置这些数据:

(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 

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

于 2015-06-25T23:34:51.613 回答
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)
于 2018-07-16T08:54:57.920 回答