2014-07-07 2 views
1

Ce que je suis en train de faire est:meilleur moyen de construire cette boucle ifelse en R

  1. Générer un numéro Randon entre 0 et 1

    rand_number <- runif(1,0,1) 
    
  2. En fonction du nombre de Randon généré i atribute la valeur 1,2,3,4 ou 5 à la variable 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)))) 
    

Je répète cette simulation 1000 fois et je pense que l'utilisation d'ifelse n'est pas la meilleure façon d'atteindre cet objectif. Est-il possible d'éviter la boucle ifelse et d'améliorer les performances de cette partie du code? J'ai le code complet sur ce que j'essaie de faire (https://quant.stackexchange.com/questions/12868/kelly-capital-growth-investment-strategy-example-in-r) au cas où quelqu'un serait intéressé par le code complet.

+1

Je pense que «couper» peut être votre ami ici. –

+1

... ce qui suppose que vous passez à la création de tous les nombres aléatoires avec 'runif (1000,0,1)', plutôt qu'un seul à la fois, ce qui bien sûr sera terriblement lent. – joran

Répondre

2

J'ai repoussé les réponses de josilber parce que je pense que c'est très bien. Mais j'ajouterais simplement que vous échantillonnez réellement à partir d'une distribution discrète particulière où vous utilisez la variable aléatoire uniforme pour sélectionner le nombre aléatoire avec les probabilités correctes. Vous pouvez utiliser sample pour obtenir les mêmes résultats avec les éléments suivants:

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

Vous pouvez tester vous-même, mais je crois que cela devrait être encore plus rapide.

modifier Je l'ai maintenant testé avec les éléments suivants:

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 

Il semble que sample.int est encore plus rapide et le rendement d'une vitesse 16.9x à partir de version2 josilber.

+0

Comment pourrais-je continuer à créer une matrice dont les colonnes sont le nombre de simulations et chaque simulation génère 700 nombres aléatoires? J'ai essayé 'simu_matrix <- matrice (sample.int (5, taille = 700, replace = VRAI, prob = c (.1, .3, .3, .2, .1)), nrow = 700, ncol = 1000) ' Mais cela génère les mêmes 700 nombres aléatoires pour chaque colonne. – RiskTech

+0

Définissez 'size = 700000'. –

Questions connexes