如何在R中生成满足特定占比要求的截断随机分布样本
简便实现方案(不限分布)
不用反复调整分布参数凑比例,直接通过分块生成就能精准满足需求,下面是几种简单的实现方式:
方法1:基础R原生实现(精准控制比例)
直接拆分样本量,分别生成对应区间的随机数,完全符合20%样本>50的要求,无需额外包:
n <- 300 p_above <- 0.2 threshold <- 50 lower <- 0 upper <- 150 # 拆分样本数量 n_below <- round(n * (1 - p_above)) n_above <- n - n_below # 生成两部分样本:0-50区间取80%,50-150区间取20% samples_below <- runif(n_below, min = lower, max = threshold) samples_above <- runif(n_above, min = threshold, max = upper) # 合并并打乱顺序 samples <- sample(c(samples_below, samples_above)) # 验证比例 sum(samples > threshold) / n
这种方法完全精准控制比例,取值范围严格在0-150,操作最简单。
方法2:自定义混合分布(可选带形态)
如果需要样本有一定分布形态(比如不是纯均匀),可以用不同的基础分布组合,比如给下方样本用截断正态,上方用均匀:
library(truncnorm) n <- 300 p_above <- 0.2 threshold <- 50 lower <- 0 upper <- 150 n_below <- round(n * (1 - p_above)) n_above <- n - n_below # 下方样本用0-50的截断正态,上方用50-150的均匀 samples_below <- rtruncnorm(n_below, a = lower, b = threshold, m = 25, sd = 10) samples_above <- runif(n_above, min = threshold, max = upper) samples <- sample(c(samples_below, samples_above)) sum(samples > threshold) / n
这种方法保留了部分分布形态,同时依然精准控制比例。
方法3:单次生成的自定义分布
如果想通过一次函数调用实现,可以用sample结合概率权重,配合区间映射:
n <- 300 p_above <- 0.2 threshold <- 50 lower <- 0 upper <- 150 # 先随机选择每个样本属于哪个区间,再生成对应值 group <- sample(c("below", "above"), size = n, replace = TRUE, prob = c(1 - p_above, p_above)) samples <- ifelse(group == "below", runif(n, lower, threshold), runif(n, threshold, upper)) sum(samples > threshold) / n
写法更简洁,同样能精准满足要求。
内容的提问来源于stack exchange,提问作者RamsesII
相关产品推荐
相关产品推荐

