R - 生成在0和1之间求和的随机变量对

时间:2018-05-26 04:51:32

标签: r random

我需要从Uniform distribtuion生成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行。我希望,因为我过滤掉了这么多变量。但是有没有办法在不进行for loop的情况下生成10000个这样的组合?

2 个答案:

答案 0 :(得分:1)

您可以考虑首先生成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

答案 1 :(得分:0)

y1 <- runif(10000, 0, .25)^(1/2)  # Max will be .5
y2 <- runif(10000, 0, .0625)^(1/4) # Max will be .5