2017-07-17 7 views
0

Ich simuliere Daten und füllen eine Matrix mit einer For-Schleife in R. Derzeit läuft der Loop langsamer als ich es möchte. Ich habe einige Arbeit geleistet, um einige der Variablen zu vektorisieren, um die Schleifengeschwindigkeit zu verbessern, aber es dauert noch einige Zeit. Ich glaube, dass der Teil der Schleife Dinge verlangsamt. Ich habe die Füllmatrizen effizienter untersucht, konnte aber mein aktuelles Problem nicht lösen. Schließlich wird dies als Teil einer glänzenden App verwendet, so dass alle von mir zugewiesenen Variablen leicht unterschiedliche Werte zugewiesen werden können.Beschleunigen Sie für die Schleife Daten zu Matrix in R

Jeder Ratschlag, die Schleife zu beschleunigen oder diese Schleife effizienter zu schreiben, würde sehr geschätzt werden. Hier

ist die Schleife:

#These variables are all specified because they need to change with different simulations 

num.sims <- 20 
time <- 50 
mat <- matrix(nrow = num.sims, ncol = time) 
x <- 1000 
init <- 0.5*x 
vec <- vector(length = x) 
ratio <- 1 
freq <- -0.4 
freq.vec <- numeric(nrow(mat)) 

## start a loop 
for (j in 1:num.sims) { 

vec[1:init] <- 1; vec[(init+1):x] <- 2 
year <- 2 

freq.vec[j] <- sum(vec==1)/x 


for (i in 1:(x*(time-1))) { 

freq.1 <- sum(vec==1)/x; freq.2 <- 1 - freq.1 
fit.ratio <- exp(freq*(freq.1-0.5) + log(ratio)) 
Pr.1 <- fit.ratio*freq.1/(fit.ratio*freq.1 + freq.2) 
vec[ceiling(x*runif(1))] <- sample(c(1,2), 1, prob=c(Pr.1,1-Pr.1)) 

## record data  
if (i %% x == 0) { 
    mat[j,year] <- sum(vec==1)/x 
    year <- year + 1 
}}} 

Antwort

0

Die innere Schleife ist, was Sie verlangsamt. Sie tun x Anzahl der Iterationen, um jede Zelle in der Matrix zu aktualisieren. Da jede Änderung von vec von der vorherigen Iteration abhängt, wäre dies schwierig zu vereinfachen. @Andrew Feierman ist wahrscheinlich richtig, dass dies von einer Verschiebung nach C++ profitieren würde, zumindest die vier Zeilen vor der if-Anweisung.

Alternativ dauert dies nur 10-20 Sekunden zu laufen. Es sei denn, Sie werden es skalieren oder mehrmals ausführen. Es lohnt sich daher nicht, es zu beschleunigen. Wenn Sie es unverändert lassen, können Sie eine Fortschrittsanzeige in Shiny setzen, damit der Benutzer weiß, dass die Dinge noch funktionieren.