【问题标题】:what's wrong with runif (or maybe me) in R?R中的runif(或者我)有什么问题?
【发布时间】:2019-05-01 05:56:53
【问题描述】:

我正在尝试从同样依赖于随机变量的均匀分布中生成一个随机变量。

理想情况下,我希望z2 也是一个随机变量。

例如,

set.seed(123)
#generate first random variable z1
z1 <- runif(10,0,1)
#generate secondrandom variable z2
z2 <- ifelse(z1>= 0.7, runif(1,0.6,0.9), runif(1,0.2,0.5))
df <- data.frame(z1,z2)

但如果您查看z2,它只包含两个级别。

          z1        z2
1  0.2875775 0.3360002
2  0.7883051 0.8870500
3  0.4089769 0.3360002
4  0.8830174 0.8870500
5  0.9404673 0.8870500
6  0.0455565 0.3360002
7  0.5281055 0.3360002
8  0.8924190 0.8870500
9  0.5514350 0.3360002
10 0.4566147 0.3360002

我们可以生成 1000 个数字并总结结果。

set.seed(123)
#generate first random variable z1
z1 <- runif(1000,0,1)
#generate secondrandom variable z2
z2 <- ifelse(z1>= 0.7, runif(1,0.6,0.9), runif(1,0.2,0.5))

table(df$z2)

0.352099318057299 0.655542095610872 
              707               293

【问题讨论】:

  • 就是循环规则:runif(1,0.6,0.9)在构造ifelse()中扩展为一个与z1&gt;=0.7长度相同的向量。

标签: r random


【解决方案1】:

您使用矢量化方法计算z2。因此,当您使用runif(1 ,0.6,0.9) 时,您实际上只拉了一个号码。但是,如果您执行runif(length(z1) ,0.6,0.9),您将拉长 z1 的长度。

set.seed(123)
#generate first random variable z1
z1 <- runif(1000,0,1)
#generate second random variable z2
z2 <- ifelse(z1 >= 0.7, runif(length(z1) ,0.6,0.9), runif(length(z1),0.2,0.5))

df <- data.frame(z1,z2)
table(df$z2)

【讨论】:

  • 通过简要说明您为什么需要这样做才能正确生成z2,可以改进此答案。
  • 谢谢,@DJV!这似乎有效......为什么?
  • @Marius 和 user9292,对不起,我花了一些时间来写它。请看我的编辑:)
【解决方案2】:

您的 runif(1,0.6,0.9)runif(1,0.2,0.5) 函数只运行了一次。每次您将 z1 与 0.7 进行比较时,它们都不会运行。因此,z2 最终只有两个值。

您可以考虑使用replicate 再次运行runif 函数。更新:或length(z1) 喜欢@DJV 提议。

【讨论】:

  • 即使我去掉了种子。它仍然是两个级别——但每次运行都会生成两个新级别。
猜你喜欢
  • 1970-01-01
  • 2020-02-02
  • 1970-01-01
  • 2020-10-17
  • 2010-10-18
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
  • 2019-03-05
相关资源
最近更新 更多