R-Как сгенерировать случайную выборку из дискретных случайных величин?

В R я хочу создать случайную выборку дискретной случайной величины: X, где: P(X=a)=P(X=-a)=1/2, Я искал функцию онлайн, но, кажется, нет прямой функции, делающей это.

4 ответа

Решение

Я думаю, что вы хотите сгенерировать выборки случайной величины Бернулли. Случайная величина Бернулли является частным случаем биномиальной случайной величины. Поэтому вы можете попробовать rbinom(N,1,p), Это сгенерирует N образцы, со значением 1 с вероятностью p, значение 0 с вероятностью (1-p), Чтобы получить значения a а также -a ты можешь использовать a*(2*rbinom(N,1,p)-1),

1) Если вы используете sampleэтого достаточно:

sample(c(-a,a),1)

например:

 a <- 10
 sample(c(-a,a),1)
[1] -10

Попробуйте другую пару:

> sample(c(-a,a),1)
[1] -10
> sample(c(-a,a),1)
[1] 10

Работает.

Если вам нужно выбрать более одного элемента, установите replace=TRUE... здесь мы пробуем 12 раз:

 sample(c(-a,a),12,replace=TRUE)

 [1]  10  10 -10  10  10  10 -10 -10  10 -10  10 -10

2) вы можете использовать runif; вот образец размера 9:

a <- 1
ifelse(runif(9)<.5,-a,a)

[1] -1  1 -1  1 -1  1 -1  1  1  

3) вы можете использовать rbinom; вот образец размера 4:

a <- 6
ifelse(rbinom(4,1,.5),-a,a)

[1] -6  6 -6  6

Или это:

> n=10
> X=rep(0,n)
> Y=rbinom(n,1,1/2)
> #Since they the probability is 1/2 for both cases, I assigned "a" when Y=1 and "-a" otherwise.
> X[Y==1]="a"
> X[Y==0]="-a"
> X
 [1] "a"  "-a" "a"  "a"  "a"  "-a" "a"  "-a" "-a" "-a"
> Y
 [1] 1 0 1 1 1 0 1 0 0 0
> 
index <- sample(1,c(1,2),replace=T)
if (index == 1) {xx = a} else {xx = -a}

Каждая процедура генерации распределения начинается с использования $\text{iform}(0,1)$. Поскольку дискретные распределения гораздо проще генерировать с помощью $\text{iform}(0,1)$, люди не заключают в них функции. Тем не менее, вы можете написать свою собственную функцию и просто взять их в следующий раз, когда вы собираетесь их использовать.

Другие вопросы по тегам