R:使用自定义概率函数从向量中绘制


如果

之前有人问过这个问题,请原谅我(我觉得一定有,但找不到我正在寻找的东西)。

我可以使用指定元素不同机会的概率函数绘制整数向量(从 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)

最新更新