我需要从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个这样的组合?
答案 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