使用R语言生成和为1的三个比例样本的优化方法咨询
解决方法
你的核心问题是单独采样前两个比例时,可能出现两者之和超过1,导致第三个比例为负,同时还得保证三个比例都落在各自的置信区间内。这里给你两个实用的改进方案:
方案1:接受-拒绝采样法
思路很直接:每次生成前两个比例后,检查两个条件——pro1_prop + pro2_prop ≤ 1,且计算出的pro3_prop落在它的置信区间[0.06, 0.15]里。如果不满足,就重新生成,直到符合要求为止。
代码示例:
# 定义一个函数来生成符合要求的比例 generate_proportions <- function() { repeat { pro1_prop <- rpert(1, 0.4, 0.478, 0.56) pro2_prop <- rpert(1, 0.34, 0.415, 0.49) pro3_prop <- 1 - (pro1_prop + pro2_prop) # 检查所有条件:三个比例都在各自的置信区间内,且和为1 if (pro1_prop >= 0.4 & pro1_prop <= 0.56 & pro2_prop >= 0.34 & pro2_prop <= 0.49 & pro3_prop >= 0.06 & pro3_prop <= 0.15) { return(c(pro1 = pro1_prop, pro2 = pro2_prop, pro3 = pro3_prop)) } } } # 调用函数生成一组比例 sample_props <- generate_proportions() sample_props
这种方法严格保证每个比例都在指定区间内,且和为1,缺点是如果三个区间的约束比较紧,可能需要多次重试,但你的案例里区间设计合理,重试次数不会太多。
方案2:带约束的顺序采样法
这个方法更高效,不用反复重试。先采样第一个比例pro1_prop,然后根据pro1_prop和第三个比例的区间约束,动态调整第二个比例pro2_prop的采样范围:
- 因为
pro3_prop = 1 - pro1_prop - pro2_prop必须在[0.06, 0.15],所以可以推导出pro2_prop的范围是[1 - pro1_prop - 0.15, 1 - pro1_prop - 0.06] - 再把这个范围和
pro2_prop自身的置信区间[0.34, 0.49]取交集,作为pro2_prop的最终采样范围 - 如果交集有效(下限≤上限),就用这个范围做PERT采样;如果无效,说明当前
pro1_prop不符合约束,重新采样pro1_prop
代码示例:
generate_proportions_constrained <- function() { repeat { pro1_prop <- rpert(1, 0.4, 0.478, 0.56) # 计算pro2的约束范围(由pro3的区间推导) pro2_min_constraint <- 1 - pro1_prop - 0.15 pro2_max_constraint <- 1 - pro1_prop - 0.06 # 结合pro2自身的置信区间,取交集 pro2_low <- max(0.34, pro2_min_constraint) pro2_high <- min(0.49, pro2_max_constraint) # 检查交集是否有效 if (pro2_low <= pro2_high) { pro2_prop <- rpert(1, pro2_low, 0.415, pro2_high) pro3_prop <- 1 - pro1_prop - pro2_prop return(c(pro1 = pro1_prop, pro2 = pro2_prop, pro3 = pro3_prop)) } } } # 调用函数 sample_props_constrained <- generate_proportions_constrained() sample_props_constrained
这个方法减少了无效采样的次数,效率更高,同时同样保证所有比例都在各自的置信区间内且和为1。
内容的提问来源于stack exchange,提问作者pcompston
相关产品推荐
相关产品推荐

