R - Генерация пар случайных величин, которые суммируют от 0 до 1 - PullRequest
0 голосов
/ 26 мая 2018

Мне нужно сгенерировать 2 случайные величины из равномерного распределения.Но мне нужно сделать это так, чтобы var1+var2<=1 и мне нужно было сделать 10000 из них.
Это то, что я сделал до сих пор:

library(dplyr)
alpha <- 2
beta <- 4          
y1 <- runif(10000,0,1)^(1/alpha)
y2 <- runif(10000,0,1)^(1/beta)

 data.frame(y1,y2 ) %>% 
 filter(y1+y2<=1) %>% # check that y1+y1 <=1
NROW()

Когда я запускаю это, явернуть только 656 рядов.Я ожидаю, что, учитывая, что я отфильтровал так много переменных.Но есть ли способ сгенерировать 10000 таких комбинаций без выполнения for loop?

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Вы можете думать о первом генерации y1.Теперь для каждого y1 создайте y2, используя mapply таким образом, чтобы выполнялось условие y1+y2<=1.

Пример для генерации 10 таких значений:

set.seed(1)
y1 <- runif(10,0,1)^(1/alpha)
df <- data.frame(y1) 

# max argument for for runif for each value y1 to generate value for y2
df$y2 <- mapply(function(x)runif(1, 0, (1-x)^beta)^(1/beta), df$y1)

# Just for validation purpose
df$sum <- rowSums(df)

#           y1         y2       sum
# 1  0.5152753 0.32654913 0.8418245
# 2  0.6100196 0.25279232 0.8628119
# 3  0.7568708 0.22135023 0.9782210
# 4  0.9529994 0.03700120 0.9900006
# 5  0.4490901 0.51603705 0.9651272
# 6  0.9478342 0.04381548 0.9916497
# 7  0.9719441 0.02582249 0.9977666
# 8  0.8128947 0.18672554 0.9996202
# 9  0.7931671 0.16239609 0.9555632
# 10 0.2485684 0.70559725 0.9541657
0 голосов
/ 26 мая 2018
y1 <- runif(10000, 0, .25)^(1/2)  # Max will be .5
y2 <- runif(10000, 0, .0625)^(1/4) # Max will be .5
...