2016-02-12 7 views
0

Простите меня, если это было задано раньше (я считаю, что оно должно быть, но не могло точно найти то, что я ищу).R: рисовать из вектора с помощью пользовательской функции вероятности

Можно ли нарисовать один элемент вектора целых чисел (от 1 до, скажем, 10), используя функцию вероятности, которая задает разные шансы элементов. Если я хочу равное propabilities я использую runif(), чтобы получить число от 1 до 10:

ceiling(runif(1,1,10)) 

Как аналогично образец, например, из экспоненциальное распределение, чтобы получить число от 1 до 10 (такое, что 1 намного больше, чем 10) или логистическая функция вероятности (если я хочу, чтобы сигмоид увеличивал вероятность с 1 по 10).

Единственное «решение», которое я могу придумать, - это сначала нарисовать числа e6 из сигмовидного распределения, а затем масштабировать мин и максимум до 1 и 10, но это выглядит clumpsy.

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)