之前有人问过这个问题,请原谅我(我觉得一定有,但找不到我正在寻找的东西)。
我可以使用指定元素不同机会的概率函数绘制整数向量(从 1 到 10)的一个元素。如果我想要相等的概率,我使用 runif()
来得到一个介于 1 和 10 之间的数字:
ceiling(runif(1,1,10))
例如,我如何从指数分布中同样地采样以获得 1 到 10 之间的数字(这样 1 比 10 的可能性大得多)或逻辑概率函数(如果我想要一个 sigmoid 将概率从 1 增加到 10)。
我能想到的唯一"解决方案"是首先从 sigmoid 分布中绘制 e6 数字,然后将最小值和最大值缩放到 1 和 10 - 但这看起来很团块。
更新:
这个尴尬的解决方案(我觉得它不是很"正确")会像这样
#Draw enough from a distribution, here exponential
x <- rexp(1e3)
#Scale probs to e.g. 1-10
scaler <- function(vector, min, max){
(((vector - min(vector)) * (max - min))/(max(vector) - min(vector))) + min
}
x_scale <- scaler(x,1,10)
#And sample once (and round it)
round(sample(x_scale,1))
周围没有更好的解决方案吗?
sample()
就是您正在寻找的,正如@HubertL评论中提到的。您可以指定递增函数(例如 logit()
),并将要从v
采样的向量作为输入传递。然后,您可以将该函数的输出用作概率向量p
。请参阅下面的代码。
logit <- function(x) {
return(exp(x)/(exp(x)+1))
}
v <- c(seq(1,10,1))
p <- logit(seq(1,10,1))
sample(v, 1, prob = p, replace = TRUE)