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


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

4 14

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{uniform}(0,1)$. Поскольку дискретные распределения гораздо легче генерировать с помощью $\text{uniform} (0,1)$, люди не оборачивают функцию для них. Однако вы можете написать свою собственную функцию и просто взять их в следующий раз, когда вы собираетесь их использовать.