2017-03-10 3 views
0

j'ai 4 types d'instructions, dites I1, I2, I3, I4, et je dois utiliser ces instructions dans un programme, selon les probabilités suivantes:
- avec 1 % de chance, j'utilise I1
- avec 85% de chance, j'utilise I2
- avec 7% de chance, j'utilise I3
- avec 7% de chance, j'utilise I4
(note: 1% + 85% + 7% + 7% = 100%)Comment vectoriser une boucle de conditions

Chaque instruction crée un point à 2 coordonnées (x, y) que j'empile dans une trame de données df.

Je sais que je peux le faire en utilisant le code suivant:

df <- c(0,0) 
for (i in 1:n) 
    { 
x <- sample(1:100, 1) 
if (x==1) { I1 } 
if (x>=2 & x<=86) { I2 } 
if (x>=87 & x<=93) { I3 } 
if (x>=94 & x<=100) { I4 } 
df <- rbind(df, c(x, y)) 
    } 

Mais cela est horriblement temps dans la mesure où « n » est pas petite. Je voudrais vectoriser le code, afin d'accélérer le traitement, mais je ne trouve pas comment.
Une idée?

POUR UNE COMPRÉHENSION COMPLÈTE: le programme vise à reproduire la fougère Barnsley.

A1 <- matrix(c(0,0,0,0.16), byrow=FALSE, ncol=2) 
V1 <- matrix(c(0,0), byrow=FALSE, ncol=1) 
A2 <- matrix(c(0.85,-0.04,0.04,0.85), byrow=FALSE, ncol=2) 
V2 <- matrix(c(0,1.6), byrow=FALSE, ncol=1) 
A3 <- matrix(c(0.2,0.23,-0.26,0.22), byrow=FALSE, ncol=2) 
V3 <- matrix(c(0,1.6), byrow=FALSE, ncol=1) 
A4 <- matrix(c(-0.15,0.26,0.28,0.24), byrow=FALSE, ncol=2) 
V4 <- matrix(c(0,0.44), byrow=FALSE, ncol=1) 

z1 <- matrix(c(0,0), byrow=FALSE, ncol=1) 

df <- as.data.frame(t(z1)) 

for (i in 1:1000) 
    { 
x <- sample(1:100, 1) 

if (x==1) { z2 <- A1%*%z1 + V1} 
if (x>=2 & x<=86) { z2 <- A2%*%z1 + V2} 
if (x>=87 & x<=93) { z2 <- A3%*%z1 + V3} 
if (x>=94 & x<=100) { z2 <- A4%*%z1 + V4} 

df <- rbind(df, t(z2)) 
z1 <- z2 
    } 

plot(df$V1, df$V2, xlab="", ylab="") 
+0

Regardez findInterval. Il y a beaucoup d'exemples travaillés sur SO. –

+1

La partie lente de votre code est probablement la partie 'rbind()', pas les instructions 'if'. Sans savoir exactement ce que sont ces «instructions», il est difficile de dire s'il y a une meilleure façon de vectoriser. Il est plus facile d'aider si vous fournissez une sorte de [exemple reproductible] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) avec des exemples de données d'entrée afin que nous puissions effectivement exécuter le code nous-mêmes. – MrFlick

Répondre

0

La fonction d'échantillonnage est susceptible d'être vectorisée. Voici un exemple simple qui pourrait s'appliquer à vos besoins.

n<- 100 
sampling<- sample(c(I1(), I2(), I3(), I4()), n, replace=TRUE, prob=c(1,85,7,7))  

df <- data.frame(x=1:n, y=sampling) 


#run these lines first 
#define your functions 
I1 <- function() { return(10)} 
I2 <- function() { return(20)} 
I3 <- function() { return(30)} 
I4 <- function() { return(40)} 

Cela devrait être tout ce dont vous avez besoin. N'oubliez pas de définir vos fonctions avant d'essayer d'évaluer la fonction de l'échantillon.

Remarque: après avoir lu, vous modifiez, les instructions ne sont pas constantes, mais varient en fonction de la valeur précédente, donc l'approche ci-dessus ne fonctionnera pas.

+0

Eh bien, j'ai essayé d'utiliser votre approche mais j'ai un "nombre de probabilités incorrect" ... – Andrew