【问题标题】:Fastest Way to build this ifelse loop in R在 R 中构建这个 ifelse 循环的最快方法
【发布时间】:2014-07-07 14:15:47
【问题描述】:

我想做的是:

  1. 生成一个介于 0 和 1 之间的随机数

    rand_number <- runif(1,0,1)
    
  2. 根据生成的随机数,我将值 1、2、3、4 或 5 归因于变量 bet_choice

    bet_choice <- ifelse(rand_number<0.1,1,
                     ifelse(rand_number>0.1 & rand_number<=0.4,2,
                            ifelse(rand_number>0.4 & rand_number<=0.7,3,
                                   ifelse(rand_number>0.7 & rand_number<=0.9,4,5))))
    

我重复这个模拟 1000 次,我觉得使用 ifelse 不是实现这个目标的最佳方式。有没有办法避免ifelse循环,提高这部分代码的性能?

如果有人对完整代码感兴趣,我有我想要做的事情的完整代码 (https://quant.stackexchange.com/questions/12868/kelly-capital-growth-investment-strategy-example-in-r)。

【问题讨论】:

  • 我想cut 可能是你的朋友。
  • ...这当然假设您切换到使用runif(1000,0,1) 预先创建所有随机数,而不是一次一个,这当然会非常慢。

标签: r performance loops


【解决方案1】:

我赞成 josilber 的回答,因为我认为它非常好。但我只想补充一点,你实际上是从一个特定的离散分布中抽样的,在这个分布中你使用统一随机变量来选择具有正确概率的随机数。您可以使用sample 获得与以下相同的结果:

s <- sample(1:5, size = 1000, replace = TRUE, prob = c(0.1, 0.3, 0.3, 0.2, 0.1))

您可以自己测试,但我相信这应该会更快。

edit我现在已经用以下方法对其进行了测试:

library(microbenchmark)
s1 <- function() sample(1:5, size = 1000, replace = TRUE, prob = c(.1,.3,.3,.2,.1))
s2 <- function() sample.int(5, size = 1000, replace = TRUE, prob = c(.1,.3,.3,.2,.1))
microbenchmark(s1(), s2())
#Unit: microseconds
# expr    min     lq median     uq    max neval
# s1() 39.389 40.536 41.300 41.683 76.483   100
# s2() 29.828 30.594 31.358 31.741 43.213   100

似乎sample.int 的速度甚至比 josilber 的 version2 快 16.9 倍。

【讨论】:

  • 我将如何继续创建一个矩阵,其中列是模拟的数量,每个模拟生成 700 个随机数?我试过simu_matrix &lt;- matrix(sample.int(5, size = 700, replace = TRUE, prob = c(.1,.3,.3,.2,.1)),nrow=700,ncol=1000) 但这会为每一列生成相同的 700 个随机数。
猜你喜欢
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
  • 2017-05-09
  • 2021-03-29
  • 2018-12-25
  • 1970-01-01
  • 2021-01-14
  • 2012-07-29
相关资源
最近更新 更多