2014-10-29 5 views
2
set.seed(1) 
n <- 100 
ret <- rnorm(n, 0, 0.02) 
ret[1] <- 0 
price <- cumprod(1+ret)*100 
maxi <- 0 
drawdown <- rep(0, n) 

for (i in 1 : n){ 
    maxi <- max(price[1 : i]) 
    drawdown[i] <- price[i]/maxi - 1 
} 

안녕하세요,R : 어떻게없이 회귀 계산하기위한 루프

는이 계산 속도를 빠르게 할 수 있습니까? 어쩌면 for-loop를 제거 할까?

감사

답변

6

R은 벡터화 cummax 기능을 가지고 있으며, 분열과 추가 작업은 벡터화되어 있습니다, 그래서 당신은 할 수 있습니다 :

price/cummax(price) - 1 

효율성을 비교하면 n <- 10000 :

library(microbenchmark) 
microbenchmark(
    OP= { 
    drawdown <- rep(0, n) 
    for (i in 1 : n){ 
     maxi <- max(price[1 : i]) 
     drawdown[i] <- price[i]/maxi - 1 
    } 
    }, 
    me={ 
    drawdown2 <- price/cummax(price) - 1 
    }, times=10) 

# Unit: microseconds 
# expr  min   lq  mean  median   uq  max neval 
# OP 456216.519 483387.361 536067.7521 550912.471 565453.555 663352.635 10 
# me  98.075 102.067 107.5978 105.203 112.331 127.726 10 

identical(drawdown, drawdown2) 
# [1] TRUE