2016-02-12 96 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)