#r #performance #loops
#r #Производительность #циклы
Вопрос:
То, что я пытаюсь сделать, это :
-
Сгенерируйте случайное число от 0 до 1
rand_number <- runif(1,0,1)
-
В зависимости от сгенерированного числа 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 случайных чисел для каждого столбца.