基于R语言按概率分配离散死亡数至人口年龄组的技术问询
解决方案
要实现固定总死亡数下符合真实人口死亡规律的整数死亡数分配,可基于多分类抽样方法,以各年龄组的期望死亡数为权重进行随机分配,同时自动排除零人口组(无死亡可能)。具体实现步骤如下:
步骤1:数据预处理与期望死亡数计算
先过滤掉人口数为0的年龄组,同时计算每个有效组的期望死亡数(人口数×死亡率),作为抽样权重:
# 加载原始数据 age <- (0:106) pop <- c(313,330,266,347,289,297,282,300,287,329,345,347,397,390,426,425,493,464,446,428,441,459,406,415,381,410,390,388,390,401,382,385,346,355,401,396,377,424,428,487,424,447,407,328,298,324,315,299,297,259,276,258,277,280,283,263,253,253,269,292,267,247,244,251,227,253,206,213,193,193,165,162,144,173,128,120,102,106,91,85,67,67,54,47,36,39,26,22,24,9,12,9,5,2,1,0,1,1,0,0,0,0,0,0,0,0,0) mortality_p <- c(0.008395, 0.001153, 0.000464, 0.000229, 0.000304, 0.000342, 0.000263, 0.000337, 0.000414, 0.000037, 0.000212, 0.000168, 0.000353, 0.000246, 0.000389, 0.000506, 0.000878, 0.000890, 0.001480, 0.001779, 0.001226, 0.001476, 0.001033, 0.001407, 0.000973, 0.001418, 0.001034, 0.000684, 0.000937, 0.000933, 0.001085, 0.001289, 0.001361, 0.000949, 0.001028, 0.001383, 0.001428, 0.001618, 0.001456, 0.001586, 0.001880, 0.001824, 0.002599, 0.002735, 0.002613, 0.003712, 0.003805, 0.005025, 0.004538, 0.004156, 0.004813, 0.004727, 0.006535, 0.007961, 0.007828, 0.007898, 0.008708, 0.010078, 0.013314, 0.013609, 0.015112, 0.016745, 0.016766, 0.020449, 0.022059, 0.022400, 0.026670, 0.027975, 0.032242, 0.032829, 0.038957, 0.039702, 0.046757, 0.051496, 0.056179, 0.062836, 0.063975, 0.071973, 0.076188, 0.090343, 0.089612, 0.100477, 0.104900, 0.118855, 0.135289, 0.141978, 0.157365, 0.161306, 0.169835, 0.198279, 0.197704, 0.228076, 0.230895, 0.249000, 0.289030, 0.337058, 0.282705, 0.335130, 0.322072,0.392166, 0.327260, 0.270787, 0.527633, 0.264859, 0.358820, 0.981684, 1.000000) data <- data.frame(age, pop, mortality_p) # 筛选有人口的年龄组,计算期望死亡数 valid_groups <- subset(data, pop > 0) valid_groups$expected_deaths <- valid_groups$pop * valid_groups$mortality_p
步骤2:多分类抽样分配死亡数
使用rmultinom()函数从多分类分布中抽样,确保总死亡数严格为259,且分配概率与期望死亡数成正比:
# 设置随机种子,保证结果可复现 set.seed(123) # 分配259个死亡数到有效年龄组 allocated_deaths <- rmultinom(n = 1, size = 259, prob = valid_groups$expected_deaths)[,1] # 将分配结果绑定到有效组数据框 valid_groups$deaths <- allocated_deaths
步骤3:合并回原数据,补全零人口组结果
将分配结果与原始数据合并,零人口组的死亡数直接设为0:
# 合并数据,保留所有原始年龄组 final_result <- merge(data, valid_groups[, c("age", "deaths")], by = "age", all.x = TRUE) # 零人口组死亡数填充为0 final_result$deaths[is.na(final_result$deaths)] <- 0
结果验证
检查总死亡数是否符合要求,以及零人口组是否无死亡:
# 验证总死亡数 sum(final_result$deaths) # 验证零人口组死亡数总和 sum(final_result$deaths[final_result$pop == 0])
方法优势
- 严格保证总死亡数为指定值,避免四舍五入的累积误差;
- 以期望死亡数为权重,自然贴合真实死亡分布:老年组分配到的死亡数更多,低龄组仅偶尔出现死亡;
- 随机抽样特性模拟了真实死亡的随机性,比确定性分配更符合现实场景。
内容的提问来源于stack exchange,提问作者KjetilH
相关产品推荐
相关产品推荐

