2016-02-12 94 views
0

请原谅我,如果之前有过这个问题(我觉得它必须有,但是找不到我正在寻找的东西)。R:使用自定义概率函数从矢量绘制

我可以使用指定元素不同概率的概率函数绘制一个整数(从1到10)的矢量元素。如果我想等我出现概率使用runif()获得1到10之间的数字:

ceiling(runif(1,1,10)) 

如何从类似例如采样指数分布得到1到10之间的一个数(例如1比10更可能)或逻辑概率函数(如果我想从1到10的S形增加概率)。

我能想出的唯一“解决方案”是首先从sigmoid分布中绘制e6数字,然后将最小值和最大值缩放到1和10--但这看起来很团块。

UPDATE:

这种尴尬的解决方案(我不觉得很 “正确”)会是这样的

#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)) 

不是有更好的解决方案身边?

+0

我认为你需要看'sample()'。你的代码等同于'sample(1:10,1)',你可以用'prob ='参数指定概率 – HubertL

+0

是的,但是如何指定逻辑概率呢? – user3375672

回答

0

我相信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)