On Sun, Jan 23, 2011 at 07:29:16PM -0800, eric wrote: > > Is there a way to vectorize this loop or a smarter way to do it ? > > y > [1] 0.003990746 -0.037664639 0.005397999 0.010415496 0.003500676 > [6] 0.001691775 0.008170774 0.011961998 -0.016879531 0.007284486 > [11] -0.015083581 -0.006645958 -0.013153103 0.028148639 -0.005724317 > [16] -0.027408025 0.014767422 -0.001619691 0.018334730 -0.009747171 > > x <-numeric(length(y)) > for (i in 1 :length(y)) { > x[i] <- ifelse( i==1, 10000*(1+y[i]), (1+y[i])*x[i-1]) > } > > x > [1] 10039.907 9661.758 9713.912 9815.087 9849.447 9866.110 9946.724 > [8] 10065.706 9895.802 9967.888 9817.536 9752.289 9624.016 9894.919 > [15] 9838.278 9568.630 9709.934 9694.207 9871.948 9775.724 > > Basically trying to see how the equity of an investment changes after each > return period. Start with $10,000 and a series of returns over time. Figure > out the equity after each time period (return).
Hello. The cycle computes a cumulative product. The initialization may be add as a common multiplier. So, z in the following should be equal to x up to the machine rounding error. y <- c( 0.003990746, -0.037664639, 0.005397999, 0.010415496, 0.003500676, 0.001691775, 0.008170774, 0.011961998, -0.016879531, 0.007284486, -0.015083581, -0.006645958, -0.013153103, 0.028148639, -0.005724317, -0.027408025, 0.014767422, -0.001619691, 0.018334730, -0.009747171) x <- numeric(length(y)) for (i in 1:length(y)) { x[i] <- ifelse(i==1, 10000*(1+y[i]), (1+y[i])*x[i-1]) } z <- 10000*cumprod(1 + y) max(abs(x - z)) # [1] 1.818989e-12 Petr Savicky. ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.