Самый быстрый способ построить этот цикл ifelse в R

#r #performance #loops

#r #Производительность #циклы

Вопрос:

То, что я пытаюсь сделать, это :

  1. Сгенерируйте случайное число от 0 до 1

     rand_number <- runif(1,0,1)
      
  2. В зависимости от сгенерированного числа randon я присваиваю переменной значение 1,2,3,4 или 5 bet_choice

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

Я повторяю это моделирование 1000 раз и чувствую, что использование ifelse не является оптимальным способом достижения этой цели. Есть ли способ избежать цикла ifelse и повысить производительность этой части кода?

У меня есть полный код того, что я пытаюсь сделать в ( https://quant.stackexchange.com/questions/12868/kelly-capital-growth-investment-strategy-example-in-r) на случай, если кого-то заинтересует полный код.

Комментарии:

1. Я думаю, cut что могу быть вашим другом здесь.

2. …что, конечно, предполагает, что вы переключаетесь на создание всех случайных чисел заранее с runif(1000,0,1) , а не по одному за раз, что, конечно, будет ужасно медленно.

Ответ №1:

Я поддержал ответы джозильбера, потому что я думаю, что это очень хорошо. Но я бы просто добавил, что вы действительно производите выборку из определенного дискретного распределения, где вы используете однородную случайную величину для выбора случайного числа с правильными вероятностями. Вы можете использовать sample для получения тех же результатов следующее:

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

Вы можете протестировать его самостоятельно, но я считаю, что это должно быть еще быстрее.

редактировать Теперь я протестировал его со следующим:

 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 еще быстрее и дает ускорение в 16,9 раза выше, чем у Джозилбера version2 .

Комментарии:

1. Как бы я продолжил создавать матрицу, столбцы которой представляют собой количество симуляций, и каждая симуляция генерирует 700 случайных чисел? Я пытался simu_matrix <- matrix(sample.int(5, size = 700, replace = TRUE, prob = c(.1,.3,.3,.2,.1)),nrow=700,ncol=1000) , но это генерирует те же 700 случайных чисел для каждого столбца.